Matlab:面片对象的邻接矩阵

Matlab:面片对象的邻接矩阵,matlab,graph,3d,adjacency-matrix,Matlab,Graph,3d,Adjacency Matrix,我有一个Matlab面片对象,其中Faces属性是一个顶点索引三元组列表,因此每行代表一个三角形面。例如: 293 13 1 433 13 293 293 294 433 434 433 294 在这种情况下,第一行定义在顶点1、13和293之间拉伸的面。我的实际矩阵有大约200000个顶点和400000个面 我想形成一个顶点邻接矩阵,例如,一个稀疏的二元方阵a s.t.Ai,j是真的,如果顶点I,j有一个共享面 在matlab中

我有一个Matlab面片对象,其中Faces属性是一个顶点索引三元组列表,因此每行代表一个三角形面。例如:

   293    13     1
   433    13   293
   293   294   433
   434   433   294
在这种情况下,第一行定义在顶点1、13和293之间拉伸的面。我的实际矩阵有大约200000个顶点和400000个面

我想形成一个顶点邻接矩阵,例如,一个稀疏的二元方阵a s.t.Ai,j是真的,如果顶点I,j有一个共享面

在matlab中有没有什么有效的方法?在每次迭代中搜索一个面的简单for循环是很慢的。

使用稀疏构造函数,让nv为您拥有的顶点数,然后

A = sparse( Faces(:,1), Faces(:,2), 1, nv, nv ) + ...
    sparse( Faces(:,2), Faces(:,3), 1, nv, nv ) + ...
    sparse( Faces(:,3), Faces(:,1), 1, nv, nv );
A = spfun( @(x) 1, A + A.' ); %// make it symmetric
使用稀疏构造函数,让nv为您拥有的顶点数,然后

A = sparse( Faces(:,1), Faces(:,2), 1, nv, nv ) + ...
    sparse( Faces(:,2), Faces(:,3), 1, nv, nv ) + ...
    sparse( Faces(:,3), Faces(:,1), 1, nv, nv );
A = spfun( @(x) 1, A + A.' ); %// make it symmetric

这可用于任意维简单数据:

halfedges = nchoosek(1:size(Faces,2), 2);
edges = [halfedges; fliplr(halfedges)];
A = logical(sparse(Faces(:,edges(:,1)), Faces(:,edges(:,2)), 1));
如果内存开销比速度更让您担心,您可以在边缘上循环:

nv = max(Faces(:)); % Get the maximum vertex id.

halfedges = nchoosek(1:size(Faces,2), 2);
edges = [halfedges; fliplr(halfedges)];
A = sparse(nv,nv);
for i = 1:size(edges,1)
    A = A | logical(sparse(Faces(:,edges(i,1)), Faces(:,edges(i,2)), 1, nv, nv));
end

另一种方法是构建三角测量对象,然后使用内置函数。

这可用于任意维度的简单数据:

halfedges = nchoosek(1:size(Faces,2), 2);
edges = [halfedges; fliplr(halfedges)];
A = logical(sparse(Faces(:,edges(:,1)), Faces(:,edges(:,2)), 1));
如果内存开销比速度更让您担心,您可以在边缘上循环:

nv = max(Faces(:)); % Get the maximum vertex id.

halfedges = nchoosek(1:size(Faces,2), 2);
edges = [halfedges; fliplr(halfedges)];
A = sparse(nv,nv);
for i = 1:size(edges,1)
    A = A | logical(sparse(Faces(:,edges(i,1)), Faces(:,edges(i,2)), 1, nv, nv));
end

另一种方法是构建一个三角测量对象,然后使用内置函数。

spfun真的比a=a+a快吗?'>0@路易斯门多我没有测试它,但我怀疑它是。spfun只对非零元素有效,而A+A.'>0实际上通过nv矩阵计算nv的所有条目。spfun真的比A=A+A.'>0;快吗@路易斯门多我没有测试它,但我怀疑它是。spfun仅适用于非零元素,而A+A.'>0实际上通过nv矩阵计算nv的所有条目。