mirror of
https://gitlab.com/libeigen/eigen.git
synced 2025-08-12 03:39:01 +08:00
Implement evaluator for Diagonal.
This commit is contained in:
parent
f924722f3b
commit
3457965bf5
@ -881,6 +881,52 @@ protected:
|
|||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
|
// -------------------- Diagonal --------------------
|
||||||
|
|
||||||
|
template<typename ArgType, int DiagIndex>
|
||||||
|
struct evaluator_impl<Diagonal<ArgType, DiagIndex> >
|
||||||
|
{
|
||||||
|
typedef Diagonal<ArgType, DiagIndex> DiagonalType;
|
||||||
|
|
||||||
|
evaluator_impl(const DiagonalType& diagonal)
|
||||||
|
: m_argImpl(diagonal.nestedExpression()),
|
||||||
|
m_index(diagonal.index())
|
||||||
|
{ }
|
||||||
|
|
||||||
|
typedef typename DiagonalType::Index Index;
|
||||||
|
typedef typename DiagonalType::Scalar Scalar;
|
||||||
|
typedef typename DiagonalType::CoeffReturnType CoeffReturnType;
|
||||||
|
|
||||||
|
CoeffReturnType coeff(Index row, Index) const
|
||||||
|
{
|
||||||
|
return m_argImpl.coeff(row + rowOffset(), row + colOffset());
|
||||||
|
}
|
||||||
|
|
||||||
|
CoeffReturnType coeff(Index index) const
|
||||||
|
{
|
||||||
|
return m_argImpl.coeff(index + rowOffset(), index + colOffset());
|
||||||
|
}
|
||||||
|
|
||||||
|
Scalar& coeffRef(Index row, Index)
|
||||||
|
{
|
||||||
|
return m_argImpl.coeffRef(row + rowOffset(), row + colOffset());
|
||||||
|
}
|
||||||
|
|
||||||
|
Scalar& coeffRef(Index index)
|
||||||
|
{
|
||||||
|
return m_argImpl.coeffRef(index + rowOffset(), index + colOffset());
|
||||||
|
}
|
||||||
|
|
||||||
|
protected:
|
||||||
|
typename evaluator<ArgType>::type m_argImpl;
|
||||||
|
Index m_index; // TODO: Don't use if known at compile time
|
||||||
|
|
||||||
|
private:
|
||||||
|
EIGEN_STRONG_INLINE Index rowOffset() const { return m_index>0 ? 0 : -m_index; }
|
||||||
|
EIGEN_STRONG_INLINE Index colOffset() const { return m_index>0 ? m_index : 0; }
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
} // namespace internal
|
} // namespace internal
|
||||||
|
|
||||||
#endif // EIGEN_COREEVALUATORS_H
|
#endif // EIGEN_COREEVALUATORS_H
|
||||||
|
@ -133,6 +133,17 @@ template<typename MatrixType, int DiagIndex> class Diagonal
|
|||||||
return m_matrix.coeff(index+rowOffset(), index+colOffset());
|
return m_matrix.coeff(index+rowOffset(), index+colOffset());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
const typename internal::remove_all<typename MatrixType::Nested>::type&
|
||||||
|
nestedExpression() const
|
||||||
|
{
|
||||||
|
return m_matrix;
|
||||||
|
}
|
||||||
|
|
||||||
|
int index() const
|
||||||
|
{
|
||||||
|
return m_index.value();
|
||||||
|
}
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
const typename MatrixType::Nested m_matrix;
|
const typename MatrixType::Nested m_matrix;
|
||||||
const internal::variable_if_dynamic<Index, DiagIndex> m_index;
|
const internal::variable_if_dynamic<Index, DiagIndex> m_index;
|
||||||
|
@ -197,7 +197,22 @@ void test_evaluators()
|
|||||||
VERIFY_IS_APPROX_EVALUATOR(arr2, arr1.reverse());
|
VERIFY_IS_APPROX_EVALUATOR(arr2, arr1.reverse());
|
||||||
VERIFY_IS_APPROX_EVALUATOR(arr2, arr1.colwise().reverse());
|
VERIFY_IS_APPROX_EVALUATOR(arr2, arr1.colwise().reverse());
|
||||||
VERIFY_IS_APPROX_EVALUATOR(arr2, arr1.rowwise().reverse());
|
VERIFY_IS_APPROX_EVALUATOR(arr2, arr1.rowwise().reverse());
|
||||||
|
|
||||||
arr2.reverse() = arr1;
|
arr2.reverse() = arr1;
|
||||||
VERIFY_IS_APPROX(arr2, arr1.reverse());
|
VERIFY_IS_APPROX(arr2, arr1.reverse());
|
||||||
|
|
||||||
|
// test Diagonal
|
||||||
|
VERIFY_IS_APPROX_EVALUATOR(vec1, mat1.diagonal());
|
||||||
|
vec1.resize(5);
|
||||||
|
VERIFY_IS_APPROX_EVALUATOR(vec1, mat1.diagonal(1));
|
||||||
|
VERIFY_IS_APPROX_EVALUATOR(vec1, mat1.diagonal<-1>());
|
||||||
|
vec1.setRandom();
|
||||||
|
|
||||||
|
mat2 = mat1;
|
||||||
|
copy_using_evaluator(mat1.diagonal(1), vec1);
|
||||||
|
mat2.diagonal(1) = vec1;
|
||||||
|
VERIFY_IS_APPROX(mat1, mat2);
|
||||||
|
|
||||||
|
copy_using_evaluator(mat1.diagonal<-1>(), mat1.diagonal(1));
|
||||||
|
mat2.diagonal<-1>() = mat2.diagonal(1);
|
||||||
|
VERIFY_IS_APPROX(mat1, mat2);
|
||||||
}
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user