2014-02-07 3 views
2

여러 벡터를보다 빠르게 컨버팅하는 방법을 찾는 데 문제가 있습니다. 모든 벡터의 길이는 M이므로이 벡터들은 (N, M)의 행렬 (A)으로 결합 될 수 있습니다. N은 벡터의 수입니다.MATLAB에서 다중 벡터 컨벌루션 속도를 높이려면 어떻게해야합니까?

가 지금은 모든 벡터를 컨 볼브하기 위해 아래의 코드를 사용하고 있습니다 : 그것은 자주 호출되기 때문에

B=1; 

for i=1:N 

B=conv(B, A(i,:)); 

end 

나는이 코드 조각을 발견 한 것은 내 프로그램에서 속도 제한 단계가된다. 제 질문은이 계산을 더 빨리 수행 할 수있는 방법이 있습니까? M은 소수 (예 : 2)라고 간주하십시오.

+0

N은 얼마나 큽니까? 크기가 크다면 (10000), B 벡터는 시간이 지남에 따라 커지기 때문에 속도가 느려집니다. – Lazarus

+0

내 응용 프로그램의 경우 N은 일반적으로 그다지 크지 않지만 (100 미만), 시간이 지남에 따라 B가 커지는 것은 사실입니다. 나는이 경우에 B가 어떻게 공간을 미리 할당 할 수 있는지 아직 모른다. – Kanzy

답변

2

컨볼루션을 주파수 도메인에서 곱셈으로 구현하면 속도가 훨씬 빨라야합니다.

fftfilt이 구현 된 방식을보십시오. 을 사용하면 최적의 성능을 얻을 수 없습니다. 왜냐하면 모든 컨볼 루션이 완료된 후에 만 ​​시간 도메인으로 변환하기를 원하기 때문입니다. 그러나이 방법을 잘 보여줍니다.

1

컨볼 루션은 연관성이 있습니다. 작은 커널을 결합하고 데이터와 한 번 병합하십시오.

테스트 데이터 :

M = 2; N = 5; L = 100; 
A = rand(N,M); 
Bsrc = rand(1,L); 

참조 (데이터 말다 각 커널) :

B = Bsrc; 
for i=1:N, 
    B=conv(B, A(i,:)); 
end 

결합 커널 :

A0 = 1; 
for ii=1:N, 
    A0 = conv(A0,A(ii,:)); 
end 
B0 = conv(Bsrc,A0); 

비교 :

>> max(abs(B-B0)) 
ans = 
    2.2204e-16 
,

이 컨볼 루션을 자주 수행하는 경우 A0을 미리 계산하면 하나의 회선 (B0 = conv(Bsrc,A0);) 만 수행 할 수 있습니다.

+0

좋은 지적. 그러나, 내 구체적인 경우 Bsrc는 단순히 1입니다. 내부 루프 계산 (A0 부분)이 더 빨라질 수 있다면 정말 좋을 것입니다. – Kanzy

+0

질문에 따라 "모든 벡터의 길이가 같습니다." –

+0

혼란을 가져 주어서 죄송합니다. 각 벡터는 A의 열로 놓였습니다. B는 단지 컨볼 루션 결과를 저장하는 데 사용되고 있으며 1로 초기화되었습니다. – Kanzy

관련 문제