将矩阵拆分为 4 个子矩阵,它们的总和之间的差异最小

Posted

技术标签:

【中文标题】将矩阵拆分为 4 个子矩阵,它们的总和之间的差异最小【英文标题】:Split matrix into 4 sub-matrices with lowest difference between their sum 【发布时间】:2014-03-24 04:35:14 【问题描述】:

我必须找到 4 个子矩阵之和之间的差异,这是我在以任何方式拆分矩阵 A 后得到的,以便获得子矩阵之和之间的最小差异矩阵。

例如,对于一个矩阵A

 3   0   2  -8  -8
 5   3   2   2   3
 2   5   2   1   4
 3   4  -1   4   2
-3   6   2   4   3

我可以这样拆分:

 3 | 0   2  -8  -8
 5 | 3   2   2   3
 2 | 5   2   1   4
 -------------------
 3   4  -1 |  4  2
-3   6   2 |  4  3

每个子矩阵中所有元素的总和得出以下结果:

10 | 8
-------
11 | 13

然后,我计算总和之间所有可能的绝对差,即

abs(10 - 8)  = 2
abs(10 - 11) = 1
abs(10 - 13) = 3
abs(8 - 11)  = 3
abs(8 - 13)  = 5
abs(11 -13)  = 2

最后,我选择了最大距离,即5

但是,如果我以任何其他方式拆分矩阵 A,它将给出不同的最大距离,这是我不想要的。我只需要找到5,但如果我要这样做,我会花费太多时间来寻找所有可能性。这个问题有名字吗,或者你可以给我一个提示吗?

添加

允许的拆分是水平拆分,然后是上方的垂直拆分,以及水平拆分下方的可能不同的垂直拆分。在示例中,矩阵有 4 x 4 x 4 = 64 个允许的分区。

特定分区的子矩阵之间的最大差异是通过考虑该分区的 4 个子矩阵的所有对(将有 6 个这样的对)并取其中一个子矩阵的元素之和之间的最大差异来形成的的对和对的另一个子矩阵的元素的总和。我们希望找到所有最大差异中的最小值。

实际矩阵可能高达 4000 x 4000。

【问题讨论】:

我建议这是 math.stackexchange.com 的问题,因为这是一个代数算法问题,而不是编码问题。 你得到的输入是矩阵和代表最大距离的数字? 我得到矩阵,必须找到最佳分割的最大距离 【参考方案1】:

蛮力有一些加速。首先,通过沿行累加总和,然后沿列累加,您可以构建一个表格,为每个点提供所有点的总和,包括那个点,不超过它,也不比它更右边。然后,您可以通过最多减去这些小计中的四个来计算任何矩形中的总和:粗略地说,右上角的总和加上左下角的总和减去其他两个角的总和。

对于 OP 绘制的分割模式,水平线分割整个矩阵,然后是不同的垂直线分割每一半,垂直分割必须是它们一半中最均匀的垂直分割。如果总和之间的最大差异在垂直拆分内,那么晚上垂直拆分只能改善它。如果总和之间的最大差异在(例如)左上角的高和和右下角的低总和之间,那么平分任一垂直分割都会降低高总和或低总和,平分最极端的区别。这意味着您只需要考虑上半部分的最佳拆分和下半部分的最佳拆分 - 您不需要考虑所有拆分对。

对于在水平拆分的同一侧有两个垂直拆分的情况,您不必尝试垂直拆分的所有位置对:您可以从最左侧的最左侧拆分开始,然后调整最右边的分裂将其余部分尽可能均匀地切成两半。然后将最左边的分裂慢慢向右移动,同时,可以反复调整最右边的分裂向右移动,以保持尽可能均匀地分裂。

使用这些想法,在我看来,对于每个可能的拆分模式,您可以及时找到该模式的最小成本拆分,给定该模式中最长线的位置,即 O(N) N边的方阵,因此最长的线有N个位置,即O(N ^ 2),这与建立每个点下方和左侧的点总和表所需的时间大致相同,这需要时间与矩阵中的单元格总数成线性关系,或者对于 N 侧的方阵而言,时间为 O(N^2)。 - 但令人讨厌的是,似乎有六种不同的分割模式。

【讨论】:

以上是关于将矩阵拆分为 4 个子矩阵,它们的总和之间的差异最小的主要内容,如果未能解决你的问题,请参考以下文章

Python - 混淆矩阵维度的差异

将“delta”列添加到矩阵中,包含每个相邻列中元素之间的差异值?

R语言psych包的fa函数对指定数据集进行因子分析(输入数据为相关性矩阵)指定进行正交旋转斜交旋转提取因子比较正交旋转和斜交旋转之间的差异因子结构矩阵因子模式矩阵和因子相关矩阵之间的关系

将数组拆分为大约等于总和而不重新排列

将海量矩阵拆分为块

创建一个差异矩阵比较R数据框中所有行之间的差异