我有以下非常简单的代码,它应该迭代地更改矩阵的值(finalvals),直到行总和和列总和接近某些值(由 b1 和 c 给出) -
double[] rowsums = new double[3];
double[] colsums = new double[3];
Double[][] finalvals = {
{10320289.32d,15531663.71d,513718885.9d},
{5741307.806d,19279894.22d,254573082.9d},
{216919827.7d,229857986.8d,8769234962d}
};
Double[] b1 = {544169638d,273919997d,9217088452d};
Double[] c = {232981430d,264669549d,9537527108d};
for(int k = 0;k<1000;k++){
for(int i = 0;i<3;i++){
for(int j = 0;j<3;j++){
rowsums[i] = rowsums[i] + finalvals[i][j];
}
}
for(int i = 0;i<3;i++) {
for(int j = 0;j<3;j++) {
finalvals[i][j] = b1[i] * finalvals[i][j] / rowsums[i];
}
}
for(int i = 0;i<3;i++) {
for(int j = 0;j<3;j++) {
colsums[j] = colsums[j] + finalvals[i][j];
}
}
for(int i = 0;i<3;i++) {
for(int j = 0;j<3;j++) {
finalvals[i][j] = c[j] * finalvals[i][j] / colsums[j];
}
}
}
for(int i = 0;i<3;i++) {
for(int j = 0;j<3;j++) {
System.out.print(finalvals[i][j] + " ");
}
System.out.print("\n");
}
然而,由于数值泄漏,finalvals 的值在经过一千次迭代后才变成全零。有什么办法可以堵住这些漏洞吗?编辑:算法的描述 - 我们希望矩阵行与数组 b1 相加,矩阵列与数组 c 相加。因此,首先将 b1 的第一个值按现有值的比例分布在矩阵的前三行中,其他两行类似。然后我们使用列和数组 c 做同样的事情。我们反复多次这样做,我们最终应该得到一个行和列相加适当的矩阵。