デフォルトでは、相関または共分散を計算するためのすべての組み込み関数は行列を返します。シード領域と他のさまざまな領域との間の相関を計算する効率的な関数を作成しようとしていますが、他の領域間の相関は必要ありません。したがって、完全な相関行列の計算は非効率的であると思います。
代わりに、各領域とシード領域の間の相関行列を計算し、対角線から外れた点の1つを選択して保存することもできますが、この状況でのループも非効率的だと感じます。
具体的には、3次元空間の各点に時間次元があります。特定のポイントと、特定の半径内の空間内のすべてのポイントとの間の平均相関を計算しようとしています。この手順を何十万回も、さまざまな半径の長さなどで繰り返したいので、これをできるだけ効率的にしたいと思います。
では、無視する相関を計算せずに、単一のベクトルと他のいくつかのベクトルの間の相関を計算するための最良の方法は何ですか?
ありがとう、クリス
編集:これが私のコードです...
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.