默认情况下,所有用于计算相关性或协方差的内置函数都返回一个矩阵。我正在尝试编写一个有效的函数来计算种子区域和其他各种区域之间的相关性,但我不需要其他区域之间的相关性。我假设计算完整的相关矩阵因此效率低下。
我可以改为计算每个区域和种子区域之间的相关矩阵,选择一个非对角点并存储它,但我觉得在这种情况下循环也效率低下。
更具体地说,我的 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.