一个循环,迭代得出i = j

时间:2019-05-28 23:01:28

标签: python r logic

我很抱歉,我的问题会很罗word,因为我什至不知道如何开始编码。如果只是为了让我了解如何解决此问题,伪代码答案将受到高度赞赏(然后我可以编写一些实际代码,并在必要时返回寻求帮助)。

我的问题不仅仅在于代码,还在于它理解了我所需要的逻辑(可以说这是编程中最难的部分)。

对我的问题的非正式解释是,要更改矩阵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行的第一个值应该为“ fixed”,并且类似地,程序现在需要找出前两个条目具有固定值的第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),使得行总和等于列总和。

或者显示错误消息“不收敛”

1 个答案:

答案 0 :(得分:1)

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

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

所以您要做的就是找到S。您只需将引号更改为

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,其行总和=列总和,这就是您的处理方法。