【问题标题】:A loop to iteratively arrive at rowsums = colsums for i = j迭代到达 rowsums = colsums for i = j 的循环
【发布时间】:2019-05-29 15:25:35
【问题描述】:

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

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

我的问题的非正式解释是想要更改矩阵 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),使得行和等于列和。

或者说“不收敛”的错误信息

【问题讨论】:

  • math.stackexchange.com 上提问可能会更好 - 一个优点是它支持数学标记,因此您可以更清楚地表达您想要的内容。
  • 如果您包含您的手工计算示例会有所帮助。
  • 你正在做(A + S),但要求(A + AS)。我不明白。我错过了什么吗?
  • 矩阵 A 应该是方阵。 @Shree A+AS 如果 A 是可逆矩阵,则可以从 A+S' 获得。
  • 预期结果可以是对角矩阵吗?这是行总和等于列总和的最简单方法...

标签: python r logic


【解决方案1】:

您有一些矩阵 A,您需要添加另一个矩阵 S,以便生成的矩阵 M 具有与列和相同的行和。这意味着:

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

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

S = M - S

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

A + S = M.

这意味着您可以将另一个矩阵 S 添加到每个矩阵 A,以便生成的矩阵 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,其中行和 = 列和,这就是您可以做到的。

【讨论】:

  • A + S 的 colSums 和 rowSums 需要等于原始的 colSums(或 rowSums,Q 不一致)。但这很容易解决; M &lt;- diag(colSums(A)).
  • 这是我不确定的事情,因为在问题的描述中,OP 要求 A+S 但后来要求 (A + AS)。所以感谢您的评论。
猜你喜欢
  • 2016-03-18
  • 2016-01-18
  • 1970-01-01
  • 1970-01-01
  • 2020-07-12
  • 1970-01-01
  • 2019-04-15
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多