在访问Eigen :: VectorXd时使用零作为第二个索引是否安全?

时间:2016-10-12 20:53:09

标签: c++ eigen

privateDB.perform(myQuery, inZoneWith: nil) {records, error in if error != nil { print (error?.localizedDescription) if error?._code == CKError.notAuthenticated.rawValue { // Solve problems here... } Eigen::VectorXd,它返回向量中索引Scalar operator()(Index i)处的系数。但是,由于iEigen::VectorXd的特殊类型,即Eigen::Matrix类型,因此还有Eigen::Matrix<Scalar, Eigen::Dynamic, 1>;

问题:

如果我将Scalar operator()(Index i, Index j)设置为零,我可以假设使用第二个版本是安全的(即没有未定义的行为)吗?换句话说,下面的代码是否正常?

j

看起来没关系,在调试模式下编译所有警告时都没有失败的断言或警告,但我不是100%肯定。

2 个答案:

答案 0 :(得分:4)

只要v是列向量,它就是安全的,而使用v(i)则适用于列和行向量,例如:

template<typename T>
void foo(const T &v) {
  v(2);   // OK
  v(2,0); // -> out of bounds runtime assertion
}
MatrixXd mat(10,10);
foo(mat.row(5));

答案 1 :(得分:2)

我将阐述@ggaels answer。如果您查看DenseCoeffsBase.h中的operator()定义(我引用的是3.2.10),您会看到他们都致电coeff(或coeffRef

EIGEN_STRONG_INLINE CoeffReturnType operator()(Index row, Index col) const
{
  eigen_assert(row >= 0 && row < rows()
      && col >= 0 && col < cols());
  return derived().coeff(row, col);
}

EIGEN_STRONG_INLINE CoeffReturnType
operator()(Index index) const
{
  eigen_assert(index >= 0 && index < size());
  return derived().coeff(index);
}

在PlainObjectBase.h中查看coeffRef的定义,我们看到偏移量的计算简单:

EIGEN_STRONG_INLINE Scalar& coeffRef(Index rowId, Index colId)
{
  if(Flags & RowMajorBit)
    return m_storage.data()[colId + rowId * m_storage.cols()];
  else // column-major
    return m_storage.data()[rowId + colId * m_storage.rows()];
}

EIGEN_STRONG_INLINE Scalar& coeffRef(Index index)
{
  return m_storage.data()[index];
}

因此,在行向量的情况下,您必须编写v(0,2)以避免可能的断言失败/超出边界错误。