2016-10-12 2 views
4

Eigen::VectorXdScalar operator()(Index i)を持ち、ベクトルのインデックスiの係数を返します。しかし、Eigen::VectorXdEigen::Matrixの特殊タイプ、すなわちタイプEigen::Matrix<Scalar, Eigen::Dynamic, 1>;であるので、Scalar operator()(Index i, Index j)もある。Eigen :: VectorXdにアクセスする際に2番目のインデックスとしてゼロを使用するのは安全ですか?

質問:

は私がゼロにjを設定した場合、第2バージョンを使用する(すなわちなし未定義の動作)安全であることを前提とすることはできますか?言い換えれば、以下のコードはOKですか?

Eigen::VectorXd v(4); 
v << 1, 2, 3, 4; 
std::cout << v(2, 0); // displays 3 

それはOKだように見え、そこにすべての警告をデバッグモードでコンパイルされたときに何も失敗したアサーションや警告はありませんが、私は100%を確認していません。

+0

あなたはそれを試してみませんか? – mascoj

+0

私が言ったように私は試しましたが、いくつか風変わりなUBがある場合は、コードがOKであることをあなたに確かめさせません。 – vsoftco

+0

申し訳ありませんが、私は誤解しました。あなたの言葉によって、それはあなたがコンパイルしたように聞こえるようにしましたが、それを実行しませんでした。 – mascoj

答えて

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)); 
2

Iは@ggaels answer時に言えます。あなたはDenseCoeffsBase.hでoperator()定義(私は3.2.10を引用しています)を見れば、あなたは彼らが両方PlainObjectBase.hでcoeffRefの定義を見てみると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); 
} 

を呼び出すことがわかります

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)を記述する必要があります:私たちは、オフセットを簡単に計算されていることがわかります。

+0

コードスニペットをありがとう、本当に安心しています。 – vsoftco

関連する問題