C++ 专有。需要建议

C++ Eigen. Need advice

需要一些关于 Eigen 的建议。

我想通过向量系数(单列矩阵)'a' 和 'b' 创建矩阵,方法如下:

| a0*b0 | a0*b1 | a0*b2 | ... | a0*bn |
| a1*b0 | a1*b1 | a1*b2 | ... | a1*bn |
| a2*b0 | a2*b1 | a2*b2 | ... | a2*bn |
| ...   | ...   | ...   | ... | ...   |
| am*b0 | am*b1 | am*b2 | ... | am*bn |

如果简单的话,我想创建由两个向量组成的乘法 table 并将其添加到另一个矩阵。

我怎样才能以最有效和优雅的方式做到这一点?

我找到了两个方法:

Matrix<float, -1, 1> a = new Matrix<float, -1, 1>(6);
Matrix<float, -1, 1> b = new Matrix<float, -1, 1>(4);
MatrixXf SomeNotEmptyMatrix = new MatrixXf(6, 4);

SomeNotEmptyMatrix += a.asDiagonal()*MatrixXf::Constant(6, 4, 1.0)*b.asDiagonal();

Matrix<float, -1, 1> a = new Matrix<float, -1, 1>(6);
Matrix<float, -1, 1> b = new Matrix<float, -1, 1>(4);
MatrixXf SomeNotEmptyMatrix = new MatrixXf(6, 4);

for(int32_t i = 0; i < 4; i++){
  SomeNotEmptyMatrix.colwise() += a*b(i, 0);
}

但我不认为这些是最好的。在第一个实例中,临时矩阵 MatrixXf::Constant(6, 4, 1.0) 将被分配。在第二种情况下,我使用外部循环。

这称为外积,只需使用标准矩阵积即可从 Eigen 中的两个向量完成:

MatrixXf result = a * b.transpose();

请注意,这是与您可能更熟悉的 a.transpose() * b 相反的方式,后者是产生单个标量的点积。