根据三角剖分建立连通图

时间:2018-09-07 09:34:42

标签: matlab performance graph-theory adjacency-matrix undirected-graph

TL; DR:我有一堆四面体,我想知道它的4个(或更少)相邻(面部共享)四面体中的哪个,我通过检查3D点来实现他们分享。这很慢。


我正在根据三角剖分建立连接图。该图的结构为[1]:

Graph.element.nodeId
             .neighbours
     .nodes.positions

并且三角剖分的输出具有2个矩阵,TRIpoints,第一个是Ntri x 4数组,在每一行中每个四面体都有节点ID,而第二个是点Npoint x 3大小的列表。

我目前正在按照以下代码构建图形,但是对于任何体面大小的网格来说,它的速度实在是太慢了。几乎需要花费所有时间的一行是find行(在代码中标记),这是当前元素的邻居所在的部分。

当前算法为每个四面体获取其所有节点,然后查找也包含这些相同节点的所有其他四面体。然后,它会滤除不包含与当前节点相同的3个相同节点的所有四面体,仅保留当前四面体的邻居。

function graph=trimesh2graph(TRI,points)
nD=size(points,2);
% preallocate.
graph.elements(size(TRI,1)).neighbours=[];


% For each element, find its node Ids and neighbouring elements
for ii=1:size(TRI,1)
    nodeids=TRI(ii,:);
    elem=[];
    for jj=1:(nD+1)
        [iind,~]=find(nodeids(jj)==TRI); % this is 80% of the time
        elem=[elem; iind];
    end
    u = unique(elem);

    % of all elements that have shared nodes with the current element, 
    % get only the ones that have 3 shared nodes.
    graph.elements(ii).neighbours = int32((u(histc(elem,u)==nD)));


   % some other code
end
% some other code

使用演示数据运行此脚本:

x = gallery('uniformdata',[30 1],0);
y = gallery('uniformdata',[30 1],1);
z = gallery('uniformdata',[30 1],2);
vertices=[x,y,z];
TRI= delaunay(x,y,z)
trimesh2graph(TRI,vertices);

如何提高此代码的性能?我期望这将需要一种不同的方法,而不仅仅是更快的命令。我看了一下voronoi图,但似乎仍然需要完成发现(find)。

注意:我不一定需要MATLAB代码,如果您知道可以解决问题的算法,请回答,我将在MATLAB中对其进行编码。


[1]是,最好将此信息存储在一维数组中。我将在稍后,但现在通过当前结构更容易理解。

1 个答案:

答案 0 :(得分:0)

啊,当然有一个内置的

如果使用delaunay()而不是具有自己类的较新版本,请这样做

neighbors(triangulation(TRI,points))

得到邻居。边界元素将具有NaN来填充矩阵。