【问题标题】:Matrix Comparison algorithm矩阵比较算法
【发布时间】:2010-05-07 05:34:58
【问题描述】:

如果您有 2 个维度为 N*M 的矩阵。 获得差异 Rect 的最佳方法是什么?

例子:

2 3 2 3 2 3 2 3                      2 3 2 3 2 3 2 3
2 3 2 3 2 3 2 3                      2 3 2 3 2 3 2 3
2 3 4 5 4 3 2 3      <--->           2 3 2 3 2 3 2 3
2 3 4 5 2 3 2 3                      2 3 2 3 2 3 2 3
2 3 2 3 2 3 2 3                      2 3 2 3 2 3 2 3

                      |
                      |
                     \ /
             Rect([2,2] , [3,4])
                    4 5 4
                    4 5 2-> A (2 x 3 Matrix)

我能想到的最好的方法是从左上角扫描到有差异的点。 然后从右下角扫描并点击有差异的点。

但在最坏的情况下,这是 O(N*M)。有没有更高效的算法?或者我可以用我如何表示它们来做些什么,以便您可以应用更有效的算法?请注意,这个矩阵可能非常大。

【问题讨论】:

  • 这是一个非常有趣的问题。您能告诉我您将它用于哪些应用程序,或者这更像是一项研究?
  • @Xavier Ho - 不学习。我可以在原始图像上应用相同的算法
  • 您可以比较每一行和每一列的傅立叶变换并比较结果。 DFT 非常快,因此它可能更有效。试试看 OpenCV,它是一个很棒的图像处理库,而且它是免费的。使用一张图像在另一张图像上的卷积也可能有效 - 你必须验证它(从数学上讲)

标签: c++ c algorithm


【解决方案1】:

不,没有更有效的算法。对于相同的矩阵,必须扫描所有元素,所以算法必然是O(n*m)

【讨论】:

    【解决方案2】:

    “但在最坏的情况下,这是 O(NM)。有没有更有效的算法?”可能不是因为数据的维度是 O(NM)。许多像这样的矩阵运算是 MN 阶的,因为在最坏的情况下,有 MN 个元素都需要在矩阵相等的情况下进行检查。

    查看平均情况更有趣,如果差异框必须是整个矩阵中的单个矩形,那么我怀疑您可以平均扫描少于所有元素。

    虽然我有一个快速的: 跟踪当前元素,调用这个 XY

    1. 从左上角开始,所以现在 XY 是上角

    2. 检查两者中的元素 XY 是否相等,如果不相等则转到 3,否则转到 4

    3. 如果元素不是那么你有一个差分矩阵的元素。记录这个元素,然后在该行和列中搜索其他元素(也许像二进制搜索这样的东西是最快的)。搜索行/列后,您将获得边缘的坐标。如果元素不相等,则移至 4。

    4. 下一步将 XY 对角线向下移动一个元素,向右移动一个元素,然后再次转到 2

    5. 一旦覆盖了对角线,那么您将需要沿下一个对角线进行测试(我怀疑选择离当前对角线最远的新对角线将是最好的,尽管我没有证据证明这一点是最好的选择),直到所有元素都被覆盖。最坏的情况仍然是 O(N*M),但在一般情况下可能会更快。

    本质上,您是在尽可能快地尝试找到一个不同的元素,因此目标是以这样一种方式选择第一个元素,以最小化查找第一个不同元素的搜索次数的预期值。

    【讨论】:

    • 虽然这很好......在我的情况下......我有重叠的矩形,非重叠的矩形等。
    • 然而,我希望有一个曲折的魔法 :) 可以最大限度地减少遇到最坏情况的可能性。
    【解决方案3】:

    就像其他人指出的那样,O(N*M) 是最优的。

    我想补充一点,在扫描矩阵时,您应该牢记它的内存布局。如果矩阵按行排列,最好水平扫描。如果按列布局,最好垂直扫描。这将导致非常优化的缓存行为。

    当然,这是假设所讨论的差异确实是矩形的形式。如果是其他形状,并且您想要边界矩形,则无论如何都必须扫描行和列。

    【讨论】:

      【解决方案4】:

      我认为所提出的算法是最优的。不过我建议你试试BLAS这个库,效率很高,比较一下性能。还有提供 C++ 接口的Boost uBlas 库和methods for Matrix expressions

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-10-08
        • 1970-01-01
        • 1970-01-01
        • 2011-09-09
        • 2012-02-15
        相关资源
        最近更新 更多