我一直在询问关于矩阵的问题,并将它们分成块 - 但这显然不起作用所以我采取了另一种方式。
让我们说在这个例子中我有一个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;
我希望我已经解释得足够了(注意:这与以前的帖子不同)。
希望有人能提供帮助,
谢谢:)
答案 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,所以对于某些参数,它要快得多。
这在信号处理中被广泛使用的事实也向我建议,如果你真的需要相关性,你将找不到比这更快的任何快捷方式。如果你对某些时候缺少的东西感到满意,也许你可以做一些事情,比如在两个矩阵中寻找特征,找到特征的匹配,然后检查这些匹配建议的对齐。