45#ifndef LASS_GUARDIAN_OF_INCLUSION_NUM_IMPL_MATRIX_EXPRESSIONS_H
46#define LASS_GUARDIAN_OF_INCLUSION_NUM_IMPL_MATRIX_EXPRESSIONS_H
63 enum { lvalue =
true };
64 typedef typename util::CallTraits<T>::TValue TValue;
65 typedef typename util::CallTraits<T>::TParam TParam;
66 typedef typename util::CallTraits<T>::TReference TReference;
67 typedef typename util::CallTraits<T>::TConstReference TConstReference;
70 MStorage(): storage_(), rows_(0), cols_(0) {}
71 MStorage(TSize iRows, TSize iCols): storage_(iRows * iCols, T()), rows_(iRows), cols_(iCols) {}
72 TConstReference operator()(TSize iI, TSize iJ)
const {
return storage_[iI * cols_ + iJ]; }
73 TReference operator()(TSize iI, TSize iJ) {
return storage_[iI * cols_ + iJ]; }
74 TSize rows()
const {
return rows_; }
75 TSize columns()
const {
return cols_; }
79 void resize(TSize iRows, TSize iCols)
81 storage_.resize(iRows * iCols, T());
85 void swap(MStorage<T>& iOther)
87 storage_.swap(iOther.storage_);
88 std::swap(rows_, iOther.rows_);
89 std::swap(cols_, iOther.cols_);
92 typename std::vector<T>::iterator rowMajor() {
return storage_.begin(); }
93 typename std::vector<T>::const_iterator rowMajor()
const {
return storage_.begin(); }
96 std::vector<T> storage_;
107 enum { lvalue =
false };
108 typedef typename util::CallTraits<T>::TValue TValue;
109 typedef typename util::CallTraits<T>::TParam TParam;
110 typedef size_t TSize;
112 MScalar(TParam iValue, TSize iRows, TSize iCols): value_(iValue), rows_(iRows), cols_(iCols) {}
113 TParam operator()(TSize , TSize )
const
117 TSize rows()
const {
return rows_; }
118 TSize columns()
const {
return cols_; }
127template <
typename ExpressionType>
128struct MatrixExpressionTraits
130 typedef const ExpressionType& TStorage;
134struct MatrixExpressionTraits<MScalar<T> >
136 typedef MScalar<T> TStorage;
141#define LASS_NUM_MATRIX_BINARY_EXPRESSION(i_name, c_operator)\
142template <typename T, typename Operand1, typename Operand2>\
143class LASS_CONCATENATE(M, i_name)\
146 enum { lvalue = false };\
147 typedef typename util::CallTraits<T>::TValue TValue;\
148 typedef size_t TSize;\
149 LASS_CONCATENATE(M, i_name)(const Operand1& iA, const Operand2& iB):\
150 operand1_(iA), operand2_(iB)\
152 LASS_ASSERT(operand1_.rows() == operand2_.rows() &&\
153 operand1_.columns() == operand2_.columns());\
155 TValue operator()(TSize iI, TSize iJ) const\
157 return operand1_(iI, iJ) c_operator operand2_(iI, iJ);\
159 TSize rows() const { return operand1_.rows(); }\
160 TSize columns() const { return operand1_.columns(); }\
162 typename MatrixExpressionTraits<Operand1>::TStorage operand1_;\
163 typename MatrixExpressionTraits<Operand2>::TStorage operand2_;\
166LASS_NUM_MATRIX_BINARY_EXPRESSION(Add, +);
167LASS_NUM_MATRIX_BINARY_EXPRESSION(Sub, -);
168LASS_NUM_MATRIX_BINARY_EXPRESSION(Mul, *);
172#define LASS_NUM_MATRIX_UNARY_EXPRESSION(i_name, c_operator)\
173template <typename T, typename Operand1>\
174class LASS_CONCATENATE(M, i_name)\
177 enum { lvalue = false };\
178 typedef typename util::CallTraits<T>::TValue TValue;\
179 typedef size_t TSize;\
180 LASS_CONCATENATE(M, i_name)(const Operand1& iA):\
184 TValue operator()(TSize iRow, TSize iCol) const\
186 return c_operator operand1_(iRow, iCol);\
188 TSize rows() const { return operand1_.rows(); }\
189 TSize columns() const { return operand1_.columns(); }\
191 typename MatrixExpressionTraits<Operand1>::TStorage operand1_;\
194LASS_NUM_MATRIX_UNARY_EXPRESSION(Neg, -);
195LASS_NUM_MATRIX_UNARY_EXPRESSION(Rec, ::lass::num::NumTraits<T>::one /);
202template <
typename T,
typename Operand1,
typename Operand2>
206 enum { lvalue =
false };
207 typedef typename util::CallTraits<T>::TValue TValue;
208 typedef size_t TSize;
209 MProd(
const Operand1& iA,
const Operand2& iB):
210 operand1_(iA), operand2_(iB), loopSize_(iA.columns())
212 LASS_ASSERT(operand1_.columns() == operand2_.rows());
214 TValue operator()(TSize iI, TSize iJ)
const
216 TValue result = TValue();
217 for (TSize k = 0; k < loopSize_; ++k)
219 result += operand1_(iI, k) * operand2_(k, iJ);
223 TSize rows()
const {
return operand1_.rows(); }
224 TSize columns()
const {
return operand2_.columns(); }
226 typename MatrixExpressionTraits<Operand1>::TStorage operand1_;
227 typename MatrixExpressionTraits<Operand2>::TStorage operand2_;
235template <
typename T,
typename Operand1>
239 enum { lvalue =
false };
240 typedef typename util::CallTraits<T>::TParam TParam;
241 typedef size_t TSize;
242 MTrans(
const Operand1& iA): operand1_(iA) {}
243 TParam operator()(TSize iI, TSize iJ)
const {
return operand1_(iJ, iI);
245 TSize rows()
const {
return operand1_.columns(); }
246 TSize columns()
const {
return operand1_.rows(); }
248 typename MatrixExpressionTraits<Operand1>::TStorage operand1_;
256template <
typename T,
typename Operand1>
260 enum { lvalue =
false };
261 typedef T (*TOperator)(T);
262 typedef typename util::CallTraits<T>::TValue TValue;
263 typedef size_t TSize;
264 MFun(
const Operand1& iA, TOperator iOperator): operand1_(iA),
265operator_(iOperator) {}
266 TValue operator()(TSize iI, TSize iJ)
const {
return
267operator_(operand1_(iI, iJ)); }
268 TSize rows()
const {
return operand1_.rows(); }\
269 TSize columns()
const {
return operand1_.columns(); }\
271 typename MatrixExpressionTraits<Operand1>::TStorage operand1_;
numeric types and traits.
Library for Assembled Shared Sources.