37#ifndef STK_RESHAPEOPERATORS_H
38#define STK_RESHAPEOPERATORS_H
41#define EGAL(arg1, arg2) ((arg1::structure_ == int(Arrays::arg2)))
46template<
typename Lhs>
class DiagonalizeOperator;
47template<
typename Lhs>
class DiagonalGetterOperator;
48template<
typename Lhs>
class UpperTriangularizeOperator;
49template<
typename Lhs>
class LowerTriangularizeOperator;
50template<
typename Lhs>
class SymmetrizeOperator;
51template<
typename Lhs>
class UpperSymmetrizeOperator;
52template<
typename Lhs>
class LowerSymmetrizeOperator;
65 orient_ = Lhs::orient_,
69 sizeCols_ = (
Lhs::structure_==
int(Arrays::diagonal_) )
71 :
Lhs::structure_==
int(Arrays::point_) ?
Lhs::sizeCols_ :
Lhs::sizeRows_,
72 storage_ =
Lhs::storage_
76 typedef typename Lhs::Type
Type;
97template<
typename Lhs>
112 size_ = (sizeRows_ !=
UnknownSize) ? sizeRows_ : sizeCols_
128 inline Lhs const&
lhs()
const {
return lhs_; }
135#ifdef STK_BOUNDS_CHECK
138 return (lhs_.elt(
i));
157template<
typename Lhs>
162 structure_ = Arrays::diagonal_,
163 orient_ = Lhs::orient_,
164 sizeRows_ = ((Lhs::sizeRows_ < Lhs::sizeCols_)) ? Lhs::sizeRows_ : Lhs::sizeCols_,
165 sizeCols_ = sizeRows_,
166 storage_ = Lhs::storage_,
176 use_ = (sizeRows_ !=
UnknownSize) ? Arrays::useLhsSize_ : Arrays::useLhsOtherSize_,
177 size_ = (sizeRows_ !=
UnknownSize) ? sizeRows_ : sizeCols_
181 typedef typename Lhs::Type
Type;
203template<
typename Lhs>
232#ifdef STK_BOUNDS_CHECK
233 if (lhs.rows()!=lhs.cols())
238 inline Lhs const&
lhs()
const {
return lhs_; }
265template<
typename Lhs>
270 structure_ = Arrays::upper_triangular_,
271 orient_ = Lhs::orient_,
272 sizeRows_ = Lhs::sizeRows_,
273 sizeCols_ = Lhs::sizeCols_,
274 storage_ = Lhs::storage_
278 typedef typename Lhs::Type
Type;
300template<
typename Lhs>
324 inline Lhs const&
lhs()
const {
return lhs_; }
335#ifdef STK_BOUNDS_CHECK
339 return (lhs_.elt(
i,
j));
352template<
typename Lhs>
357 structure_ = Arrays::lower_triangular_,
358 orient_ = Lhs::orient_,
359 sizeRows_ = Lhs::sizeRows_,
360 sizeCols_ = Lhs::sizeCols_,
361 storage_ = Lhs::storage_
365 typedef typename Lhs::Type
Type;
386template<
typename Lhs>
410 inline Lhs const&
lhs()
const {
return lhs_; }
421#ifdef STK_BOUNDS_CHECK
425 return (lhs_.elt(
i,
j));
437template<
typename Lhs>
442 structure_ = Arrays::symmetric_,
443 orient_ = Lhs::orient_,
444 sizeRows_ = Lhs::sizeRows_,
445 sizeCols_ = Lhs::sizeCols_,
446 storage_ = Lhs::storage_
450 typedef typename Lhs::Type
Type;
472template<
typename Lhs>
497 inline Lhs const&
lhs()
const {
return lhs_; }
507 {
return (lhs_.elt(
i,
j));}
519template<
typename Lhs>
524 structure_ = Arrays::upper_symmetric_,
525 orient_ = Lhs::orient_,
526 sizeRows_ = Lhs::sizeRows_,
527 sizeCols_ = Lhs::sizeCols_,
528 storage_ = Lhs::storage_
532 typedef typename Lhs::Type
Type;
554template<
typename Lhs>
579 inline Lhs const&
lhs()
const {
return lhs_; }
589 {
return ((
j<
i) ? lhs_.elt(
j,
i) : lhs_.elt(
i,
j));}
600template<
typename Lhs>
605 structure_ = Arrays::lower_symmetric_,
606 orient_ = Lhs::orient_,
607 sizeRows_ = Lhs::sizeRows_,
608 sizeCols_ = Lhs::sizeCols_,
609 storage_ = Lhs::storage_
613 typedef typename Lhs::Type
Type;
635template<
typename Lhs>
660 inline Lhs const&
lhs()
const {
return lhs_; }
670 {
return ((
j>
i) ? lhs_.elt(
j,
i) : lhs_.elt(
i,
j));}
#define STKOUT_OF_RANGE_2ARG(Where, Arg1, Arg2, Error)
#define STKRUNTIME_ERROR_NO_ARG(Where, Error)
#define STKRUNTIME_ERROR_2ARG(Where, Arg1, Arg2, Error)
#define STK_STATIC_ASSERT(COND, MSG)
#define STK_STATIC_ASSERT_ONE_DIMENSION_ONLY(EXPR)
#define STK_STATIC_ASSERT_TWO_DIMENSIONS_ONLY(EXPR)
Generic expression when we want to get the diagonal of a two-dimensional square expression.
TRange< size_ > RowRange
Type of the Range for the rows.
TRange< size_ > ColRange
Type of the Range for the columns.
hidden::DiagonalRangeImpl< Lhs, size_, use_ > RangeImpl
TypeConst elt1Impl(int i) const
TypeConst elt0Impl() const
DiagonalGetterOperator(Lhs const &lhs)
Constructor.
hidden::Traits< DiagonalGetterOperator< Lhs > >::Type Type
ExprBase< DiagonalGetterOperator< Lhs > > Base
ColRange const & colsImpl() const
RowRange const & rowsImpl() const
hidden::Traits< DiagonalGetterOperator< Lhs > >::TypeConst TypeConst
TypeConst elt2Impl(int i, int j) const
Generic expression when a one dimensional vector/point/idagonal expression is "diagonalized".
ExprBase< DiagonalizeOperator< Lhs > > Base
TypeConst elt1Impl(int i) const
TypeConst elt0Impl() const
TypeConst elt2Impl(int i, int j) const
DiagonalizeOperator(Lhs const &lhs)
Constructor.
TRange< size_ > RowRange
Type of the Range for the rows.
RowRange const & rowsImpl() const
TRange< size_ > ColRange
Type of the Range for the columns.
hidden::Traits< DiagonalizeOperator< Lhs > >::Type Type
ColRange const & colsImpl() const
hidden::Traits< DiagonalizeOperator< Lhs > >::TypeConst TypeConst
base class for template evaluation expressions and visitors.
Generic expression when we want to get the lower-part of a two-dimensional symmetric expression.
hidden::Traits< LowerSymmetrizeOperator< Lhs > >::TypeConst TypeConst
TRange< sizeRows_ > RowRange
Type of the Range for the rows.
TypeConst elt2Impl(int i, int j) const
hidden::Traits< LowerSymmetrizeOperator< Lhs > >::Type Type
LowerSymmetrizeOperator(Lhs const &lhs)
Constructor.
TRange< sizeCols_ > ColRange
Type of the Range for the columns.
ExprBase< LowerSymmetrizeOperator< Lhs > > Base
ColRange const & colsImpl() const
RowRange const & rowsImpl() const
Generic expression when we want to get the lower-part of a two-dimensional expression.
LowerTriangularizeOperator(Lhs const &lhs)
Constructor.
hidden::Traits< LowerTriangularizeOperator< Lhs > >::Type Type
TRange< sizeCols_ > ColRange
Type of the Range for the columns.
TypeConst elt2Impl(int i, int j) const
ColRange const & colsImpl() const
RowRange const & rowsImpl() const
ExprBase< LowerTriangularizeOperator< Lhs > > Base
TRange< sizeRows_ > RowRange
Type of the Range for the rows.
hidden::Traits< LowerTriangularizeOperator< Lhs > >::TypeConst TypeConst
The MultidimRegression class allows to regress a multidimensional output variable among a multivariat...
Generic expression when we want to get the upper-part of a two-dimensional symmetric expression.
TypeConst elt2Impl(int i, int j) const
RowRange const & rowsImpl() const
hidden::Traits< SymmetrizeOperator< Lhs > >::Type Type
SymmetrizeOperator(Lhs const &lhs)
Constructor.
ExprBase< SymmetrizeOperator< Lhs > > Base
TRange< sizeRows_ > RowRange
Type of the Range for the rows.
TRange< sizeCols_ > ColRange
Type of the Range for the columns.
ColRange const & colsImpl() const
hidden::Traits< SymmetrizeOperator< Lhs > >::TypeConst TypeConst
Generic expression when we want to get the upper-part of a two-dimensional symmetric expression.
TypeConst elt2Impl(int i, int j) const
hidden::Traits< UpperSymmetrizeOperator< Lhs > >::TypeConst TypeConst
UpperSymmetrizeOperator(Lhs const &lhs)
Constructor.
hidden::Traits< UpperSymmetrizeOperator< Lhs > >::Type Type
ExprBase< UpperSymmetrizeOperator< Lhs > > Base
TRange< sizeCols_ > ColRange
Type of the Range for the columns.
ColRange const & colsImpl() const
TRange< sizeRows_ > RowRange
Type of the Range for the rows.
RowRange const & rowsImpl() const
Generic expression when we want to get the upper-part of a two-dimensional expression.
TRange< sizeRows_ > RowRange
Type of the Range for the rows.
UpperTriangularizeOperator(Lhs const &lhs)
Constructor.
RowRange const & rowsImpl() const
hidden::Traits< UpperTriangularizeOperator< Lhs > >::Type Type
hidden::Traits< UpperTriangularizeOperator< Lhs > >::TypeConst TypeConst
TypeConst elt2Impl(int i, int j) const
TRange< sizeCols_ > ColRange
Type of the Range for the columns.
ExprBase< UpperTriangularizeOperator< Lhs > > Base
ColRange const & colsImpl() const
@ diagonal_
diagonal matrix/array/expression
const int UnknownSize
This value means that an integer is not known at compile-time, and that instead the value is stored i...
The namespace STK is the main domain space of the Statistical ToolKit project.
Base class for all referencing containers.
Allow to disambiguate the call to range to use.
ColOperator< DiagonalGetterOperator< Lhs > > Col
RowOperator< DiagonalGetterOperator< Lhs > > Row
RowOperator< DiagonalizeOperator< Lhs > > Row
ColOperator< DiagonalizeOperator< Lhs > > Col
RowOperator< LowerSymmetrizeOperator< Lhs > > Row
ColOperator< LowerSymmetrizeOperator< Lhs > > Col
RowOperator< LowerTriangularizeOperator< Lhs > > Row
ColOperator< LowerTriangularizeOperator< Lhs > > Col
RowOperator< SymmetrizeOperator< Lhs > > Row
ColOperator< SymmetrizeOperator< Lhs > > Col
RowOperator< UpperSymmetrizeOperator< Lhs > > Row
ColOperator< UpperSymmetrizeOperator< Lhs > > Col
ColOperator< UpperTriangularizeOperator< Lhs > > Col
RowOperator< UpperTriangularizeOperator< Lhs > > Row