Есть ли способ выполнить свертку по столбцам в MATLAB, используя conv ()? - PullRequest
1 голос
/ 15 января 2020

У меня есть две 2D матрицы с одинаковым количеством столбцов , A и B. Я хочу свернуть соответствующие столбцы этих двух матриц и сохранить результат в новом, называемом result. Предполагая, что result имеет соответствующие размеры, мой текущий подход выглядит примерно так:

for i = 1 : size( A, 2 ) % number of columns
    result(:,i) = conv( A(:,i), B(:,i) );
end

Есть ли способ избежать этого l oop, используя conv() или, возможно, conv2() напрямую?

Ответы [ 2 ]

3 голосов
/ 15 января 2020

Вы можете использовать отношения между (круговой) сверткой и DFT и использовать тот факт, что fft, в отличие от conv2, может работать вдоль указанного измерения:

A = rand(5,7);
B = rand(4,7); % example matrices. Same number of columns
s = size(A,1)+size(B,1)-1; % number of rows of result
result = ifft(fft(A,s,1).*fft(B,s,1));

Обратите внимание, что из-за числовой точности с плавающей точкой могут быть небольшие различия, порядка eps, между этим результатом и полученным с помощью for и conv. В частности, если ваши входные данные реальны, результат может иметь (очень маленькую) мнимую часть, поэтому вы можете применить real к результату.

0 голосов
/ 15 января 2020

Если вы хотите использовать функцию conv, вы можете попробовать conv(A_i,B_i, 'full'), но вы также можете использовать приведенный ниже код для свертки, например, для свертки столбцов convIt(A,B,1) и для свертки строк convIt(A,B,2)

function C = convIt(A,B,dim)
% the code is equivalent to running conv(A_i,B_i, 'full') in matlab
% (where A_i and B_i are columns (dim=1) or rows (dim=2) of A,B)
% and then stack the results together

if 1==dim || nargin<3 % default
  A = [A;zeros(size(A))];
  B = [B;zeros(size(B))];
elseif 2==dim
  A = [A,zeros(size(A))];
  B = [B,zeros(size(B))];
end
C = ifft(fft(A,[],dim).*fft(B,[],dim),[],dim);
if 1==dim || nargin<3 % default
  C = C(1:end-1,:);
elseif 2==dim
  C = C(:,1:end-1);
end
...