37#ifndef STK_RESHAPEACCESSORS_H
38#define STK_RESHAPEACCESSORS_H
41#define EGAL(arg1, arg2) ((arg1::structure_ == int(Arrays::arg2)))
46template<
typename Lhs>
class DiagonalizeAccessor;
47template<
typename Lhs>
class DiagonalGetterAccessor;
48template<
typename Lhs>
class UpperTriangularizeAccessor;
49template<
typename Lhs>
class LowerTriangularizeAccessor;
50template<
typename Lhs>
class SymmetrizeAccessor;
51template<
typename Lhs>
class UpperSymmetrizeAccessor;
52template<
typename Lhs>
class LowerSymmetrizeAccessor;
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;
99template<
typename Lhs>
114 size_ = (sizeRows_ !=
UnknownSize) ? sizeRows_ : sizeCols_
130 inline Lhs const&
lhs()
const {
return lhs_; }
148#ifdef STK_BOUNDS_CHECK
151 return (lhs_.elt(
i));
170template<
typename Lhs>
175 structure_ = Arrays::diagonal_,
176 orient_ = Lhs::orient_,
177 sizeRows_ = ((Lhs::sizeRows_ < Lhs::sizeCols_)) ? Lhs::sizeRows_ : Lhs::sizeCols_,
178 sizeCols_ = sizeRows_,
179 storage_ = Lhs::storage_,
189 use_ = (sizeRows_ !=
UnknownSize) ? Arrays::useLhsSize_ : Arrays::useLhsOtherSize_,
190 size_ = (sizeRows_ !=
UnknownSize) ? sizeRows_ : sizeCols_
194 typedef typename Lhs::Type
Type;
217template<
typename Lhs>
246#ifdef STK_BOUNDS_CHECK
247 if (lhs.rows()!=lhs.cols())
252 inline Lhs const&
lhs()
const {
return lhs_; }
289template<
typename Lhs>
294 structure_ = Arrays::upper_triangular_,
295 orient_ = Lhs::orient_,
296 sizeRows_ = Lhs::sizeRows_,
297 sizeCols_ = Lhs::sizeCols_,
298 storage_ = Lhs::storage_
302 typedef typename Lhs::Type
Type;
324template<
typename Lhs>
348 inline Lhs const&
lhs()
const {
return lhs_; }
359#ifdef STK_BOUNDS_CHECK
363 return (lhs_.elt(
i,
j));
370#ifdef STK_BOUNDS_CHECK
374 return (lhs_.elt(
i,
j));
386template<
typename Lhs>
391 structure_ = Arrays::lower_triangular_,
392 orient_ = Lhs::orient_,
393 sizeRows_ = Lhs::sizeRows_,
394 sizeCols_ = Lhs::sizeCols_,
395 storage_ = Lhs::storage_
399 typedef typename Lhs::Type
Type;
421template<
typename Lhs>
445 inline Lhs const&
lhs()
const {
return lhs_; }
456#ifdef STK_BOUNDS_CHECK
460 return (lhs_.elt(
i,
j));
468#ifdef STK_BOUNDS_CHECK
472 return (lhs_.elt(
i,
j));
484template<
typename Lhs>
489 structure_ = Arrays::symmetric_,
490 orient_ = Lhs::orient_,
491 sizeRows_ = Lhs::sizeRows_,
492 sizeCols_ = Lhs::sizeCols_,
493 storage_ = Lhs::storage_
497 typedef typename Lhs::Type
Type;
519template<
typename Lhs>
544 inline Lhs const&
lhs()
const {
return lhs_; }
554 {
return (lhs_.elt(
i,
j));}
570template<
typename Lhs>
575 structure_ = Arrays::upper_symmetric_,
576 orient_ = Lhs::orient_,
577 sizeRows_ = Lhs::sizeRows_,
578 sizeCols_ = Lhs::sizeCols_,
579 storage_ = Lhs::storage_
583 typedef typename Lhs::Type
Type;
605template<
typename Lhs>
630 inline Lhs const&
lhs()
const {
return lhs_; }
640 {
return ((
j<
i) ? lhs_.elt(
j,
i) : lhs_.elt(
i,
j));}
649 {
return ((
j<
i) ? lhs_.elt(
j,
i) : lhs_.elt(
i,
j));}
660template<
typename Lhs>
665 structure_ = Arrays::lower_symmetric_,
666 orient_ = Lhs::orient_,
667 sizeRows_ = Lhs::sizeRows_,
668 sizeCols_ = Lhs::sizeCols_,
669 storage_ = Lhs::storage_
673 typedef typename Lhs::Type
Type;
696template<
typename Lhs>
721 inline Lhs const&
lhs()
const {
return lhs_; }
731 {
return ((
j>
i) ? lhs_.elt(
j,
i) : lhs_.elt(
i,
j));}
737 {
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)
base class for template arrays.
Generic expression when we want to get the diagonal of a two-dimensional square expression.
Type & elt2Impl(int i, int j)
hidden::Traits< DiagonalGetterAccessor< Lhs > >::Type Type
ColRange const & colsImpl() const
TRange< size_ > RowRange
Type of the Range for the rows.
ArrayBase< DiagonalGetterAccessor< Lhs > > Base
TRange< size_ > ColRange
Type of the Range for the columns.
RowRange const & rowsImpl() const
hidden::Traits< DiagonalGetterAccessor< Lhs > >::TypeConst TypeConst
hidden::DiagonalRangeImpl< Lhs, size_, use_ > RangeImpl
TypeConst elt1Impl(int i) const
TypeConst elt2Impl(int i, int j) const
DiagonalGetterAccessor(Lhs &lhs)
Constructor.
TypeConst elt0Impl() const
Generic expression when a one dimensional vector/point/idagonal expression is "diagonalized".
ArrayBase< DiagonalizeAccessor< Lhs > > Base
TypeConst elt0Impl() const
hidden::Traits< DiagonalizeAccessor< Lhs > >::TypeConst TypeConst
TRange< size_ > RowRange
Type of the Range for the rows.
TypeConst elt2Impl(int i, int j) const
TRange< size_ > ColRange
Type of the Range for the columns.
TypeConst elt1Impl(int i) const
RowRange const & rowsImpl() const
ColRange const & colsImpl() const
Type & elt2Impl(int i, int j)
hidden::Traits< DiagonalizeAccessor< Lhs > >::Type Type
DiagonalizeAccessor(Lhs &lhs)
Constructor.
Generic expression when we want to get the lower-part of a two-dimensional symmetric expression.
TypeConst elt2Impl(int i, int j) const
TRange< sizeCols_ > ColRange
Type of the Range for the columns.
ArrayBase< LowerSymmetrizeAccessor< Lhs > > Base
RowRange const & rowsImpl() const
Type & elt2Impl(int i, int j)
TRange< sizeRows_ > RowRange
Type of the Range for the rows.
hidden::Traits< LowerSymmetrizeAccessor< Lhs > >::TypeConst TypeConst
hidden::Traits< LowerSymmetrizeAccessor< Lhs > >::Type Type
LowerSymmetrizeAccessor(Lhs &lhs)
Constructor.
ColRange const & colsImpl() const
Generic expression when we want to get the lower-part of a two-dimensional expression.
Type & elt2Impl(int i, int j)
hidden::Traits< LowerTriangularizeAccessor< Lhs > >::Type Type
LowerTriangularizeAccessor(Lhs &lhs)
Constructor.
TypeConst elt2Impl(int i, int j) const
TRange< sizeRows_ > RowRange
Type of the Range for the rows.
RowRange const & rowsImpl() const
ArrayBase< LowerTriangularizeAccessor< Lhs > > Base
ColRange const & colsImpl() const
hidden::Traits< LowerTriangularizeAccessor< Lhs > >::TypeConst TypeConst
TRange< sizeCols_ > ColRange
Type of the Range for the columns.
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.
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< SymmetrizeAccessor< Lhs > >::TypeConst TypeConst
ArrayBase< SymmetrizeAccessor< Lhs > > Base
RowRange const & rowsImpl() const
hidden::Traits< SymmetrizeAccessor< Lhs > >::Type Type
SymmetrizeAccessor(Lhs &lhs)
Constructor.
Type & elt2Impl(int i, int j)
TypeConst elt2Impl(int i, int j) const
Generic expression when we want to get the upper-part of a two-dimensional symmetric expression.
TRange< sizeRows_ > RowRange
Type of the Range for the rows.
Type & elt2Impl(int i, int j)
hidden::Traits< UpperSymmetrizeAccessor< Lhs > >::TypeConst TypeConst
RowRange const & rowsImpl() const
ColRange const & colsImpl() const
ArrayBase< UpperSymmetrizeAccessor< Lhs > > Base
hidden::Traits< UpperSymmetrizeAccessor< Lhs > >::Type Type
TypeConst elt2Impl(int i, int j) const
UpperSymmetrizeAccessor(Lhs &lhs)
Constructor.
TRange< sizeCols_ > ColRange
Type of the Range for the columns.
Generic expression when we want to get the upper-part of a two-dimensional expression.
ArrayBase< UpperTriangularizeAccessor< Lhs > > Base
TRange< sizeCols_ > ColRange
Type of the Range for the columns.
TRange< sizeRows_ > RowRange
Type of the Range for the rows.
TypeConst elt2Impl(int i, int j) const
hidden::Traits< UpperTriangularizeAccessor< Lhs > >::TypeConst TypeConst
UpperTriangularizeAccessor(Lhs &lhs)
Constructor.
Type & elt2Impl(int i, int j)
ColRange const & colsImpl() const
hidden::Traits< UpperTriangularizeAccessor< Lhs > >::Type Type
RowRange const & rowsImpl() 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< DiagonalGetterAccessor< Lhs > > Col
RowOperator< DiagonalGetterAccessor< Lhs > > Row
RowOperator< DiagonalizeAccessor< Lhs > > Row
ColOperator< DiagonalizeAccessor< Lhs > > Col
RowOperator< LowerSymmetrizeAccessor< Lhs > > Row
ColOperator< LowerSymmetrizeAccessor< Lhs > > Col
ColOperator< LowerTriangularizeAccessor< Lhs > > Col
RowOperator< LowerTriangularizeAccessor< Lhs > > Row
RowOperator< SymmetrizeAccessor< Lhs > > Row
ColOperator< SymmetrizeAccessor< Lhs > > Col
ColOperator< UpperSymmetrizeAccessor< Lhs > > Col
RowOperator< UpperSymmetrizeAccessor< Lhs > > Row
ColOperator< UpperTriangularizeAccessor< Lhs > > Col
RowOperator< UpperTriangularizeAccessor< Lhs > > Row