我已经为一个函数编写了代码,该函数可以从三角表面找到所有连接的顶点。
曲面由顶点列表(VL) m x 3 和面列表(FL) n x 3 制成。 VL的每一行都是一个点(x y z)。
FL的每一行索引VL的三行。这三个点构成一个三角形。
function List = findVLInd(FL, StartingPoint)
List = StartingPoint;
for a = 1:50000
List = [List;find(List(a,1)==FL(:,1))];
List = [List;find(List(a,1)==FL(:,2))];
List = [List;find(List(a,1)==FL(:,3))];
Lz = FL(List,:);
List = [List;Lz(:,1);Lz(:,2);Lz(:,3)];
List = unique(List);
end
end
脚本运行后,有50,000个数字可用作VL的索引。
不幸的是,这确实很慢。可能是因为for循环以及每个循环不断增长的列表。任意设置数字50,000。我的FL大约有116,000行,但并非所有行都相互连接。
如何提高效率?
答案 0 :(得分:0)
在语法方面,我建议以下内容:
function List = findVLInd(FL, StartingPoint)
List = StartingPoint;
for a = 1:50000
List(end+1, :) = [find(List(a,1)==FL(:,1))];
find(List(a,1)==FL(:,2))];
find(List(a,1)==FL(:,3))];
Lz = FL(List,:);
List(end+1:end+size(Lz,1), :) = [Lz(:,1);Lz(:,2);Lz(:,3)];
List = unique(List);
end
end
这将删除重新分配操作List = [List; X]
,该操作将列表的内容复制到另一个变量中,然后将其删除(尽管新变量的名称与前一个相同),并用附加操作替换它,这很在Matlab中更快,但仍然很慢。通过在单个块中调用for
循环中的前三行,我还可以减少此类操作的次数。
根据ChrisLuengo和pacta-sunt-servanda的评论,您可能还需要解决其他问题,以改善代码的功能。