从faces数组构建邻接矩阵

时间:2017-07-12 10:24:13

标签: matlab graph-theory mesh adjacency-matrix

我正在使用工具箱中使用的code来计算一组面的邻接矩阵。我的faces是一个m*3数组,例如:

23  13  12
12  22  23
13  4   12
23  14  13
22  35  23

根据我的理解,邻接矩阵应该是nxn矩阵,其中n是顶点数。对于我的一些网格.ply文件,我得到邻接矩阵,其尺寸小于顶点数。例如,n=5047但我的邻接矩阵的维度为nxn= 4719x4719

这种行为可能是什么原因?除了一些网格文件之外,我没有得到这个错误。

代码:

function A = triangulation2adjacency(face,vertex)
% triangulation2adjacency - compute the adjacency matrix
%   of a given triangulation.
%
%   A = triangulation2adjacency(face);
% or for getting a weighted graph
%   A = triangulation2adjacency(face,vertex);
%
%   Copyright (c) 2005 Gabriel Peyr


[tmp,face] = check_face_vertex([],face);
f = double(face)';

A = sparse([f(:,1); f(:,1); f(:,2); f(:,2); f(:,3); f(:,3)], ...
       [f(:,2); f(:,3); f(:,1); f(:,3); f(:,1); f(:,2)], ...
       1.0);
% avoid double links
A = double(A>0);

return; 


nvert = max(max(face));
nface = size(face,1);
A = spalloc(nvert,nvert,3*nface);

for i=1:nface
    for k=1:3
        kk = mod(k,3)+1;
        if nargin<2
            A(face(i,k),face(i,kk)) = 1;
        else
            v = vertex(:,face(i,k))-vertex(:,face(i,kk));
            A(face(i,k),face(i,kk)) = sqrt( sum(v.^2) );    % euclidean distance
        end
    end
end 
% make sure that all edges are symmetric
A = max(A,A');

2 个答案:

答案 0 :(得分:0)

在一个不同的背景下进入一个类似的问题...但是你的迁移仍然发现我的经验有用:

我的问题是误解n≠No.Faces。 n是顶点的数量,每个面可以有三个或更多。有些Faces共享顶点,这就是为什么n≠NoFaces。

在您的示例中尝试:

B=[23  13  12;...
  12  22  23;...
  13  4   12;...
  23  14  13;...
  22  35  23];

NoVert=numel(unique(B));
NoFace=size(B,2);

在邻接矩阵中,每个节点/顶点获得一个行/列,因此对于B,这将是7x7的矩阵。 如果节点没有连续编号,则会产生更大的矩阵;对于B,这将导致35x35矩阵,因为最高节点数为35。

有点偏离主题,但试试这个:

G = digraph([B(:,1);B(:,2);B(:,3)],[B(:,2);B(:,3);B(:,1)]);
A = adjacency(G);

您将获得具有更少代码的邻接矩阵。 (也许是时间,没有测试)

答案 1 :(得分:0)

您可以找到名为triangulation2adjacency的紧凑型函数here。 该图形工具箱对于3d网格和图形函数非常有用。