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