【问题标题】:How to find adjacency matrix given a set of links and edges in matlab如何在matlab中给定一组链接和边找到邻接矩阵
【发布时间】:2016-10-20 10:22:54
【问题描述】:

例如,我有所有边的向量

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 处的预初始化 4x4 矩阵中添加 1 之外,我想不出任何其他方法,其中 i,j是链接边缘。

这是一种有效的方法吗,因为我的实际尺寸比 4 大很多?有人可以提供更好的方法来构建矩阵吗?

【问题讨论】:

    标签: arrays matlab matrix graph-theory adjacency-matrix


    【解决方案1】:

    您可以使用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
    

    【讨论】:

    • 感谢您的回答。但我对这个问题做了一些修改。无论链接的顺序如何,我都需要矩阵有一个条目。
    • 你说矩阵不应该考虑链接中边的顺序 但是你怎么知道每个边使用哪个顺序呢?你会出现两次以上的无序边吗?如果只出现一次,是否应该颠倒顺序?我的意思是,给定B = [1 3; 1 2],结果应该是C=[0 1 1],还是C=[0 0 1;1 0 0],还是...?
    • 很抱歉给您带来了困惑。通过排序,我的意思是根据边缘对链接的描述。所以如果B = [1 3;1 2],其他描述B = [3 1;2 1]也应该考虑构造C。所以在这种情况下 C = [0 1 1;1 0 0;1 0 0] 。我需要的是,如果一对边之间存在链接,则矩阵应包含 (i,j) 和 (j,i) 的 1。希望这已经说清楚了!
    • 这也适用于其他输入吗?因为使用输入A = [102; 230; 56; 42] and B = [102 56;56 102;102 230;102 230;230 56;42 56]; 我得到以下错误! 使用稀疏索引时出错超出矩阵维度。
    • @EyesOfÖzil 我错误地解释了所需的大小。请立即尝试编辑答案
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-03-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多