2014-02-07 3 views
2

У меня проблема с поиском более быстрого способа свертки нескольких векторов. Все векторы имеют одинаковую длину M, поэтому эти векторы могут быть объединены в виде матрицы (A) с размером (N, M). 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. Вы не можете получить оптимальную производительность, используя fftfilt, потому что вы хотите преобразовать обратно во временную область после завершения всех сверток, но это хорошо иллюстрирует метод.

1

Свертка ассоциативна. Объедините маленькие ядра, сверните один раз с данными.

Тестовые данные:

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

Reference (скручивать каждое ядро ​​с данными):

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

Смежные вопросы