我想计算一组三角形的每个重心(质心)。到目前为止,我已经成功写了这么多:
function Triangle_Source_Centroid(V_Epoch0, F_Epoch0)
for i = 1:length(F_Epoch0)
Centroid_X = F_Epoch0(V_Epoch0(:,1),1) + F_Epoch0(V_Epoch0(:,1),2) + F_Epoch0(V_Epoch0(:,1),3);
Centroid_Y = F_Epoch0(V_Epoch0(:,2),1) + F_Epoch0(V_Epoch0(:,2),2) + F_Epoch0(V_Epoch0(:,2),3);
Centroid_Z = F_Epoch0(V_Epoch0(:,3),1) + F_Epoch0(V_Epoch0(:,3),2) + F_Epoch0(V_Epoch0(:,3),3);
Triangle_Centroid = [Centroid_X; Centroid_Y; Centroid_Z];
end
end
它不起作用,只给我一个错误信息:
Subscript indices must either be real positive integers or logicals.
答案 0 :(得分:2)
考虑到如何命名变量,我猜测V_Epoch0
是一个N×3的顶点矩阵(列的X,Y和Z),而F_Epoch0
是M-by-3面部索引矩阵(每行是V_Epoch0
的一组行索引,显示每个三角形的哪些点)。假设这是对的......
在这种情况下,您可以通过使用matrix indexing来避免使用for循环。例如,要获取F_Epoch0
中每个点的X坐标,您可以执行以下操作:
allX = reshape(V_Epoch0(F_Epoch0, 1), size(F_Epoch0));
然后你可以在列之间取mean来获得每个三角形面的平均X坐标:
meanX = mean(allX, 2);
meanX
现在是M-by-1列向量。然后,您可以对Y和Z坐标重复此操作:
allY = reshape(V_Epoch0(F_Epoch0, 2), size(F_Epoch0));
meanY = mean(allY, 2);
allZ = reshape(V_Epoch0(F_Epoch0, 3), size(F_Epoch0));
meanZ = mean(allZ, 2);
centroids = [meanX meanY meanZ];
并且centroids
是三角形质心坐标的M×3矩阵。
<强>加成:强>
以上所有内容实际上只需要这一行就可以完成:
centroids = squeeze(mean(reshape(V_Epoch0(F_Epoch0, :), [size(F_Epoch0, 1) 3 3]), 2));
查看multidimensional arrays的文档,详细了解其工作原理。