我有两个非常大的矩阵(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));
答案 0 :(得分:1)
如果您阅读documentation,则会发现corr
计算列之间的相关性,而不是行。
要将行转换为列和列成行,只需转置矩阵:
tmp1 = vec1_preprocess';
tmp2 = vec2_preprocess';
C = corr(tmp1,tmp2);
答案 1 :(得分:1)
由于您没有发布代码,我认为您的自定义函数calculate_p
和effdf
已经过完美优化,并不代表您脚本的瓶颈。让我们专注于我们拥有的东西。
我看到的第一个问题是:
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
以查看它是否会产生更好的效果。
最后但并非最不重要(实际上这是最重要的事情):你有没有理由一行一行地执行这个计算而不是在整个矩阵上运行它?