首页 > 解决方案 > 迭代到达 rowsums = colsums for i = j 的循环

问题描述

我很抱歉我的问题会很冗长,因为我什至不知道如何开始编码。非常感谢伪代码答案,如果只是为了让我了解如何解决这个问题(然后我可以编写一些实际代码并在必要时回来寻求帮助)。

我的问题与其说是代码,不如说是理解我需要的逻辑(这可以说是编程中更难的部分)。

对我的问题的非正式解释是想要更改矩阵 A(恰好是稀疏的),以使行和等于列和。我可以通过向 A 添加一个矩阵 AS 来做到这一点,其中 S 是一个比例矩阵。

形式上,我想找到一个 S 矩阵,使得 (A + AS)ONESn = T 和 (t(A) + T(A)S)ONESn = T 其中 ONESn 是创建 T 的向量,行向量总和。

向量 T 是一成不变的,它是当前列的总和,也是行总和的目标。

我认为我想要解决这个问题的方法是针对 i = j 的每一行 i 和 j 列我想找到行总和并计算它与目标的距离。然后我想更改该行的每个元素,以使行总和等于目标(或者至少“足够接近”,我可以设置“足够接近”)。

但是,这取决于列 j 的总和也必须等于目标的条件。

我该如何设计逻辑,以便我可以从第 1 列和第 1 行开始,找出第 1 行中的值,然后在第 1 列的第一个条目被前面“固定”的情况下找出第 1 列的值程序。

之后,第 2 行的第一个值应该由上面“固定”,同样,程序现在需要找出第 2 列的前两个条目的固定值。

依此类推,直到到达最后一列和最后一行

我尝试过编程梯度下降,但坚持如何使列的梯度下降依赖于迭代行的梯度下降。

我也手工解决了这个问题(对于 2x2 矩阵),我可以找出答案,但我不确定我是如何做到的,这就是我努力编写代码的原因。

假设 A 是 [1, 2, 3, 4] 的 2x2 矩阵。行总和为 [4, 6]。列总和为 [3, 7]。

1 3  | 4 
2 4  | 6
___
3 7

如果我添加矩阵 S = [1, 0, -1, 0]

1 -1
0  0

我得到 A + S = [2, 2, 2, 4] ,其中行和为 [4, 6]。

2 2  | 4 
2 4  | 6
___
4 6

预期结果是一个矩阵 (A + AS),使得行和等于列和。

或一条错误消息说“不收敛”

标签: pythonrlogic

解决方案


您有一些矩阵 A 并且您需要添加另一个矩阵 S 以便生成的矩阵 M 具有与列和相同的行和。这表示:

A + S = M # 对于 M 行总和 = 列总和

所以你需要做的是找到 S。你可以简单地将 equotion 更改为

S = M - S

现在,您可以为 M 设置具有相同行和和列和的任何矩阵,然后得到 S。一旦有了 S,您就可以做到

A + S = M。

这意味着您可以向每个矩阵 A 添加另一个矩阵 S,以便生成的矩阵 M 具有行总和 = 列总和。因此,您不会得到消息“矩阵不收敛”。

这是一个R代码

A <- matrix(rnorm(4), ncol= 2)
M <- matrix(c(2,2,2,4), ncol= 2)
S <- M - A
rowSums(A+S) == colSums(A+S)
TRUE TRUE

或者,更一般地说:

row_col_num <- 5 # number of columns and rows
A <- matrix(rnorm(row_col_num *row_col_num ), ncol= row_col_num )
M <- matrix(rep(1, row_col_num *row_col_num ), ncol= row_col_num )
S <- M - A
rowSums(A+S) == colSums(A+S)
TRUE TRUE TRUE TRUE TRUE

生成的矩阵 A+S 始终与您设置 M 相同。所以我不确定这是做什么用的。如果您需要知道如何找到 S,其中 A+S 为您提供了一个矩阵 M,其中行总和 = 列总和,这就是您可以做到的方法。


推荐阅读