我是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循环“规范化”我的矩阵?
答案 0 :(得分:1)
Suocle,
您的代码几乎就在那里。您忘记考虑的事情之一是变量sum
随着时间的推移持续存在,将整个矩阵中存在的值加起来而不仅仅是column
的值
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循环的第一次迭代,即对于第1列,由于sum
为零,它最终得到列的值的正确总和,然后通过对总和的除法进行归一化与价值观。
但是,在循环第二列的下一次迭代中,前一个sum
值仍然存在,因此必须在循环结束时再次分配给0
以获得新的正确总和column 2
的{{1}}或者你现阶段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;
}