利用Matlab的find函数求顶点的坐标索引

利用Matlab的find函数求顶点的坐标索引,matlab,find,mesh,surface,vertex,Matlab,Find,Mesh,Surface,Vertex,我有一个包含曲面网格顶点的矩阵50943x3,我想用它的坐标(x,y,z)来找到某个顶点的索引 我尝试了Matlab函数find,但它返回一个0乘1的空矩阵 提前感谢, 干杯尝试以下方法: 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

我有一个包含曲面网格顶点的矩阵50943x3,我想用它的坐标(x,y,z)来找到某个顶点的索引

我尝试了Matlab函数find,但它返回一个0乘1的空矩阵

提前感谢,

干杯

尝试以下方法:

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-answer,它提供了一个获得最近点的解决方案,这似乎是最初寻求的

[min_dist,ind_nearest] = min(sum(bsxfun(@minus,mat,vec).^2,2)); % index to the nearest point
请尝试以下操作:

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-answer,它提供了一个获得最近点的解决方案,这似乎是最初寻求的

[min_dist,ind_nearest] = min(sum(bsxfun(@minus,mat,vec).^2,2)); % index to the nearest point

由于浮点舍入错误,您的尝试可能不起作用。你可以阅读更多关于它的内容。您可以查看,或者仅使用以下示例:

% Your matrix
M = randn(50943 , 3);

% The coordinates you are looking for
P = [0,0,0];

% Distance between all coordinates and target point
D = sqrt(sum((M - bsxfun(@minus,M,P)).^2,2));

% Closest coordinates to target
[~ , pos] = min(D);

% Display result
disp(M(pos , :))

由于浮点舍入错误,您的尝试可能不起作用。你可以阅读更多关于它的内容。您可以查看,或者仅使用以下示例:

% Your matrix
M = randn(50943 , 3);

% The coordinates you are looking for
P = [0,0,0];

% Distance between all coordinates and target point
D = sqrt(sum((M - bsxfun(@minus,M,P)).^2,2));

% Closest coordinates to target
[~ , pos] = min(D);

% Display result
disp(M(pos , :))

pos=find(DI使用了这个例子来理解它,但是它返回了一个矩阵维度必须在第
D=sqrt(sum((M-P)。^2,2))行一致的错误;
@amine可能是Matlab版本的问题;我更正了这个例子,使它与不自动展开矩阵的旧版本兼容。@Brice,OP想要找到从坐标中“找到某个顶点的索引”,而不是接近给定点的所有顶点。我认为解决方案应该只返回一个点!否则,是的,您的修改会起作用。@Zep,为了与R2016b之前版本的Matlab兼容,建议将
(M-P)
替换为
bsxfun(@减号,M,P)
而不是使用
repmat
。性能更好,代码更短。它向后兼容到R2007a版本。
pos=find(DI使用了这个示例来理解它,但它返回一个矩阵维度必须在
D=sqrt(sum((M-P)。^2,2))行处一致的错误;
@amine可能是Matlab版本的问题;我更正了该示例,使其与不自动展开矩阵的旧版本兼容。@Brice,OP想找到“查找某个顶点的索引”“从它的坐标来看,不是所有的顶点都靠近一个给定的点。我认为解决方案应该只返回一个点!否则,是的,你的修改会起作用。@Zep,为了挑剔,为了与R2016b之前版本的Matlab兼容,建议将
(M-P)
替换为
bsxfun(@减号,M,P)
而不是使用
repmat
。性能更好,代码更短。并且它向后兼容到R2007a版本。您应该发布代码以显示已尝试的内容。您应该发布代码以显示已尝试的内容非常感谢。现在,如果
repmat中不存在
vec
矩阵,如何获得最近的顶点?如果您想要最近的顶点,请使用@Zep的答案,计算距离并寻找最小值。此建议仅适用于精确匹配(因此,使用
randi
和整数坐标的示例)是的,它有效,谢谢你的两个建议,我会记住的。非常感谢,它有效。现在,如果
vec
mat
矩阵中不存在,如何获得最近的顶点?如果你想要最近的顶点,那么使用@Zep的答案,计算距离并寻找最小值。这个建议只适用于精确匹配(因此是带有
randi
和整数坐标的示例)是的,它很有效,谢谢你的两个建议,我会记住的