【问题标题】:Fastest way to Find a m x n submatrix in M X N matrix在 M X N 矩阵中查找 m x n 子矩阵的最快方法
【发布时间】:2012-05-18 17:55:26
【问题描述】:

我正在考虑一种在更大的矩阵 M 中寻找子矩阵 m 的快速方法。 我还需要识别部分匹配项。

我能想到的几种方法是:

  1. 优化普通暴力破解以仅处理增量行和列。
  2. 可能会将 Rabin-karp 算法扩展到二维,但不确定如何处理部分匹配。

我相信这是图像处理中经常遇到的问题,如果有人能提供他们的意见或将我指向有关此主题的资源/论文,我将不胜感激。

编辑: 小例子:

更大的矩阵:
1 2 3 4 5
4 5 6 7 8
9 7 6 5 2

小矩阵:
7 8
5 2

结果:(行:1 列:3)

在 (1, 3) 处符合部分匹配条件的 Smaller 矩阵示例:
7 9
5 2

如果超过一半的像素匹配,则视为部分匹配。

谢谢。

【问题讨论】:

  • 较小的矩阵需要遵守哪些限制?如果不存在 - 只需取第一个 m x n 子矩阵,...
  • 为您的子矩阵添加条件?请。
  • 添加了子矩阵的条件。
  • 这不是限制。那就去左上角吧。
  • 我添加了一些示例。这个问题现在应该很清楚了。

标签: c++ c algorithm matrix


【解决方案1】:

我认为你不能只用某种方法来猜测子矩阵在哪里,但你可以优化你的搜索。

例如,给定一个矩阵 A MxN 和一个子矩阵 B mxn,你可以这样做:

SearchSubMatrix (Matrix A, Matrix B)

answer = (-1, -1)

Loop1:
for i = 0 ... (M-m-1)
|
|   for j = 0 ... (N-n-1)
|   | 
|   |   bool found = true
|   |
|   |   if A[i][j] = B[0][0] then
|   |   |
|   |   |   Loop2:
|   |   |   for r = 0 ... (m-1)
|   |   |   |   for s = 0 ... (n-1)
|   |   |   |   |   if B[r][s] != A[r+i][s+j] then
|   |   |   |   |   |   found = false
|   |   |   |   |   |   break Loop2
|   |
|   |   if found then
|   |   |   answer = (i, j)
|   |   |   break Loop1
|
return answer

这样做,由于子矩阵的大小,您将减少搜索。

Matrix         Submatrix         Worst Case:
1 2 3 4           2 4            [1][2][3] 4
4 3 2 1           3 2            [4][3][2] 1
1 3 2 4                          [1][3]{2  4}
4 1 3 2                           4  1 {3  2}

                                 (M-m+1)(N-n+1) = (4-2+1)(4-2+1) = 9

虽然这是O(M*N),但它永远不会看起来M*N 次,除非您的子矩阵只有一维。

【讨论】:

    【解决方案2】:

    如果您只需要将一个小矩阵与一个大矩阵进行匹配,则无法快速完成此操作。但是如果你需要对大矩阵做很多小矩阵,那么预处理大矩阵。

    一个简单的例子,精确匹配,许多 3x3 矩阵与一个巨型矩阵。

    制作一个新的“匹配矩阵”,大小与“大矩阵”相同,为大矩阵中的每个位置计算大矩阵中每个 x,y 到 x+3,y+3 的 3x3 哈希。现在您只需扫描匹配矩阵以查找匹配的哈希值。

    您可以使用专门的散列函数来实现部分匹配,这些函数为具有相同部分匹配属性的事物提供相同的散列。棘手。

    如果您想进一步加快速度并留出内存,请为匹配矩阵创建一个哈希表,并在哈希表中查找哈希值。

    3x3 解决方案适用于任何 3x3 或更大的测试矩阵。您不需要完美的哈希方法 - 您只需要能够拒绝大多数错误匹配的方法,然后对哈希表中的潜在匹配进行完全匹配。

    【讨论】:

      【解决方案3】:

      我建议对“二维模式匹配算法”进行互联网搜索。你会得到很多结果。我将链接 Google 上的第一个点击,a paper,它为您的问题提供了一个算法。

      您还可以查看论文末尾的引文,以了解其他现有算法。

      摘要:

      提出了一种在二维 n x n 文本中搜索二维 m x m 模式的算法。平均而言,它执行的比较少于文本大小:n^2/m 使用 m^2 额外空间。基本上,它仅在文本的 n/m 行上使用多个字符串匹配。它最多运行 2n^2 次,并接近许多模式的最佳 n^2 次。它稳步扩展到具有类似最坏情况的与字母无关的算法。实验结果包含在实用版本中。

      【讨论】:

        【解决方案4】:

        如果您愿意对矩阵进行预处理并且对同一个矩阵有很多查询,则有非常快速的算法。

        查看多媒体数据库研究小组(波恩大学克劳森教授)关于代数数据库的论文。看看这篇论文,例如:http://www-mmdb.iai.uni-bonn.de/download/publications/sigir-03.pdf

        基本思想是泛化倒排列表,因此他们使用任何类型的代数变换,而不是像普通倒排列表那样仅向一个方向移动。

        这意味着只要您需要对输入数据进行的修改可以通过代数方式建模,这种方法就可以工作。这特别是可以检索在任意数量的维度中翻译、旋转、翻转等的查询。

        该论文主要针对音乐数据展示这一点,因为这是他们的主要研究兴趣,但您也许可以找到其他人,它们也展示了如何将其调整为图像数据(或者您可以尝试自己调整) ,如果你明白原理就很简单了)。

        编辑

        这个想法也适用于部分匹配,如果你定义正确的话。

        【讨论】:

        • 链接现在失效了,很遗憾。有没有机会更新它,或者包括它的标题以供将来参考?
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-03-25
        相关资源
        最近更新 更多