在矢量中滑动矢量的算法

时间:2012-04-19 20:12:01

标签: c++ algorithm vector matrix

我一直在询问关于矩阵的问题,并将它们分成块 - 但这显然不起作用所以我采取了另一种方式。

让我们说在这个例子中我有一个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上滑动小矩阵,直到发现它最适合或匹配。 (我正在使用相关/相似度量)

我一直认为它需要一次以一个像素/值滑动。但是,显然我不想检查每个值的相关性。

这是将matrix1(在当前位置)与矩阵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;

我希望我已经解释得足够了(注意:这与以前的帖子不同)。

希望有人能提供帮助,

谢谢:)

1 个答案:

答案 0 :(得分: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,所以对于某些参数,它要快得多。

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