【问题标题】:Counting average on huge matrix with conditional计算带有条件的巨大矩阵的平均值
【发布时间】:2016-06-28 04:58:24
【问题描述】:

以下 MATLAB 代码在 10^5 方阵 A 上永远运行。但是,它在 10^3 方阵上运行几秒钟。有什么办法可以加快速度吗?

function [meanNV]=calcMeanNV_k(A,V,d)
%A: input matrix (n x n)
%V: eigenvectors of k-th largest eigenvalues (n x 1)
%d: degrees of each node (n x 1)
%meanNV: mean of neighbors vectors (n x 1)
m=size(A,2);
meanNV=zeros(113336);
 for i=1:m
     sumNode = 0;
     for j=1:m
        if A(i,j)==1
            sumNode=sumNode+V(j);
        end
     end
    [meanNV(i)]=sumNode/d(i); 
 end

【问题讨论】:

    标签: matlab matrix average


    【解决方案1】:

    简单地说,对于A 中的每一行,您正在确定非零位置,并使用这些索引对V 中的相应位置求和,然后除以d 中的相应条目。

    首先使用find 确定非零行和列位置,然后使用accumarray 将所有列位置按它们的公共行分组,并且应用于accumarray 的函数只需对所有索引求和一次你索引到V

    这样的事情可能会起作用:

    function [meanNV]=calcMeanNV_k1(A,V,d)
    %A: input matrix (n x n)
    %V: eigenvectors of k-th largest eigenvalues (n x 1)
    %d: degrees of each node (n x 1)
    %meanNV: mean of neighbors vectors (n x 1)
    
    m=size(A,2);
    [row,col] = find(A); % Find non-zero entries in A
    meanNV = accumarray(row, col, [m 1], @(x) sum(V(x))) ./ d; % Compute desired result
    
    end
    

    【讨论】:

    • 嗨@rayryeng,感谢您的帮助。我在前面的代码中犯了一个错误。 sumNode=0的初始化;应该在内部 for 循环之外。 A 表示节点之间的链接。如果节点 i 和 j 相连,则 A(i,j) = 1。否则,A(i,j) = 0。我想得到 i 的相邻节点的所有特征向量的平均值。邻居节点是与节点 i 有连接的所有节点,其中 A(i,j) = 1。它应该在 A 中的相应位置累积所有具有 1 的 V(j)。然后将总和除以 d(i)。 d(i) 表示来自节点 i 的连接度/总数。谢谢。
    【解决方案2】:

    这行得通:

    function [meanNV]=calcMeanNV_k1(A,V,d)
    %A: input matrix (n x n)
    %V: eigenvectors of k-th largest eigenvalues (n x 1)
    %d: degrees of each node (n x 1)
    %meanNV: mean of neighbors vectors (n x 1)
    tic
    m=size(A,2);
    meanNV=zeros(m,1);
    idx = A == 1;
    for k = 1:m
       meanNV = sum(V(idx(k,:)));
    end
    meanNV = meanNV./d;
    toc
    

    【讨论】:

    • 我想写一个不使用循环的答案....我可以保证更快。你想看看吗?
    • 当然。这需要 10 分钟才能运行。
    • 感谢您的接受!我写的代码能快多少?
    • 运行仅需 2 秒。谢谢。
    • 这太疯狂了。这一定意味着您的矩阵必须非常稀疏才能从 10 分钟减少到 2 秒。很高兴听到!
    猜你喜欢
    • 1970-01-01
    • 2017-11-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-10-27
    • 1970-01-01
    • 2014-01-21
    相关资源
    最近更新 更多