기본적으로 상관 관계 또는 공분산 계산을위한 모든 기본 제공 함수는 행렬을 반환합니다. 시드 영역과 다른 여러 영역 간의 상관 관계를 계산하는 효율적인 함수를 작성하려고하지만 다른 영역 간의 상관 관계는 필요하지 않습니다. 따라서 전체 상관 행렬을 계산하는 것이 비효율적이라고 가정합니다.MATLAB : 시드 영역과의 상관 관계
대신에 각 영역과 시드 영역 사이의 상관 행렬을 계산할 수 있습니다. 대각선을 벗어난 점 중 하나를 선택하여 저장하십시오. 그러나이 상황에서 루핑하는 것이 비효율적이라고 생각합니다.
더 구체적으로 말하면, 내 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.
이것은 매우 도움이되었습니다. 감사합니다! 그리고 당신이 내 설명과 코드에서 내 데이터의 본질을 추론했다는 사실은 좋은 추가 터치였습니다. –
글쎄, 나는 과거에 비슷한 문제에 대해 연구 해왔다. 그래서 추측하기는 쉽지 않았다. 도와 줘서 기뻐요! – cjh