【问题标题】:Creating a weight adjacency matrix创建权重邻接矩阵
【发布时间】:2016-04-04 15:35:37
【问题描述】:

我需要为图的边缘分配权重,来自以下论文:

L. Xiao 和 S. Boyd 的“分布式平均的快速线性迭代” S. Boyd 的“图拉普拉斯特征值的凸优化”

我的图有邻接矩阵(50 x 50 矩阵),有 512 个非零值。

我还有一个具有最佳权重的 256 x 1 向量。

对于我正在使用的软件,我需要一个 50 x 50 的矩阵,边 (i,j) 的权重位于邻接矩阵的相关位置(边 (j,i) 的符号相反) .

我的尝试在下面,但我无法让它工作。

function weights = construct_weight_mtx(weight_list, Adj)

weights = zeros(size(Adj));
positions = find(Adj);

for i=1:length(positions)/2
    if Adj(i) == 1
        weights(i) = weight_list(i);
    end
end

weights = weights - weights';

find(Adj) == find(weights);

end 

【问题讨论】:

  • 你有几个问题,我可以解决大部分问题,但你为什么要减去weights - weights'?你真的希望一个方向的权重是相反方向的权重的负数吗?
  • @beaker 是的 - 我确实希望权重在相反方向上为负数。
  • 大声笑......你实际上在描述中说过......我的错

标签: matlab graph


【解决方案1】:

您正在原始邻接矩阵中找到非零位置,但您正在找到它们中的所有。为了解决这个问题,您只需占据这些职位的前半部分。

for i=1:length(positions)/2 ...

不幸的是,这会从完整的列中获取索引,而不仅仅是对角线下方的位置。因此,如果您的矩阵全为 1,您将采用:

1 1 1 0 0 ...
1 1 1 0 0 ...
1 1 1 0 0 ...
...

代替:

1 0 0 0 0 ...
1 1 0 0 0 ...
1 1 1 0 0 ...
...

要取正确的值,我们只需取Adj 的下三角部分,然后找到它的非零位置:

positions = find(tril(Adj));

现在我们只有对角线下方的 256 个位置,我们可以遍历所有位置。接下来,我们需要修复循环中的赋值:

for i=1:length(positions)
    if Adj(i) == 1   %// we already know Adj(i) == 1 for all indices in positions
        weights(i) = weight_list(i);   %// we need to update weights(positions(i))
    end
end

这样就变成了:

for i=1:length(positions)
    weights(positions(i)) = weight_list(i);
end

但如果我们所做的只是将 256 个值分配给 256 个位置,我们可以在没有 for 循环的情况下做到这一点:

weights(position) = weight_list;

请注意,weight_list 的元素必须按照正确的顺序排列,下三角部分的非零元素按列排序。


完成的代码:

function weights = construct_weight_mtx(weight_list, Adj)

weights = zeros(size(Adj));
positions = find(tril(Adj));

weights(positions) = weight_list;

weights = weights - weights.';   %// ' is complex conjugate; not a big deal here, but something to know

find(Adj) == find(weights);   %// Not sure what this is meant to do; maybe an assert?

end 

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-07-10
    • 2014-04-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多