【问题标题】:matlab adjacency list to adjacency matrixmatlab邻接表到邻接矩阵
【发布时间】:2013-10-10 12:36:33
【问题描述】:

如何通过matab将邻接表转化为邻接矩阵

例如:这里是邻接表(无向),第三列是权重。

1 2 3
1 3 4
1 4 5
2 3 4
2 5 8
2 4 7

++++++++++++++++++++++++

应该转换为:

   1  2  3  4  5  

1     0  4  5  0   
2  3     4  7  8  
3  4  7     0  0  
4  0  7  0     0  
5  0  8  0  0

【问题讨论】:

  • 为什么对角线不是零?如果考虑无向连接,矩阵必须是对称的。
  • 我重新格式化了你的矩阵...是你想要的吗?为什么不是对称的?

标签: matlab adjacency-matrix


【解决方案1】:

您可以使用sparse 矩阵。让rows 成为第一列,cols 第二列,s 权重。

A = sparse([rows; cols],[cols; rows],[s; s]);

如果您想查看矩阵。使用full()

更新:

我将答案简化了一点(所有内容都在一行中,而不是按要求添加转置并包含解释:

list = [1 2 3
1 3 4
1 4 5
2 3 4
2 5 8
2 4 7];

rows = list(:,1)
cols = list(:,2)
s = list(:,3)

现在,rowscolss 包含所需的信息。稀疏矩阵需要三个向量。前两个向量rowscols的每一行都是s同一行给出的值的索引(也就是权重)。

sparse 命令将值s(k) 分配给矩阵元素adj_mat(rows(k),cols(k))

由于邻接矩阵是对称的,A(row,col) = A(col,row)。可以不做[rows; cols],而是先创建上三角矩阵,再加上转置矩阵,完成对称矩阵。

A = sparse([rows; cols],[cols; rows],[s; s]);    
full(A)

A = 
   0   3   4   5   0
   3   0   4   7   8
   4   4   0   0   0
   5   7   0   0   0
   0   8   0   0   0

【讨论】:

  • 能详细解释一下吗?
【解决方案2】:

真的很难说出你在问什么。是这样吗?

list = [1 2 3
1 3 4
1 4 5
2 3 4
2 5 8
2 4 7];


matrix = zeros(max(max(list(:, 1:2))));  %// Or just zeros(5) if you know you want a 5x5 result

matrix(sub2ind(size(matrix), list(:,1), list(:,2))) = list(:,3);  %// Populate the upper half
matrix = matrix + matrix'  %'// Find the lower half via symmetry

matrix =

   0   3   4   5   0
   3   0   4   7   8
   4   4   0   0   0
   5   7   0   0   0
   0   8   0   0   0

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-05-31
    • 1970-01-01
    • 2016-04-06
    • 2015-07-31
    • 2012-11-12
    • 2018-06-07
    相关资源
    最近更新 更多