【问题标题】:Calculating the degree matrix having the sparse representation of the adjacency matrix计算具有邻接矩阵稀疏表示的度矩阵
【发布时间】:2014-06-19 09:47:39
【问题描述】:

我正在尝试计算图的拉普拉斯矩阵。我计算了邻接矩阵的稀疏表示,它存储在一个维度为 Nx3 的文本文件中。 N 节点的大小(第 i 个节点的第 j 个节点权重)。我在 Matlab 中用adj = spconvert(adj); 打开这个文件。下一步是计算这个稀疏矩阵的度矩阵,以便执行操作L = D - adj。如何计算以图的稀疏邻接矩阵为输入的度矩阵?为了计算度数矩阵,我计算每个节点的度数:

for i=1:n % size of the node
    degree(i) =  length(find(adj(:,1) == i & adj(:,3) == 1));
end

但是,如何执行 D 和 A 的减法?

【问题讨论】:

    标签: matlab sparse-matrix adjacency-matrix


    【解决方案1】:

    使用spdiags 函数将度向量转换为稀疏对角矩阵。然后从对角矩阵中减去邻接矩阵得到拉普拉斯算子。使用您的代码的示例:

    adj = spconvert(adj);
    for i=1:size(adj, 1)
        degree(i) = CalcDegree(adj, i)
    end
    D = spdiags(degree, 0, size(adj, 1), size(adj, 2));
    L = D - adj;
    

    顺便说一下,你计算节点度的代码可能不正确。

    【讨论】:

    • 度矩阵大小是节点的大小。但是 adj 矩阵具有不同的大小,即边数。使用 CalcDegree 我猜你的意思是我的方法。我遇到了 spdiags 的问题???索引超出矩阵维度。 ==> spdiags 在 114 处出错 a((len(k)+1):len(k+1),:) = [i i+d(k) B(i+(m>=n)*d(k ),k)];
    • 你的计算节点度的代码适合文本文件中邻接矩阵的3列表示,而不是用spconvert解析文本文件后的表示,应该是行数的矩阵和列等于顶点的数量,而不是边的数量(en.wikipedia.org/wiki/Adjacency_matrix)。这也应该是您得到不正确尺寸的原因。
    • 是的,你是对的,但我计算了邻接矩阵的稀疏表示。因此,我没有一个 NxN 矩阵,而是拥有一组活动的边。
    • 不需要。 Matlab 在其稀疏矩阵对象类型中有效地存储稀疏矩阵,您可以使用 spconvert 获得。
    • 好的,我喜欢你的评论,但是必须使用初始稀疏表示来计算度数?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2023-02-04
    • 2015-12-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-02-06
    相关资源
    最近更新 更多