我有所有边的矢量,例如
A = [1;2;3;4];
我还有连接这些边缘的所有链接的矩阵,例如边缘数字
B = [1 3;3 1;1 2;1 2;2 3;4 3];
我想用这些数据构建邻接矩阵。矩阵不应考虑链路中边缘的排序。例如,第二个链路具有边缘1 2,但矩阵应在1,2和2,1中都有条目。 所以我需要像这样的输出
C = [0 1 1 0;1 0 1 0;1 1 0 1;0 0 1 0];
除了对B的大小使用for循环然后在B中找到每个链接的egdes然后在i,j处添加1到预先初始化的4x4矩阵之外,我想不出任何其他方式。其中i,j是链接边缘。
这是一种有效的方式吗,因为我的实际尺寸大于4?有人可以用更好的方法构建矩阵吗?
答案 0 :(得分:2)
您可以使用sparse
构建矩阵,然后可以选择转换为full
:
result = full(sparse(B(:,1), B(:,2), 1)); % accumulate values
result = result | result.'; % make symmetric with 0/1 values
等效地,您可以使用accumarray
:
result = accumarray(B, 1); % accumulate values
result = result | result.'; % make symmetric with 0/1 values
对于A = [1;2;3;4]; B = [1 3;3 1;1 2;1 2;2 3;4 3]
,上述任何一个都给出了
result =
4×4 logical array
0 1 1 0
1 0 1 0
1 1 0 1
0 0 1 0