【问题标题】:Algorithm to slide vector across a vector将向量滑过向量的算法
【发布时间】:2012-04-19 20:12:00
【问题描述】:

我一直在询问有关矩阵的问题,并将它们分成块 - 但这显然行不通,所以我采取了另一条路线。

假设在这个例子中我有一个 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;

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

希望有人能帮忙,

谢谢:)

【问题讨论】:

  • 这个问题似曾相识……
  • 这个问题是关于在临时向量中插入值然后处理数据,而不是分割成块。它扫描图像:)
  • 你应该按 M2 搜索 M1。这个顺序是 O(size_m1 * size_m2)。当您为每个块搜索 M1 时,计算匹配错误(这是显示 M1 中有多少元素与 M2 不匹配)并找到匹配数的最小错误。
  • 嘿 - 感谢您的回复。问题是我在实际扫描 M1 时遇到问题,甚至考虑搜索 M2 的内容..

标签: c++ algorithm vector matrix


【解决方案1】:

在另一个对象上扫描一个对象的一种方法是反转一个对象 (h'(x, y) = h(-x, -y)。然后使用卷积定理 - 参见 http://en.wikipedia.org/wiki/Convolution_theorem 并参见 @ 987654322@ 用于二维工作。关于卷积定理的要点是,进行 FFT 只需 n log n,因此对于某些参数,它要快得多。

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-07
    • 2012-02-12
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多