我真的很抱歉,我的问题将是冗长的,因为我只是不知道如何开始编码。如果只是为了让我理解如何解决这个问题,伪代码答案是非常有用的(然后我可以写一些实际的代码,如果需要的话,可以回来寻求帮助)。
我的问题与其说是代码,不如说是理解我所需要的逻辑(这无疑是编程中最难的部分)。
我的问题的一个非正式解释是,想要更改矩阵A(它恰好是稀疏的),以便行和等于列和。我可以通过向A添加一个矩阵来做到这一点,其中S是一个尺度矩阵。
形式上,我希望找到一个S矩阵,使得(A + AS)ONESn =T和(t(A) + T(A)S)ONESn = T,其中ONESn是创建T的向量,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),使得行和等于列和。
或者显示错误消息“不收敛”。
发布于 2019-05-29 14:39:56
您有一些矩阵A,并且您需要添加另一个矩阵S,以便得到的矩阵M具有与列和相同的行和。这意味着:
对于M行和=列和,A+S=M#
因此,您需要做的是找到S。您可以简单地将方程更改为
S=M-S
现在,您可以为M设置任何具有相同行和列和的矩阵,这样就得到了S。一旦有了S,就可以这样做
A+S= M。
这意味着您可以向每个矩阵A添加另一个矩阵S,以便得到的矩阵M具有行sums=列和。因此,你不会得到消息“矩阵不收敛”。
这是一个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,这就是你可以做到的。
https://stackoverflow.com/questions/56351069
复制相似问题