J'essaie de trouver la meilleure façon d'effectuer une sorte de convolution. J'ai une matrice 3D I = [N x M x P] et une matrice 2D S = [1 x 1 x K x P]. Pour chaque pth frame (troisième dimension) de ma matrice 3D, je veux retourner la convolution valide entre I (:,:, p-K/2: p + K/2) et S (1, 1,:, p). Voyez-vous un moyen de le faire?Meilleure façon d'effectuer une convolution avec un nouveau vecteur pour chaque image?
En fait, en termes de calcul du nombre d'opérations en très proche d'une convolution standard, la différence est que je dois changer la deuxième matrice pour chaque trame ...
C'est la méthode que je actuellement utiliser:
% I = 3D matrix [N x M x P]
% S = Filter [1 x 1 x K x P] (K is an odd number)
% OUT = Result
[N, M, P] = size(I); % Data size
K = size(S, 3); % Filter length
win = (K-1)/2 ; % Window
OUT = zeros(size(I)); % Pre-allocation
for p = win+1:P-win
OUT(:, :, p) = convn(I(:, :, p-win:p+win), S(1, 1, :, p), 'valid'); % Perform convolution
end
à la fin, nous avons le même nombre d'opérations que la convolution standard, la seule différence est que le filtre est différent pour chaque trame ...
Toute idée?
Merci;)