c++ - C++ 特征。需要建议
问题描述
需要一些关于 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 |
如果简单的话,我想创建由两个向量组成的乘法表并将其添加到另一个矩阵中。
我怎样才能以最有效和优雅的方式做到这一点?
我发现了两种方法:
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
请注意,这是您可能更熟悉的相反方式,即产生单个标量的点积。
推荐阅读
- php - 如何检查关联数组是否包含一个值并且仅包含该值?
- dart - 如何强制flutter使用wifi而不是4G?
- django - 使用 django request.META 附加一个新的 Http 标头
- android - 如何将 Flare 动画导入原生 Android 项目?
- gradle - Gradle 如何检测可选命令?
- grafana - 在 Prometheus/Grafana 中创建一个变量,默认选择所有值
- jenkins - 从jenkins下载工件时如何修复“ENOENT:没有这样的文件或目录”
- python - Python中的数据类型更改:使用删除数据类型更改删除行时
- genetic-programming - 在遗传编程 DEAP 中,评估停留在局部最优。如何防止 GP 收敛到局部最优?
- java - 无法正确计算循环