Зачем использовать матрицу свертки в Matlab, а не функцию conv ()?

Я понимаю, что если у нас есть два вектора - скажем, X и Y, мы можем вычислить их свертку в Matlab, используя Z = conv(X, Y). Есть другой способ сделать это: как описано на Mathworks.com , через матрицу свертки:

n = length(Y);
Z = convmtx(X,n)*Y;

У меня два вопроса:

  1. Зачем использовать матрицу свертки, если мы можем полагаться на conv(X, Y)?
  2. В процитированных документах говорится, что первый метод более эффективен, но, к сожалению, они не объясняют, почему. Это в основном из-за того, что второй метод требует вычисления и выделения 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, вы создаете много копий входного массива, даже если вам действительно нужна только одна.


person aralar    schedule 14.09.2014    source источник


Ответы (1)


Матрица свертки - это просто матрица, которая при умножении даст тот же результат, что и свертка. Это всегда матрица Теплица.

Матрица свертки не предназначена для фактического вычисления свертки. Его применение в тех случаях, когда вам нужно представить свертку в виде умножения матриц.

В качестве аналогии рассмотрим дискретное преобразование Фурье (ДПФ). Как хорошо известно, ДПФ почти всегда вычисляется с помощью очень эффективного алгоритма БПФ. Но вы можете представить ДПФ в виде матрицы, если хотите. Вы бы никогда не использовали это для фактического вычисления ДПФ; но концептуально иногда помогает выразить ДПФ как матричное умножение. Например, это позволяет рассматривать ДПФ как изменение базиса в векторном пространстве.

person Luis Mendo    schedule 14.09.2014
comment
В этом контексте было бы интересно отметить, что очень часто наиболее эффективным способом вычисления свертки является (быстрое) преобразование Фурье. :-) - person A. Donda; 15.09.2014
comment
@ A.Donda: Более эффективно, да (особенно если аппаратное ускорение), но я считаю, что (в зависимости от реализации) методы DFT могут привести к большей числовой ошибке по сравнению со стандартным умножением матриц. Поправьте меня если я ошибаюсь. Я не могу найти хорошую ссылку. - person horchler; 15.09.2014
comment
@horchler, интересно, я об этом не подумал. Если найдете ссылку, дайте мне знать. - person A. Donda; 19.09.2014