双曲線接線(シグモイド)カーネルを使用して2つの画像間のユークリッド距離を計算したいと思います。 thisのリンクに従ってください。ここでは、Gaussian Kernelを使って同じ問題について詳しく説明しました。 H(i,j) = tanh(alpha*(x'*y) + c)
どこalpha
とc
はパラメータであり、x'
はx
の転置である:& y=(i1,j1)
x=(i,j)
は双曲線正接カーネルの後、私たちの画像内の任意の2つの画素である場合大きなデータのためのループのための最適化matlabの
、私のH(x,y)
は次のように定義されます。パラメータalpha
は、1/Nと見なすことができます。ここで、Nは私のイメージの次元(私の場合は8192 x 200)で、cは問題に応じて任意の値を取ることができます。 Hyperbolic Tangentカーネルの詳細な説明はhereです。
私の目標&の実行時間を考慮して、以下の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 Versionは1-2秒で完了しました。この場合でも同じconv2fft
関数を使用するように最善を尽くしましたが、それを達成する方法を見つけるのは難しいようです。
誰かが同じ問題のガウスバージョンと同じ割合でアルゴリズムのランニングコストを得るために、その1つの余分なループを削除するのを手伝ってもらえますか?
ありがとうございます。
プロファイルしましたか? –
うわー、あなたのforループは '1638400'です、それはたくさんのことです。 –
@Anderええ。私はそれをプロファイリングしました。わずか780回の反復で約50秒かかります。したがって、1638400回の反復では約29時間かかります。 – nagarwal