快速计算逐行矩阵相关的方法

时间:2018-01-07 10:44:13

标签: matlab matrix correlation

我有两个非常大的矩阵(228453x460),我想计算行之间的相关性。

for i=1:228453
    if(vec1_preprocess(i,1))
        for j=1:228453
            df = effdf(vec1_preprocess(i,:)',vec2_preprocess(j,:)');
            corr_temp = corr(vec1_preprocess(i,:)', vec2_preprocess(j,:)');
            p = calculate_p(corr_temp, df);
            temp = (meanVec(i)+p)/2;
            meanVec(i) = temp;
        end
        disp(i);
    end
end

这需要~1天。是否有直接计算方法?

修改effdf的代码

function df = effdf(ts1,ts2);
%function df = effdf(ts1,ts2);

    ts1=ts1-mean(ts1);
    ts2=ts2-mean(ts2);
    N=length(ts1);

    ac1=xcorr(ts1); 
    ac1=ac1/max(ac1); % normalized autocorrelation
    ac1=ac1(((length(ac1)+3)/2):((length(ac1)+3)/2+floor(N/4)));

    ac2=xcorr(ts2); 
    ac2=ac2/max(ac2); % normalized autocorrelation 
    ac2=ac2(((length(ac2)+3)/2):((length(ac2)+3)/2+floor(N/4)));

    df = 1/((1/N)+(2/N)*sum(((N-(1:length(ac1)))/N)'.*ac1.*ac2));

2 个答案:

答案 0 :(得分:1)

如果您阅读documentation,则会发现corr计算列之间的相关性,而不是行。

要将行转换为列和列成行,只需转置矩阵:

tmp1 = vec1_preprocess';
tmp2 = vec2_preprocess';
C = corr(tmp1,tmp2);

答案 1 :(得分:1)

由于您没有发布代码,我认为您的自定义函数calculate_peffdf已经过完美优化,并不代表您脚本的瓶颈。让我们专注于我们拥有的东西。

我看到的第一个问题是:

if (vec1_preprocess(i,1))

检查228453次迭代可以明显增加运行时间。因此,只提取第一列中不包含0的矩阵行,并对这些行进行计算:

idx = vec1_preprocess(:,1) ~= 0;
vec1_preprocess = vec1_preprocess(idx,:);

for i = 1:size(vec1_preprocess,1)
    % ...
end

第二个问题是corr。您似乎也在使用calculate_p来计算p值。为什么不使用函数返回的内置p值作为第二个输出参数?

[c,p] = corr(A,B);

或者,如果您正在寻找Pearson的相关性,则可以将corr替换为corrcoef以查看它是否会产生更好的效果。

最后但并非最不重要(实际上这是最重要的事情):你有没有理由一行一行地执行这个计算而不是在整个矩阵上运行它?