消除矩阵的舍入误差

use*_*280 6 algorithm linear-equation rounding

我的问题是我有一个矩阵,其中所有行的总和,以及所有列的总和为零.所有数字都舍入为x小数.

然后我将整个矩阵乘以0到1之间的数字(例如1/6)并将所有数字四舍五入为x小数.现在我无法确定行和列的总和是否为零.我希望在最小可能的调整(或至少非常小的调整)下,总和再次为零

是否存在可以解决此类问题的算法?

示例(非常简单):矩阵:

    200  -200  0

    400  400  -800

   -600 -200  800
Run Code Online (Sandbox Code Playgroud)

round2((1/6)*矩阵)

33.33  -33.33  0   

66.67  66.67   -133.33

-100   -33.33  133.33
Run Code Online (Sandbox Code Playgroud)

Lio*_*gan 2

这不是一个解决方案;只是对您想要实现的目标进行更数学的描述(不判断这是否是正确的做法):

由于您将所有数字四舍五入为 x 位小数,因此我们可以将这些数字视为整数(只需将它们乘以 10^x)。

现在,您正在尝试解决以下问题:

给定矩阵

A11+Adj11   A12+Adj12   ...   A1n+Adj1n
A21+Adj21   A22+Adj22   ...   A2n+Adj2n
A31+Adj31   A32+Adj32   ...   A3n+Adj3n
...         ...         ...   ...
Am1+Adjm1   Am2+Adjm2   ...   Amn+Adjmn
Run Code Online (Sandbox Code Playgroud)

其中 A11..Amn 是常量整数,

查找整数 Adj11...Adjmn

最小化总和(abs(Adjxy))

(或者也许您更喜欢:最小化总和((Adjxy)^ 2)

须遵守:

- for each row m: Adjm1+Adjm2+...+Adjmn = - (Am1+Am2+...+Amn)
- for each col n: Adj1n+Adj2n+...+Adjmn = - (A1n+A2n+...+Amn)
Run Code Online (Sandbox Code Playgroud)

这是一个整数规划问题,有 m*n 个变量和 m+n 个约束。您尝试最小化的函数不是线性的。

恐怕这个问题绝非小事。我相信你最好将其发布在https://math.stackexchange.com/