Попробуйте следующее:
mat = randi(30,50943,3);
vec = [1,2,3];
% R2106b+ code
ind = find(all(mat==vec,2));
% or: explicit expansion, works with all versions
ind = find(all(bsxfun(@eq,mat,vec),2));
Что он делает: ==
или eq
проверяет, равны ли координаты (дает логическую матрицу [50943x3]) all
возвращает true, только если все координаты равны find
возвращает индекс всех ненулевых элементов
Это работает только для точного совпадения (отсюда целочисленные координаты, выбранные с помощью randi
).
Поскольку ответ уже принят, я добавлю ответ @Zep, который предлагает решение для получения ближайшей точки, которая, похоже, и была той, которую изначально искали.
[min_dist,ind_nearest] = min(sum(bsxfun(@minus,mat,vec).^2,2)); % index to the nearest point
19.11.2018
pos = find(D<tol);
, гдеtol
— подходящий допуск, также подойдет вместо[~ , pos] = min(D);
. Он успешно вернет 2 индекса, если есть две совпадающие точки, и пустой массив, если их нет, в то время какmin
всегда будет возвращать один индекс. Это зависит от того, можно ли ожидать этих случаев или нет, и что следует делать в этом случае. 19.11.2018D = sqrt(sum((M - P).^2,2));
19.11.2018(M-P)
наbsxfun(@minus,M,P)
, а не использоватьrepmat
. Производительность лучше, а код короче. И обратно совместим до версии R2007a. 19.11.2018