我有一个快速的图论理论问题。
我在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行(每个唯一节点对一行)。
如果您能提供帮助,请与我们联系。提前谢谢!
答案 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
。我们将分别表示行和列列表。我们还将提取邻接矩阵,该矩阵是矩阵的其余部分。基本算法如下:
没有进一步的麻烦:
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