Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/71.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 矩阵比较算法_C++_C_Algorithm - Fatal编程技术网

C++ 矩阵比较算法

C++ 矩阵比较算法,c++,c,algorithm,C++,C,Algorithm,如果你有两个N*M的矩阵。 获得差分矩形的最佳方法是什么 例如: 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

如果你有两个N*M的矩阵。 获得差分矩形的最佳方法是什么

例如:

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)
23323323323
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矩阵)
我能想到的最好的办法就是从左上角扫描到有差异的地方。 然后从右下角扫描并点击有差异的点


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

不,没有比这更有效的算法了。对于相同的矩阵,您必须扫描所有元素,因此算法必须是
O(n*m)

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

看看平均情况更有趣,如果差分框必须是整个矩阵中的一个矩形,那么我怀疑你可以通过平均扫描少于所有元素而逃脱

我有一个简短的建议: 跟踪当前元素,将其称为XY

  • 从左上角开始,现在XY是左上角

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

  • 如果元素不是,那么就有一个差分矩阵元素。记录此元素,然后在该行和该列中搜索其他元素(可能二进制搜索之类的搜索最快)。搜索行/列后,即可获得边的坐标。如果元素不相等,则移动到4

  • 下一步,将XY沿对角线向下移动一个图元,向右移动一个图元,然后再次转到2

  • 一旦一条对角线被覆盖,那么你需要沿着下一条对角线进行测试(我怀疑选择一条距离当前对角线最远的新对角线将是最好的,尽管我没有证据证明这是最好的选择),直到所有元素都被覆盖为止。最坏的情况仍然是O(N*M),但在平均情况下可能更快


  • 本质上,您正试图尽可能快地搜索一个不同的元素,因此目标是选择第一个元素,以使搜索第一个不同元素的次数的期望值最小化。

    正如其他人所指出的,O(N*M)是最优的

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


    当然,这假设所讨论的差异确实是矩形的形式。如果它是其他形状,并且您需要边界矩形,那么无论发生什么情况,您都必须扫描行和列。

    我认为所提出的算法是最佳算法。不过,我建议您尝试使用非常有效的库,并比较性能。还提供了C++接口和. 这是一个非常有趣的问题。你能告诉我你用它做什么用途吗?或者这更像是一项研究吗?@Xavier Ho-不是研究。我可以在原始图像上应用相同的算法。您可以比较每行和每列的傅里叶变换,并比较结果。DFT非常快,因此可能更有效。尝试查看OpenCV,它是一个处理图像的很棒的库,而且是免费的。使用一个图像对另一个图像的卷积也可能有效-你必须验证它(从数学上讲),而这是好的…在我的情况下…我有重叠的矩形,非重叠的矩形等。然而,我希望有一个之字形魔术:)可以最大限度地减少击中最坏情况的概率。