【问题标题】:Building adjacency matrix from faces array从面数组构建邻接矩阵
【发布时间】:2017-07-12 10:24:12
【问题描述】:

我正在使用这个工具箱中的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');

【问题讨论】:

    标签: matlab graph-theory mesh adjacency-matrix


    【解决方案1】:

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

    【讨论】:

      【解决方案2】:

      一段时间后遇到了类似的问题......在不同的环境中,但你可能仍然会发现我的经验很有用:

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

      在您的示例中尝试:

      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);
      

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

      【讨论】:

      • 我在这里给出的是我实际面孔数组的一小部分。实际上,faces= 3737x3 数组。确实,n 不等于面,因为在这种情况下,没有顶点是 5047。我实际上在我的问题中混淆了 n。将编辑它。无论如何,我会尝试你所说的,看看我得到了什么。 :) 谢谢。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2019-09-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多