默認情況下,所有用於計算相關性或協方差的內置函數返回一個矩陣。我試圖編寫一個有效的函數來計算種子區域和其他各個區域之間的相關性,但我不需要其他區域之間的相關性。我假設計算全相關矩陣因此效率不高。MATLAB:與種子區域的相關
我可以改爲計算每個區域和種子區域之間的相關矩陣,選擇一個非對角點並存儲它,但我覺得在這種情況下循環也是低效的。
更具體地說,我的三維空間中的每個點都有一個時間維度。我試圖計算給定點與給定半徑內所有空間點之間的平均相關性。我想重複這個過程數十萬次,對於許多不同的半徑長度,等等,所以我希望這樣做盡可能高效。
那麼,計算單個向量和其他幾個向量之間的相關性的最佳方法是什麼,而不計算我將忽略的相關性?
謝謝 克里斯
編輯:這裏是我的代碼現在...
function [corrMap] = TIME_meanCorrMap(A,radius)
% Even though the variable is "radius", we work with cubes for simplicity...
% So, the radius is the distance (in voxels) from the center of the cube an edge.
denom = ((radius*2)^3)-1;
dim = size(A);
corrMap = zeros(dim(1:3));
for x = radius+1:dim(1)-radius
rx = [x-radius : x+radius];
for y = radius+1:dim(2)-radius
ry = [y-radius : y+radius];
for z = radius+1:dim(3)-radius
rz = [z-radius : z+radius];
corrCoefs = zeros(1,denom);
seed = A(x,y,z,:);
i=0;
for xx = rx
for yy = ry
for zz = rz
if ~all([x y z] == [xx yy zz])
i = i + 1;
temp = corrcoef(seed,A(xx,yy,zz,:));
corrCoeffs(i) = temp(1,2);
end
end
end
end
corrMap = mean(corrCoeffs);
end
end
end
編輯:這裏有一些更多的時間來補充公認的答案。 使用bsxfun()做歸一化,和矩陣乘法來計算相關性:
tic; for i=1:10000
x=rand(100);
xz = bsxfun(@rdivide,bsxfun(@minus,x,mean(x)),std(x));
cc = xz(:,2:end)' * xz(:,1) ./ 99;
end; toc
Elapsed time is 6.928251 seconds.
使用zscore()來歸一化,矩陣乘法來計算相關性:
tic; for i=1:10000
x=rand(100);
xz = zscore(x);
cc = xz(:,2:end)' * xz(:,1) ./ 99;
end; toc
Elapsed time is 7.040677 seconds.
使用bsxfun()來歸一化,和corr()來計算相關性。
tic; for i=1:10000
x=rand(100);
xz = bsxfun(@rdivide,bsxfun(@minus,x,mean(x)),std(x));
cc = corr(x(:,1),x(:,2:end));
end; toc
Elapsed time is 11.385707 seconds.
這非常有幫助,謝謝!事實上,你從我的描述和代碼中推導出我的數據的性質是一個很好的添加觸摸。 –
嗯,我過去曾經研究過類似的問題,所以猜測並不太可能。樂意效勞! – cjh