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(在当前位置)与矩阵 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

将一个对象扫描到另一个对象的一种方法是反转一个对象 (h'(x, y) = h(-x, -y)。然后使用卷积定理 - 参见http://en.wikipedia.org /wiki/Convolution_theorem并查看http://www-structmed.cimr.cam.ac.uk/Course/Convolution/convolution.html了解在二维中起作用的东西。关于卷积定理的要点是,做 FFT 只是n log n,因此对于某些参数,它要快得多。

这在信号处理中被广泛使用的事实也向我表明,如果你真的需要相关性,你不会找到比这更快的捷径。如果您对某些时候缺少的东西感到满意,也许您可​​以做一些事情,例如在两个矩阵中查找特征,找到特征匹配,然后检查这些匹配建议的对齐方式。

于 2012-04-20T04:22:58.623 回答