Я понимаю, что если у нас есть два вектора - скажем, X и Y, мы можем вычислить их свертку в Matlab, используя Z = conv(X, Y)
. Есть другой способ сделать это: как описано на Mathworks.com , через матрицу свертки:
n = length(Y);
Z = convmtx(X,n)*Y;
У меня два вопроса:
- Зачем использовать матрицу свертки, если мы можем полагаться на
conv(X, Y)
? - В процитированных документах говорится, что первый метод более эффективен, но, к сожалению, они не объясняют, почему. Это в основном из-за того, что второй метод требует вычисления и выделения
length(Y)
, или это еще не все (умножение матриц более эффективно, чем операция свертки и т. Д.)?
Спасибо!
Изменить: я также связался с Mathworks.com и подумал, что поделюсь их ответом:
Вы можете сами убедиться, что conv действительно более эффективен, если запустите этот код.
tfs = 0; tsl = 0;
Nt = 20; sh = 500;
for kj = 1:Nt
q = randn(10000,1); h = randn(sh,1);
tic
fst = conv(q,h);
tfs = tfs+toc;
tic
slo = convmtx(q,sh); slo = slo*h;
tsl = tsl+toc;
end
tfs = tfs/Nt; tsl = tsl/Nt; tsl/tfs
Вы можете видеть, что conv выполняется примерно в 120 раз быстрее. Это происходит по нескольким причинам, но наиболее важной может быть то, что conv является (почти) встроенной скомпилированной функцией, тогда как convmtx кодируется в MATLAB и интерпретируется при вызове (т. Е. Анализируется, подвергается уровню проверки типа и т. Д.). Более того, когда вы вызываете convmtx, вы создаете много копий входного массива, даже если вам действительно нужна только одна.