2013-04-24 3 views
2

각 픽셀 위치에 대한 길이 벡터 M 인 이미지 인 KxLxM 행렬 A가 있습니다. 필자는 특징 벡터 v, 길이 M을 가지고 있습니다. 이미지 A의 각 픽셀 위치에서 픽셀의 특징 벡터와 내 특징 벡터 v의 상관 관계를 계산하려고합니다.matlab에서 벡터와 3d 행렬의 상관 관계

나는이 작업을 이미 루프를 사용하여 수행했습니다 ,하지만 루프 matlab에서 느립니다. 누구든지 이것을 벡터화하는 방법에 대한 제안을 가지고 있습니까?

function test() 
A = rand(4,5,3); 
v = [1 2 3]; 
c = somecorr(A, v); 
size(c) 

function c = somecorr(a,v) 
c = a(:,:,1).*0; 
for y = 1:size(a,1) 
    for x = 1:size(a,2) 
     c(y,x) = corr2(squeeze(a(y,x,1:length(v)))',v); 
    end 
end 

>>test() 
ans = 

4  5 
+2

나는 그것이 MATLAB의 루프가 느린 경우였던 것으로 생각한다. 하지만 요즘에는 Just In Time 편집의 힘으로 인해 더 이상 반드시 사실이 아닙니다. [링크] (http://www.matlabtips.com/matlab-is-no-longer-slow-at-for-loops/) – sietschie

답변

2

당신이 시도하고 볼 수 있다면 그 속도 :

function c = somecorr2(a,v) 

    as = reshape(a,size(a,1)*size(a,2),size(a,3)); 
    cs = corr(as',v'); 
    c = reshape(cs,size(a,1),size(a,2)); 
    size(c) 

나는 단지 몇 가지 작은 테스트를했지만 더 이상의 100 배 빠른 것 같다. 적어도 내 테스트 경우에. 나는 다음과 같은 런타임을 얻을 100x100x3 행렬

function C = manualCorr(A,B) 
    An=bsxfun(@minus,A,mean(A,1)); %%% zero-mean 
    Bn=bsxfun(@minus,B,mean(B,1)); %%% zero-mean 
    An=bsxfun(@times,An,1./sqrt(sum(An.^2,1))); %% L2-normalization 
    Bn=bsxfun(@times,Bn,1./sqrt(sum(Bn.^2,1))); %% L2-normalization 
    C=sum(An.*repmat(Bn,1,size(An,2)),1); %% correlation 

: 당신은 'CORR'기능이없는 경우 당신이에 사용할 수 있습니다

이 [답] ( What is a fast way to compute column by column correlation in matlab)에서 영감을

사용자 버전 : 1.643065 초. 광산에서 'corr': 0.007191 초. 광산에서 'manualCorr': 0.006206 초.

저는 Matlab R2012a를 사용하고있었습니다.

+0

btw'reshape (a, size (a, 1) * size (a, 2 – Dan

+0

매트, matlab (2007b)의 오히려 오래된 버전은 함수를 가지고 있지 않다. (크기는 (a, 3)); . 그러나 나는 당신의 요점을 본다. 나는 그것을 시도 할 것이다 – Goosebumps

+0

그것은 그것이 약 3 분의 1 더 빠르다는 것을 보인다. 그것은 이미 좋은 이득입니다. – Goosebumps