c++ - 将给定矩阵规范化为 C++ 中列项总和为 1 的矩阵

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

最佳答案

细胞核,

您的代码就快完成了。您忘记考虑的一件事是,变量 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/

相关文章:

c++ - 为什么包含 <map> 会导致在全局命名空间中定义 div 函数?

c - omp parallel 用于输出顺序

r - 如何在 for 中使用 arrangement?

javascript - 用 Javascript 创建一个猜数游戏 - 需要循环帮助

php - 在表单内从 SQL 访问信息

loops - lua:遍历表中的所有对

c++ - 如何使用 'n' 维数组声明 std::vector ?

c++ - 有什么地方可以让我查看 .NET 秒表代码并了解它在做什么?

c++ - 无法弄清楚为什么代码在 C++ 中崩溃

c++ - 使用(4 字节) `int` 表示数字和使用 4 元素无符号字符数组表示数字之间是否存在性能差异?