我是 C++ 的新手,我正在尝试使用 for 循环将矩阵的列归一化为总和。这是我的尝试:
#include <iostream>
#include <string>
int main() {
double A[3][3] = {{1,2,3},{4,5,6},{7,8,9}};
double sum = 0;
int r = 3;
int c = 3;
for (int j=0; j < c; j++) {
for (int i=0; i < r; i++) {
sum += A[i][j];
}
for (int i=0; i < r; i++) {
A[i][j] /= sum;
}
}
for (int j=0; j < 3; j++) {
for (int i=0; i < 3; i++) {
std::cout<<A[i][j];
}
std::cout<<std::endl;
}
return 0;
}
这是输出:
0.0833333 0.333333 0.583333
0.0740741 0.185185 0.296296
0.0666667 0.133333 0.2
我不确定为什么输出按原样显示,似乎它适用于第一列,但不适用于其余列。然而,其余两列保持相同的比例。如何修改代码,以便我可以按预期使用 for 循环“规范化”我的矩阵?
最佳答案
细胞核,
您的代码就快完成了。您忘记考虑的一件事是,变量 sum
随着时间的推移继续对整个矩阵中存在的值求和,而不仅仅是 列
的值>
for (int j=0; j < c; j++) {
for (int i=0; i < r; i++) {
sum += A[i][j];
}
for (int i=0; i < r; i++) {
A[i][j] /= sum;
}
}
对于 for 循环的第一次迭代,即对于第一列,由于 sum
为零,它最终得到该列值的正确总和,然后通过除法对其进行归一化与值的总和。
但是,在下一次循环遍历第 2 列时,sum
的先前值仍然存在,因此必须在循环结束时再次将其分配给 0
获得 column 2
的新的正确总和,否则您在此阶段有 sum=sum(column1)+sum(column2)
。
for (int j=0; j < c; j++) {
for (int i=0; i < r; i++) {
sum += A[i][j];
}
for (int i=0; i < r; i++) {
A[i][j] /= sum;
}
sum = 0;
}
关于c++ - 将给定矩阵规范化为 C++ 中列项总和为 1 的矩阵,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47149009/