2017-10-20 6 views
3

私は一種の畳み込みを実行する最良の方法を見つけようとします。各画像の新しいベクトルを使って畳み込みを行う最も良い方法は?

私は3D行列I = [N x M x P]と2次元行列S = [1 x 1 x K x P]を持っています。私の3Dマトリックスの各p番目のフレーム(3次元)に対して、I(:,:、p-K/2:p + K/2)とS(1,1、:、p)の間の有効な畳み込みを返したい。これを行う方法がありますか?実際には、演算標準畳み込みに非常に近いの動作の数の点で、違いは、私は、各フレームの第2の行列を変更する必要があることである

...

これは、私は現在の方法であります使用:我々は、標準的な畳み込み演算よりも数が同じに終わり

% 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 

、唯一の違いは、フィルタは、フレームごとに異なることである...

任意のアイデア?

感謝;)

答えて

0

は、だから、1x1xKx1カーネルでNxMxKサブ画像を畳み込むしたい、そして唯一のN×Mのイメージで有効な部分を取ります。

この操作を単一の(x、y)の場所で見てみましょう。あなたが唯一の1つの値を保持そのうちこの1Dコンボリューションは、サブ画像とカーネルのドット積に相当します。

OUT(x,y,p) = squeeze(I(x,y,p-win:p+win))' * squeeze(S(1,1,:,p)) 

このあなたはサブを再形成して、すべての(x、y)を越えてベクトル化することができますIの(N * M)×K行列(Kは水平、Sは列ベクトル)に変換する。

これを繰り返すことは、今のようにループで実装するのが最も簡単です。別の方法は、各列が1だけシフトされるより大きなSを作成することで、2つの行列の間で1つのドット積を行うことができます。しかし、Sは作成するのにも敏感で、恐らくループも必要となるでしょう。私は、ループを避けることは、MATLAB(それは長年に渡ってより高速になっている)でそれ以上のことを押すことではないと思うし、製品自体はおそらくアルゴリズムの中で最も高価な部分です。

関連する問題