2013-03-28 1 views
3

저는 벡터 y와 벡터 x1, x2, ..., x50을 가지고 있습니다. 나는 각각의 x 벡터와 y를 상관 시키거나 컨볼 루션 할 필요가있다. 현재 FOR 루프에서이 작업을 수행하고 있지만 속도가 느리고 한 번에 수행 할 방법을 찾으려고합니다. This help page에는 여러 채널 (내가해야하는 것처럼 보임)과의 상관 관계에 대한 섹션이 있지만 자기 상관에 대해서만 이야기합니다. xcorr 함수를 벡터와 행렬 (x 벡터를 나란히 놓는 행렬)과 함께 사용하려고 시도했지만 작동하지 않습니다. 어떤 힌트?Matlab : 하나의 벡터를 다른 많은 벡터와 곱하거나 연관시키기

감사합니다.

+0

'y_expanded = repmat (y, 1, 50); xc = xcorr (x, y_expanded)'(사실,'bsxfun (@xcorr, x, y)'가 트릭을 할 수 있다고 생각합니다.) 그것은 궁극적으로 벡터의 각 쌍에 대한 계산을 수행하는 궁극적으로 여전히 루프가 필요하다는 것을 확신하지 ... – wakjah

+0

@wakjah xcorr (x, y_expanded)를 시도하면 "B는 반드시 있어야합니다. 벡터 "오류. 이 함수는 실제로 행렬을 인수로 받아 들일 수없는 것 같습니다. bsxfun은 "잘못된 출력 크기"오류를 표시합니다. xcorr이 사용할 유효한 함수인지 확실하지 않습니다. – Jordan

+0

@Jordan 몇 개의 벡터가 있습니까? 벡터 중 하나를 행렬에 패딩하고 'FFT2'를 호출하여 컨볼 루션을 수행 할 수 있습니다. 그것은 기억의 낭비이지만 그만큼 빨리되어야합니다. – Justin

답변

0

천천히 사용하지 마십시오! 당신의 벡터가 셀 어레이에 저장되어있는 경우

, 당신은 cellfun를 사용할 수 있습니다

y = [ ... ]; 
xs = { [ ... ], [ ... ], [ ... ] }; 

res = cellfun(@(x) xcorr(x,y), xs, 'UniformOutput', false); 

res 이제 상관 관계가있는 세포 배열입니다.

이것은 루프를 해석 할 필요가 없으므로 for 루프 (테스트되지 않음)보다 빠릅니다.

mat2cell을 사용하여 행렬을 벡터의 셀 배열로 변환 할 수 있습니다. n = 10000

Elapsed time is 15.283524 seconds. 
Elapsed time is 18.009520 seconds. 
들어

xm = rand(n); 
xc = mat2cell(xm, ones(n,1), n); 
y = rand([n 1]); 

tic 
for i = 1:n 
    xcorr(y,xm(i,:)); 
end 
toc 

tic 
cellfun(@(x) xcorr(x,y), xc, 'UniformOutput', false); 
toc 

Elapsed time is 5.713080 seconds. 
Elapsed time is 7.003739 seconds. 

n = 5000를 들어

UPDATE

함께 테스트

그래서 실제로 더 느립니다.

+0

나는 이것이 매우 느릴 것이라고 거의 확신합니다. 'cellfun'은 올바르게 호출 된 경우 내장 함수 중 하나를 사용할 때 forloop 구현보다 빠릅니다. – Justin

+1

예, 불행히도 사실입니다. 나는 지금 이것을 시험하고있다. 결과를 1 초 내에 게시하십시오. – gzm0

0

크기 [50]의 벡터 v와 컨벌루션하고 싶은 크기 [1000, 50]의 행렬 X를 고려하십시오. 이제 대신 느린의 :

V=convmtx(v, 50); 
Y=X*V 
Y=Y(:,1:50) 

을 그리고 당신은 '전체'컨볼 루션에 관심이 아니라 '동일'인 경우 마지막 행을 제거 :

Y=zeros(size(X)) 
for i=1:1000 
     Y(i,:)=conv(X,v,'same') 
end 

하나는 할 수 있습니다.

관련 문제