【发布时间】:2017-07-05 05:14:13
【问题描述】:
要求:必须就地完成。
例如:
给定矩阵
1, 2, 3
4, 5, 6
7, 8, 9
应该用它的 3*3 个相邻单元和它自己的总和的平均值替换:
(1+2+4+5)/4, (2+1+3+4+5+6)/6 , (3+2+6+5)/4
(1+2+5+4+7+8)/6, (1+2+3+4+5+6+7+8+9)/9, (2+3+5+6+8+9)/6
(4+5+7+8)/4, (4+5+6+7+8+9)/6, (5+6+8+9)/4
这是:
All floating number convert to int
3, 3.5(3), 4 3, 3, 4
4.5(4), 5, 5.5(5) => 4, 5, 5
6, 6.5(6), 7 6, 6, 7
我尝试只迭代矩阵并更新每个单元格,但我发现这会影响未来的计算:
假设我将原来的 1 更新为 3,但是当我尝试更新原来的 2 时,原来的 1 现在变成了 3。
复制原始矩阵来计算平均值是一种解决方法,但这是一个坏主意,我们能否在不使用那么多空间的情况下实现这一目标?
【问题讨论】:
-
在更新单元格之前创建矩阵的副本是通常的方法。如果矩阵非常非常大,您可以只保留“滚动”备份,例如上一行和当前行,甚至更少。
-
假设您有一个 1000x1000 矩阵,并且您正在逐行更新单元格。在第 n 行时,您不需要第 n-2 行的副本(因为它不再相关),也不需要第 n+1 行(因为它仍然具有原始值。所以只保留前一个的备份和当前行就足够了。是否值得努力是另一个问题。
-
@tobias_k 你能详细解释一下“滚动”备份的细节吗?我认为这可能是关键。