将边列表转换为邻接矩阵

时间:2015-07-29 11:22:52

标签: matlab adjacency-matrix

如果我在matlab中有以下代码

function adj=edgeL2adj(el)
nodes=sort(unique([el(:,1) el(:,2)])); % get all nodes, sorted
adj=zeros(numel(nodes));   % initialize adjacency matrix
% across all edges
for i=1:size(el,1);adj(find(nodes==el(i,1)),find(nodes==el(i,2)))=el(i,3);
end

将边缘列表m x 3转换为邻接列表n x n,但我有一个边缘列表矩阵m x 2,所以前面代码中的所需更改是什么,它给了我真实的结果。

示例:

if edge list =[1 2;2 3;2 4] then adjacency matrix=[0 1 0 0;0 0 1 1;0 0 0 0; 0 0 0 0]

2 个答案:

答案 0 :(得分:3)

我会亲自取消您的循环代码并利用sparse然后根据需要转换回full矩阵。第一列由源节点组成,第二列由目标节点组成。您只需将稀疏矩阵中的所有这些条目设置为1.但是,根据您的代码判断,边缘列表的第三列也是相应的权重,因此我将编写将承担两种情况的代码。另外,请确保使用unique过滤掉重复的行:

权重仅为1

的示例
edgelist = [1 2;2 3;2 4];
edgelist = unique(edgelist, 'rows');
sz = max(edgelist(:));
A = sparse(edgelist(:,1), edgelist(:,2), 1, sz, sz);

第一行代码表示边缘列表,其中每个行对由两个彼此入射的节点组成(即它们通过边连接)。第二行从边列表中删除任何重复的行。第三行确定邻接矩阵应该有多大。我们需要弄清楚最大的节点ID是什么,以便我们可以分配N x N稀疏矩阵,其中N是最大的节点ID。最后一行代码只使用边列表的第一列和第二列来填充稀疏矩阵中的条目,我们将它们设置为1,并确保矩阵的大小为N x N

我们得到了这个:

>> A

A =

   (1,2)        1
   (2,3)        1
   (2,4)        1

您可以选择使用full函数将矩阵转换为完整:

>> full(A)

ans =

     0     1     0     0
     0     0     1     1
     0     0     0     0
     0     0     0     0

如您所见,这符合您想要的结果。

第三列中的权重示例

edgelist = [1 2 0.1;2 3 0.2;2 4 0.3];
edgelist = unique(edgelist, 'rows');
sz = max(max(edgelist(:, 1:2)));
A = sparse(edgelist(:,1), edgelist(:,2), edgelist(:,3), sz, sz);

与以前相同的代码,但您要将第三个参数更改为sparse,并使用edgelist的第三列。

这就是我们得到的:

>> A

A =

   (1,2)       0.1000
   (2,3)       0.2000
   (2,4)       0.3000

>> full(A)

ans =

         0    0.1000         0         0
         0         0    0.2000    0.3000
         0         0         0         0
         0         0         0         0

答案 1 :(得分:-1)

邻接矩阵应该只包含布尔值,以指示顶点之间存在边。我认为这个函数假定System.out.println(arr2.getClass()); 的第三列是全部的。在评论中澄清说,也许它们实际上是权重。该功能也可以简化。这是修改过的代码:

el
相关问题