特征:访问ProductBase系数

时间:2013-08-11 06:42:31

标签: c++ eigen

以下代码片段来自Eigen断言:

MatrixXd L;
VectorXd x, b;
...
ASSERT_MATRIX_EQ(L*x, b);

使用,

template <typename DerivedL, typename DerivedR>
void ASSERT_MATRIX_EQ(const Eigen::DenseBase<DerivedL>& A, const Eigen::DenseBase<DerivedR>& B, double tol=1e-7) {
    ASSERT_EQ(A.rows(), B.rows());
    ASSERT_EQ(A.cols(), B.cols());
    for(int i=0; i < A.rows(); i++) {
        for(int j=0; j < A.cols(); j++) {
            ASSERT_NEAR(A(i,j), B(i,j), tol);
        }
    }
}

它因错误而死:

test_leq: /usr/include/eigen3/Eigen/src/Core/ProductBase.h:154: typename Base::CoeffReturnType Eigen::ProductBase<Eigen::GeneralProduct<Eigen::Matrix<double, -1, -1, 0, -1, -1>, Eigen::Matrix<double, -1, 1, 0, -1, 1>, 4>, Eigen::Matrix<double, -1, -1, 0, -1, -1>, Eigen::Matrix<double, -1, 1, 0, -1, 1> >::coeff(Index, Index) const: Assertion `this->rows() == 1 && this->cols() == 1' failed.

致电A(i,j)。 (但是,我可以打电话给cout << A << endl;就好了。)

在第154行,ProductBase.h奇怪地有断言

    // restrict coeff accessors to 1x1 expressions. No need to care about mutators here since this isnt a Lvalue expression
    typename Base::CoeffReturnType coeff(Index row, Index col) const
    {
#ifdef EIGEN2_SUPPORT
      return lhs().row(row).cwiseProduct(rhs().col(col).transpose()).sum();
#else
      EIGEN_STATIC_ASSERT_SIZE_1x1(Derived)
      eigen_assert(this->rows() == 1 && this->cols() == 1);
      return derived().coeff(row,col);
#endif
    }

我正在关注Eigen's guide来编写泛型矩阵函数。如何正确编写此通用函数?

编辑:了解ProductBase期望1x1矩阵的原因也很好。

1 个答案:

答案 0 :(得分:1)

Eigen邮件列表上的thread表示有意禁用ProductBase上的系数访问。现在的解决方案是避免像foobar(A*x)这样的表达式。