双曲線正接 (シグモイド) カーネルを使用して、2 つの画像間のユークリッド距離を計算したいと考えています。Gaussian Kernel を使用した同じ問題について詳しく説明したこのリンクをたどってください。
x=(i,j)
&y=(i1,j1)
がイメージ内の任意の 2 ピクセルである場合、双曲線タンジェント カーネルの場合、 myは次
のようH(x,y)
に定義され
ます。パラメータは 1/N として取得できます。ここで、N は私の画像の寸法 (私の場合は 8192 x 200) であり、c は問題に応じて任意の値を取ることができます。双曲線正接カーネルの詳細については、こちらを参照してください。H(i,j) = tanh(alpha*(x'*y) + c)
alpha
c
x'
x
alpha
目標を達成し、実行時間を考慮に入れるために、以下の MATLAB スクリプトを作成しました。
gray1=zeros(8192,200);
gray2=zeros(8192,200);
s1 = 8192;
s2 = 200;
alpha = s1*s2;
perms = combvec(1:s2,1:s1);
perms = [perms(2,:);perms(1,:)]';
perms1 = perms;
gray1(4096,100) = 10;
gray2(10,100) = 10;
img_diff = gray1 - gray2;
display('Calculation of Sigmoid Kernel started');
for i = 1:length(perms1)
kernel = sum(bsxfun(@times,perms,perms1(i,:))');
kernel1 = tanh((1/alpha)*kernel + 1)';
g_temp(i) = img_diff(:)'*kernel1;
end
temp = g_temp*img_diff(:);
ans = sqrt(temp);
あらゆる努力にもかかわらず、ランニング コストを削減するためにこれ以上ベクトル化することはできませんでした。現在、完了するのに約 29 時間かかります。これは、さまざまな異なる画像に対して実行したいので、私には長すぎます。Gaussian Kernel の場合に @dan-man が行ったように、組み込みの MATLAB 関数を使用して完全にベクトル化された形式にしたいと考えています。彼の助けにより、Gaussian バージョンは 1 ~ 2 秒で完了しました。この場合も同じ機能を使用するために最善を尽くしましたconv2fft
が、それを達成する方法を見つけるのは難しいようです.
同じ問題のガウスバージョンと同じ割合でアルゴリズムのランニングコストを得るために、余分なforループを1つ削除するのを手伝ってくれませんか。
前もって感謝します。