从邻接矩阵创建坐标数组 - Matlab

时间:2014-07-16 22:14:50

标签: matlab coordinates graph-theory adjacency-matrix

我有一个快速的图论理论问题。

我在Matlab中有一个13 x 13的邻接矩阵。我已经只采用了较低的对角线(这是一个无向图)并从单位矩阵中减去(所以没有边缘将节点连接到自身)。然后我在左边添加了一列,在顶部添加了一行,其中包含四个节点的ID号。得到的14 x 14邻接矩阵如下所示:

A = 

    0   1   1   1   1   2   2   2   3   3   3   4   4   4
    1   0   0   0   0   0   0   0   0   0   0   0   0   0
    1   0   0   0   0   0   0   0   0   0   0   0   0   0
    1   0   0   0   0   0   0   0   0   0   0   0   0   0
    1   0   0   0   0   0   0   0   0   0   0   0   0   0
    2   1   0   0   0   0   0   0   0   0   0   0   0   0
    2   0   0   0   0   0   0   0   0   0   0   0   0   0
    2   0   0   0   0   0   0   0   0   0   0   0   0   0
    3   0   0   1   0   0   0   0   0   0   0   0   0   0
    3   0   0   0   0   0   0   0   0   0   0   0   0   0
    3   0   1   0   0   0   0   0   0   0   0   0   0   0
    4   1   0   0   0   1   0   0   0   0   0   0   0   0
    4   0   0   0   1   0   0   0   0   0   0   0   0   0
    4   0   0   0   0   0   0   1   0   0   0   0   0   0

如何从中创建坐标数组?我知道结果应该有7行(每个唯一节点对一行)。

如果您能提供帮助,请与我们联系。提前谢谢!

2 个答案:

答案 0 :(得分:1)

看来你想要的是:

[ii, jj] = find(A(2:end,2:end)); %// row and col indices of ones in inner matrix
result = [ A(ii+1,1) A(1,jj+1).' ]; %'// node numbers corresponding to ii and jj

在你的例子中,这给出了

result =
     2     1
     4     1
     3     1
     3     1
     4     1
     4     2
     4     2

如果您需要唯一的行:

result = unique(result, 'rows');

给出了

result =

     2     1
     3     1
     4     1
     4     2

答案 1 :(得分:1)

我们可以使用第一行和第一列提供的节点ID来帮助我们创建节点邻接列表。我们需要做的是拆分变量,以便我们分离第一行,称为rowList和第一列colList。我们将分别表示行和列列表。我们还将提取邻接矩阵,该矩阵是矩阵的其余部分。基本算法如下:

  1. 在邻接矩阵中查找非零的行和列。
  2. 使用这些行和列来索引相应的行和列列表并吐出一个坐标数组。
  3. 没有进一步的麻烦:

    rowList = A(2:end,1);
    colList = A(1,2:end).';
    AdjMatr = A(2:end,2:end);
    [nonZeroRows, nonZeroCols] = find(AdjMatr);
    nodeList = [rowList(nonZeroRows) colList(nonZeroCols)];
    

    输出因此给出:

    nodeList =
    
     2     1
     4     1
     3     1
     3     1
     4     1
     4     2
     4     2
    

    这个答案当然没有给出独特的行,并产生重复。如果您希望拥有唯一的行,请考虑:

    nodeListUnique = unique(nodeList, 'rows');
    

    输出结果为:

    nodeListUnique =
    
     2     1
     3     1
     4     1
     4     2