11 #ifndef EIGEN_TRANSPOSE_H
12 #define EIGEN_TRANSPOSE_H
31 template<
typename MatrixType>
32 struct traits<Transpose<MatrixType> > : traits<MatrixType>
34 typedef typename MatrixType::Scalar Scalar;
35 typedef typename nested<MatrixType>::type MatrixTypeNested;
36 typedef typename remove_reference<MatrixTypeNested>::type MatrixTypeNestedPlain;
37 typedef typename traits<MatrixType>::StorageKind StorageKind;
38 typedef typename traits<MatrixType>::XprKind XprKind;
40 RowsAtCompileTime = MatrixType::ColsAtCompileTime,
41 ColsAtCompileTime = MatrixType::RowsAtCompileTime,
42 MaxRowsAtCompileTime = MatrixType::MaxColsAtCompileTime,
43 MaxColsAtCompileTime = MatrixType::MaxRowsAtCompileTime,
44 FlagsLvalueBit = is_lvalue<MatrixType>::value ?
LvalueBit : 0,
45 Flags0 = MatrixTypeNestedPlain::Flags & ~(
LvalueBit | NestByRefBit),
46 Flags1 = Flags0 | FlagsLvalueBit,
48 CoeffReadCost = MatrixTypeNestedPlain::CoeffReadCost,
49 InnerStrideAtCompileTime = inner_stride_at_compile_time<MatrixType>::ret,
50 OuterStrideAtCompileTime = outer_stride_at_compile_time<MatrixType>::ret
55 template<
typename MatrixType,
typename StorageKind>
class TransposeImpl;
58 :
public TransposeImpl<MatrixType,typename internal::traits<MatrixType>::StorageKind>
62 typedef typename TransposeImpl<MatrixType,typename internal::traits<MatrixType>::StorageKind>::Base Base;
65 inline Transpose(MatrixType& a_matrix) : m_matrix(a_matrix) {}
67 EIGEN_INHERIT_ASSIGNMENT_OPERATORS(
Transpose)
69 inline Index rows()
const {
return m_matrix.cols(); }
70 inline Index cols()
const {
return m_matrix.rows(); }
73 const typename internal::remove_all<typename MatrixType::Nested>::type&
77 typename internal::remove_all<typename MatrixType::Nested>::type&
81 typename MatrixType::Nested m_matrix;
86 template<typename MatrixType, bool HasDirectAccess = has_direct_access<MatrixType>::ret>
87 struct TransposeImpl_base
89 typedef typename dense_xpr_base<Transpose<MatrixType> >::type type;
92 template<
typename MatrixType>
93 struct TransposeImpl_base<MatrixType, false>
95 typedef typename dense_xpr_base<Transpose<MatrixType> >::type type;
100 template<
typename MatrixType>
class TransposeImpl<MatrixType,Dense>
101 :
public internal::TransposeImpl_base<MatrixType>::type
105 typedef typename internal::TransposeImpl_base<MatrixType>::type Base;
106 EIGEN_DENSE_PUBLIC_INTERFACE(Transpose<MatrixType>)
107 EIGEN_INHERIT_ASSIGNMENT_OPERATORS(TransposeImpl)
109 inline Index innerStride()
const {
return derived().nestedExpression().innerStride(); }
110 inline Index outerStride()
const {
return derived().nestedExpression().outerStride(); }
112 typedef typename internal::conditional<
113 internal::is_lvalue<MatrixType>::value,
116 >::type ScalarWithConstIfNotLvalue;
118 inline ScalarWithConstIfNotLvalue* data() {
return derived().nestedExpression().data(); }
119 inline const Scalar* data()
const {
return derived().nestedExpression().data(); }
121 inline ScalarWithConstIfNotLvalue& coeffRef(Index rowId, Index colId)
123 EIGEN_STATIC_ASSERT_LVALUE(MatrixType)
124 return derived().nestedExpression().const_cast_derived().coeffRef(colId, rowId);
127 inline ScalarWithConstIfNotLvalue& coeffRef(Index index)
129 EIGEN_STATIC_ASSERT_LVALUE(MatrixType)
130 return derived().nestedExpression().const_cast_derived().coeffRef(index);
133 inline const Scalar& coeffRef(Index rowId, Index colId)
const
135 return derived().nestedExpression().coeffRef(colId, rowId);
138 inline const Scalar& coeffRef(Index index)
const
140 return derived().nestedExpression().coeffRef(index);
143 inline CoeffReturnType coeff(Index rowId, Index colId)
const
145 return derived().nestedExpression().coeff(colId, rowId);
148 inline CoeffReturnType coeff(Index index)
const
150 return derived().nestedExpression().coeff(index);
153 template<
int LoadMode>
154 inline const PacketScalar packet(Index rowId, Index colId)
const
156 return derived().nestedExpression().template packet<LoadMode>(colId, rowId);
159 template<
int LoadMode>
160 inline void writePacket(Index rowId, Index colId,
const PacketScalar& x)
162 derived().nestedExpression().const_cast_derived().template writePacket<LoadMode>(colId, rowId, x);
165 template<
int LoadMode>
166 inline const PacketScalar packet(Index index)
const
168 return derived().nestedExpression().template packet<LoadMode>(index);
171 template<
int LoadMode>
172 inline void writePacket(Index index,
const PacketScalar& x)
174 derived().nestedExpression().const_cast_derived().template writePacket<LoadMode>(index, x);
197 template<
typename Derived>
198 inline Transpose<Derived>
209 template<
typename Derived>
235 template<
typename Derived>
239 return this->transpose();
249 template<
typename MatrixType,
250 bool IsSquare = (MatrixType::RowsAtCompileTime == MatrixType::ColsAtCompileTime) && MatrixType::RowsAtCompileTime!=
Dynamic>
251 struct inplace_transpose_selector;
253 template<
typename MatrixType>
254 struct inplace_transpose_selector<MatrixType,true> {
255 static void run(MatrixType& m) {
256 m.matrix().template triangularView<StrictlyUpper>().swap(m.matrix().transpose());
260 template<
typename MatrixType>
261 struct inplace_transpose_selector<MatrixType,false> {
262 static void run(MatrixType& m) {
263 if (m.rows()==m.cols())
264 m.matrix().template triangularView<StrictlyUpper>().swap(m.matrix().transpose());
266 m = m.transpose().eval();
291 template<
typename Derived>
294 eigen_assert((rows() == cols() || (RowsAtCompileTime ==
Dynamic && ColsAtCompileTime ==
Dynamic))
295 &&
"transposeInPlace() called on a non-square non-resizable matrix");
296 internal::inplace_transpose_selector<Derived>::run(derived());
322 template<
typename Derived>
325 derived() = adjoint().eval();
328 #ifndef EIGEN_NO_DEBUG
334 template<
typename BinOp,
typename NestedXpr,
typename Rhs>
335 struct blas_traits<SelfCwiseBinaryOp<BinOp,NestedXpr,Rhs> >
336 : blas_traits<NestedXpr>
338 typedef SelfCwiseBinaryOp<BinOp,NestedXpr,Rhs> XprType;
339 static inline const XprType extract(
const XprType& x) {
return x; }
342 template<
bool DestIsTransposed,
typename OtherDerived>
343 struct check_transpose_aliasing_compile_time_selector
345 enum { ret = bool(blas_traits<OtherDerived>::IsTransposed) != DestIsTransposed };
348 template<
bool DestIsTransposed,
typename BinOp,
typename DerivedA,
typename DerivedB>
349 struct check_transpose_aliasing_compile_time_selector<DestIsTransposed,CwiseBinaryOp<BinOp,DerivedA,DerivedB> >
351 enum { ret = bool(blas_traits<DerivedA>::IsTransposed) != DestIsTransposed
352 || bool(blas_traits<DerivedB>::IsTransposed) != DestIsTransposed
356 template<
typename Scalar,
bool DestIsTransposed,
typename OtherDerived>
357 struct check_transpose_aliasing_run_time_selector
359 static bool run(
const Scalar* dest,
const OtherDerived& src)
361 return (
bool(blas_traits<OtherDerived>::IsTransposed) != DestIsTransposed) && (dest!=0 && dest==(
const Scalar*)extract_data(src));
365 template<
typename Scalar,
bool DestIsTransposed,
typename BinOp,
typename DerivedA,
typename DerivedB>
366 struct check_transpose_aliasing_run_time_selector<Scalar,DestIsTransposed,CwiseBinaryOp<BinOp,DerivedA,DerivedB> >
368 static bool run(
const Scalar* dest,
const CwiseBinaryOp<BinOp,DerivedA,DerivedB>& src)
370 return ((blas_traits<DerivedA>::IsTransposed != DestIsTransposed) && (dest!=0 && dest==(
const Scalar*)extract_data(src.lhs())))
371 || ((blas_traits<DerivedB>::IsTransposed != DestIsTransposed) && (dest!=0 && dest==(
const Scalar*)extract_data(src.rhs())));
381 template<
typename Derived,
typename OtherDerived,
382 bool MightHaveTransposeAliasing
383 = check_transpose_aliasing_compile_time_selector
384 <blas_traits<Derived>::IsTransposed,OtherDerived>::ret
386 struct checkTransposeAliasing_impl
388 static void run(
const Derived& dst,
const OtherDerived& other)
390 eigen_assert((!check_transpose_aliasing_run_time_selector
391 <
typename Derived::Scalar,blas_traits<Derived>::IsTransposed,OtherDerived>
392 ::run(extract_data(dst), other))
393 &&
"aliasing detected during transposition, use transposeInPlace() "
394 "or evaluate the rhs into a temporary using .eval()");
399 template<
typename Derived,
typename OtherDerived>
400 struct checkTransposeAliasing_impl<Derived, OtherDerived, false>
402 static void run(
const Derived&,
const OtherDerived&)
409 template<
typename Derived>
410 template<
typename OtherDerived>
411 void DenseBase<Derived>::checkTransposeAliasing(
const OtherDerived& other)
const
413 internal::checkTransposeAliasing_impl<Derived, OtherDerived>::run(derived(), other);
419 #endif // EIGEN_TRANSPOSE_H
const internal::remove_all< typename MatrixType::Nested >::type & nestedExpression() const
Definition: Transpose.h:74
Expression of the transpose of a matrix.
Definition: Transpose.h:57
const int Dynamic
Definition: Constants.h:21
const unsigned int LvalueBit
Definition: Constants.h:131
void adjointInPlace()
Definition: Transpose.h:323
void transposeInPlace()
Definition: Transpose.h:292
Eigen::Transpose< Derived > transpose()
Definition: Transpose.h:199
const unsigned int RowMajorBit
Definition: Constants.h:53
internal::remove_all< typename MatrixType::Nested >::type & nestedExpression()
Definition: Transpose.h:78
const AdjointReturnType adjoint() const
Definition: Transpose.h:237
Base class for all dense matrices, vectors, and expressions.
Definition: MatrixBase.h:48