6

每次计算此行时,我都会收到此错误

double k = b.transpose()*Z.inverse()*b;

哪里Eigen::MatrixXd Z(3,3), b(3,1);。我试过铸造但没有运气。有什么建议么?

4

2 回答 2

7

结果默认是一个 Eigen 表达式(把它想象成一个矩阵,技术上是一个称为 的模板类型Eigen::GeneralProduct<...>),所以即使矩阵是1 x 1,它也不能隐式转换为double。你要做的是访问它的(0)元素(或者(0,0),它没有区别),见下文

Eigen::MatrixXd Z(3,3), b(3,1);
double k = (b.transpose()*Z.inverse()*b)(0);

PS:正如@ggael 所提到的,您应该使用 anEigen::VectorXd作为 的类型b,在这种情况下,结果可以隐式转换为 a double

于 2014-08-03T18:47:44.340 回答
3

这对我有用,因此请确保将 b 声明为 aVectorXd这样 Eigen 可以在编译时知道结果是1x1矩阵,因此可以安全地将其转换为标量值。这是一个独立的示例:

#include <Eigen/Dense>
using namespace Eigen;
int main() {
  int n = 10;
  VectorXd b(n);
  MatrixXd Z(n,n);
  double k = b.transpose() * Z.inverse() * b;
}
于 2014-08-04T13:37:26.827 回答