1

私はマトリックスについて質問し、それらをブロックに分割してきました-しかし、それは明らかに機能していないので、別のルートをとっています.

この例では、4x4 のマトリックス (ベクトル) があるとします。

M1 =

    0 1 0 1
    1 1 1 0
    0 0 0 1
    0 1 1 1

M2 =

   0 1
   1 0

ここで、M1 のどのブロックが M2 のブロックに最も適しているかを特定する必要があります。つまり、基本的には、大きなマトリックス内の小さなマトリックスを識別します。

私が助けを必要としているアルゴリズムは、基本的に、マトリックス 1 を横切って小さなマトリックスをスライドさせて、それが最適であるか一致することが判明するまでです。(私は相関/類似度測定を使用しています)

一度に 1 ピクセル/値でスライドする必要があると考えていました。しかし、明らかに、各値の相関関係を確認したくありません。

以下は、matrix1 (現在の位置) とmatrix 2 を比較する関数です。

これは行列を比較する関数です:

   bool compareMatrix(vector<double> &theMatrix1, vector<double> &theMatrix2, int 
   startRow, int startCol)
   {
      cout << theMatrix1[startRow*4+startCol]; // This prints out the particular block
   }

今私が考えていたのは、(現在の位置にある) matrix1 の値を格納する一時ベクトルを作成し、(現在の位置にある) matrix1 の値が一時ベクトル内にプッシュされ、この一時ベクトルが渡されることでした。値を返す相関関数に。

私の質問は次のとおりです。「theMatrix1 [startRow * 4 + startCol]」の内容を一時ベクトルにプッシュするにはどうすればよいですか?

たとえば、(これは機能しません):

vector<double> temp(2*2, 0);
temp.push_back(theMatrix1[startRow*4+startCol]);

double corr = correlation(temp, matrix2, 4, 4); 
return corr;

十分に説明できていることを願っています (注: これは以前の投稿とは異なります)。

誰かが助けてくれることを願って、

ありがとう :)

4

1 に答える 1

1

1 つのオブジェクトを別のオブジェクトにわたってスキャンする 1 つの方法は、1 つのオブジェクトを反転させ (h'(x, y) = h(-x, -y))、畳み込み定理を使用することです。http://en.wikipedia.orgを参照してください。 /wiki/Convolution_theoremおよびhttp://www-structmed.cimr.cam.ac.uk/Course/Convolution/convolution.htmlを参照して、2 次元で機能するものを確認してください。畳み込み定理に関するポイントは、FFT を実行するだけでn log n であるため、一部のパラメーターでははるかに高速です。

これが信号処理で広く使用されているという事実は、相関が本当に必要な場合、これよりもはるかに高速な近道は見つからないことを示唆しています。時々不足しているものに満足している場合は、両方のマトリックスで特徴を探し、特徴の一致を見つけ、それらの一致によって提案された配置を確認するなどのことを行うことができます。

于 2012-04-20T04:22:58.623 に答える