Eigen :: Ref和Eigen :: MatrixBase之间的不同行为

时间:2017-03-30 16:38:30

标签: eigen

我想知道为什么以下代码会生成编译时错误:

void f(const double e) {}

template <typename Derived>
void f(const Eigen::MatrixBase<Derived>& m) {}

int main {
  Eigen::Matrix<double, 2, 1> m1;
  Eigen::Matrix<double, 2, 1> m2;
  m1 << 1.0, 2.0;
  m2 << 1.0, 2.0;
  f(m1.transpose() * m2);  // no error
}

而下一个没有。

$member.children

1 个答案:

答案 0 :(得分:4)

这是因为在你的情况下m1.transpose() * m2是一个允许分配给标量的内积:

double v = m1.transpose() * m2;

这是允许将1x1矩阵表达式转换为标量的唯一情况。在第二个版本中没有歧义,因为表达式m1.transpose() * m2的类型继承MatrixBase