将给定矩阵规范化为矩阵,其中列条目在C ++中总和为

时间:2017-11-07 02:24:53

标签: c++ loops

我是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循环“规范化”我的矩阵?

1 个答案:

答案 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;
}