我很抱歉,我的问题会很罗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),使得行总和等于列总和。
或者显示错误消息“不收敛”
答案 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,其行总和=列总和,这就是您的处理方法。