需要一些有关本征的建议。
我想通过矢量(单列矩阵)'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 |
如果简单地说,我想创建一个由两个向量组成的乘法表,并将其添加到另一个矩阵中。
如何以最有效,最优雅的方式做到这一点?
我发现了两种方法:
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 = a * b.transpose();
请注意,这是比您可能会更熟悉的a.transpose() * b
相对的方式,它是产生单个标量的点积。