1 #ifndef _GLUCAT_MATRIX_MULTI_H 2 #define _GLUCAT_MATRIX_MULTI_H 40 #include <boost/numeric/ublas/fwd.hpp> 49 namespace ublas = boost::numeric::ublas;
53 template<
typename Scalar_T, const index_t LO, const index_t HI >
56 template<
typename Scalar_T, const index_t LO, const index_t HI >
60 template<
typename Scalar_T, const index_t LO, const index_t HI >
61 const matrix_multi<Scalar_T,LO,HI>
62 operator* (
const matrix_multi<Scalar_T,LO,HI>& lhs,
const matrix_multi<Scalar_T,LO,HI>& rhs);
65 template<
typename Scalar_T, const index_t LO, const index_t HI >
66 const matrix_multi<Scalar_T,LO,HI>
67 operator^ (
const matrix_multi<Scalar_T,LO,HI>& lhs,
const matrix_multi<Scalar_T,LO,HI>& rhs);
70 template<
typename Scalar_T, const index_t LO, const index_t HI >
71 const matrix_multi<Scalar_T,LO,HI>
72 operator& (
const matrix_multi<Scalar_T,LO,HI>& lhs,
const matrix_multi<Scalar_T,LO,HI>& rhs);
75 template<
typename Scalar_T, const index_t LO, const index_t HI >
76 const matrix_multi<Scalar_T,LO,HI>
77 operator% (
const matrix_multi<Scalar_T,LO,HI>& lhs,
const matrix_multi<Scalar_T,LO,HI>& rhs);
80 template<
typename Scalar_T, const index_t LO, const index_t HI >
82 star(
const matrix_multi<Scalar_T,LO,HI>& lhs,
const matrix_multi<Scalar_T,LO,HI>& rhs);
85 template<
typename Scalar_T, const index_t LO, const index_t HI >
86 const matrix_multi<Scalar_T,LO,HI>
87 operator/ (
const matrix_multi<Scalar_T,LO,HI>& lhs,
const matrix_multi<Scalar_T,LO,HI>& rhs);
90 template<
typename Scalar_T, const index_t LO, const index_t HI >
91 const matrix_multi<Scalar_T,LO,HI>
92 operator| (
const matrix_multi<Scalar_T,LO,HI>& lhs,
const matrix_multi<Scalar_T,LO,HI>& rhs);
95 template<
typename Scalar_T, const index_t LO, const index_t HI >
97 operator>> (std::istream& s, matrix_multi<Scalar_T,LO,HI>& val);
100 template<
typename Scalar_T, const index_t LO, const index_t HI >
102 operator<< (std::ostream& os, const matrix_multi<Scalar_T,LO,HI>& val);
105 template<
typename Scalar_T, const index_t LO, const index_t HI >
106 const index_set<LO,HI>
107 reframe (
const matrix_multi<Scalar_T,LO,HI>& lhs,
const matrix_multi<Scalar_T,LO,HI>& rhs,
108 matrix_multi<Scalar_T,LO,HI>& lhs_reframed, matrix_multi<Scalar_T,LO,HI>& rhs_reframed);
111 template<
typename Scalar_T, const index_t LO, const index_t HI >
112 const matrix_multi<Scalar_T,LO,HI>
113 sqrt(
const matrix_multi<Scalar_T,LO,HI>& val,
const matrix_multi<Scalar_T,LO,HI>&
i,
bool prechecked);
116 template<
typename Scalar_T, const index_t LO, const index_t HI >
117 const matrix_multi<Scalar_T,LO,HI>
118 matrix_sqrt(
const matrix_multi<Scalar_T,LO,HI>& val,
const matrix_multi<Scalar_T,LO,HI>&
i);
121 template<
typename Scalar_T, const index_t LO, const index_t HI >
122 const matrix_multi<Scalar_T,LO,HI>
123 log(
const matrix_multi<Scalar_T,LO,HI>& val,
const matrix_multi<Scalar_T,LO,HI>&
i,
bool prechecked);
126 template<
typename Scalar_T, const index_t LO, const index_t HI >
127 const matrix_multi<Scalar_T,LO,HI>
128 matrix_log(
const matrix_multi<Scalar_T,LO,HI>& val,
const matrix_multi<Scalar_T,LO,HI>&
i);
131 template<
typename Scalar_T =
double, const index_t LO = DEFAULT_LO, const index_t HI = DEFAULT_HI >
133 public clifford_algebra< Scalar_T, index_set<LO,HI>, matrix_multi<Scalar_T,LO,HI> >
140 typedef std::pair<const index_set_t, Scalar_T>
term_t;
144 template<
typename Other_Scalar_T, const index_t Other_LO, const index_t Other_HI >
146 template<
typename Other_Scalar_T, const index_t Other_LO, const index_t Other_HI >
151 typedef ublas::compressed_matrix< int, orientation_t >
153 #if defined(_GLUCAT_USE_DENSE_MATRICES) 154 typedef ublas::matrix< Scalar_T, orientation_t >
matrix_t;
156 typedef ublas::compressed_matrix< Scalar_T, orientation_t >
169 template<
typename Other_Scalar_T >
172 template<
typename Other_Scalar_T >
174 const index_set_t frm,
const bool prechecked =
false);
177 const index_set_t frm,
const bool prechecked =
false);
179 matrix_multi(
const index_set_t
ist,
const Scalar_T& crd = Scalar_T(1));
181 matrix_multi(
const index_set_t ist,
const Scalar_T& crd,
182 const index_set_t frm,
const bool prechecked =
false);
189 const index_set_t frm,
const bool prechecked =
false);
194 const index_set_t frm,
const bool prechecked =
false);
200 const index_set_t frm,
const bool prechecked =
false)
201 { *
this =
matrix_multi(std::string(str), frm, prechecked); };
203 template<
typename Other_Scalar_T >
206 template<
typename Other_Scalar_T >
208 const index_set_t frm,
const bool prechecked =
false);
212 template<
typename Other_Scalar_T >
217 template<
typename Matrix_T >
218 matrix_multi(
const Matrix_T& mtx,
const index_set_t frm);
220 matrix_multi(
const matrix_t& mtx,
const index_set_t frm);
228 multivector_t&
operator= (
const multivector_t& rhs);
231 static const matrix_multi_t
random(
const index_set_t frm, Scalar_T
fill = Scalar_T(1));
235 friend const matrix_multi_t
236 operator* <>(
const matrix_multi_t& lhs,
const matrix_multi_t& rhs);
237 friend const matrix_multi_t
238 operator^ <>(
const matrix_multi_t& lhs,
const matrix_multi_t& rhs);
239 friend const matrix_multi_t
240 operator& <>(
const matrix_multi_t& lhs,
const matrix_multi_t& rhs);
241 friend const matrix_multi_t
242 operator% <>(
const matrix_multi_t& lhs,
const matrix_multi_t& rhs);
244 star <>(
const matrix_multi_t& lhs,
const matrix_multi_t& rhs);
245 friend const matrix_multi_t
246 operator/ <>(
const matrix_multi_t& lhs,
const matrix_multi_t& rhs);
247 friend const matrix_multi_t
248 operator| <>(
const matrix_multi_t& lhs,
const matrix_multi_t& rhs);
251 operator>> <>(std::istream& s, multivector_t& val);
253 operator<< <>(std::ostream& os,
const multivector_t& val);
255 operator<< <>(std::ostream& os,
const term_t& term);
257 template<
typename Other_Scalar_T, const index_t Other_LO, const index_t Other_HI >
261 template<
typename Other_Scalar_T, const index_t Other_LO, const index_t Other_HI >
264 template<
typename Other_Scalar_T, const index_t Other_LO, const index_t Other_HI >
269 multivector_t&
operator+= (
const term_t& rhs);
283 template<
typename Scalar_T, const index_t LO, const index_t HI >
292 template <
typename Scalar_T, const glucat::index_t LO, const glucat::index_t HI>
294 public numeric_limits<Scalar_T>
297 #endif // _GLUCAT_MATRIX_MULTI_H std::vector< Scalar_T > vector_t
Scalar_T star(const Multivector< Scalar_T, LO, HI > &lhs, const RHS< Scalar_T, LO, HI > &rhs)
Hestenes scalar product.
static const matrix_multi_t random(const index_set_t frm, Scalar_T fill=Scalar_T(1))
Random multivector within a frame.
const Multivector< Scalar_T, LO, HI > sqrt(const Multivector< Scalar_T, LO, HI > &val, const Multivector< Scalar_T, LO, HI > &i, const bool prechecked=false)
Square root of multivector with specified complexifier.
const Multivector< Scalar_T, LO, HI > operator/(const Multivector< Scalar_T, LO, HI > &lhs, const Scalar_T &scr)
Quotient of multivector and scalar.
ublas::row_major orientation_t
const Multivector< Scalar_T, LO, HI > operator*(const Multivector< Scalar_T, LO, HI > &lhs, const Scalar_T &scr)
Product of multivector and scalar.
A framed_multi<Scalar_T,LO,HI> is a framed approximation to a multivector.
const Multivector< Scalar_T, LO, HI > log(const Multivector< Scalar_T, LO, HI > &val, const Multivector< Scalar_T, LO, HI > &i, const bool prechecked=false)
Natural logarithm of multivector with specified complexifier.
_GLUCAT_CLIFFORD_ALGEBRA_OPERATIONS multivector_t & operator=(const multivector_t &rhs)
Assignment operator.
const Multivector< Scalar_T, LO, HI > operator&(const Multivector< Scalar_T, LO, HI > &lhs, const RHS< Scalar_T, LO, HI > &rhs)
Inner product.
matrix_multi multivector_t
index_set_t m_frame
Index set representing the frame for the subalgebra which contains the multivector.
const framed_multi< Other_Scalar_T, LO, HI > fast_framed_multi() const
Use inverse generalized FFT to construct a framed_multi_t.
A matrix_multi<Scalar_T,LO,HI> is a matrix approximation to a multivector.
const Multivector< Scalar_T, LO, HI > operator^(const Multivector< Scalar_T, LO, HI > &lhs, const RHS< Scalar_T, LO, HI > &rhs)
Outer product.
index_set< LO, HI > index_set_t
std::pair< const index_set_t, Scalar_T > term_t
const framed_multi< Scalar_T, LO, HI > exp(const framed_multi< Scalar_T, LO, HI > &val)
Exponential of multivector.
const matrix_multi< Scalar_T, LO, HI > matrix_log(const matrix_multi< Scalar_T, LO, HI > &val, const matrix_multi< Scalar_T, LO, HI > &i)
Natural logarithm of multivector with specified complexifier.
error< multivector_t > error_t
const matrix_multi_t fast_matrix_multi(const index_set_t frm) const
Use generalized FFT to construct a matrix_multi_t.
friend const matrix_multi< Other_Scalar_T, Other_LO, Other_HI > matrix_log(const matrix_multi< Other_Scalar_T, Other_LO, Other_HI > &val, const matrix_multi< Other_Scalar_T, Other_LO, Other_HI > &i)
const Multivector< Scalar_T, LO, HI > operator%(const Multivector< Scalar_T, LO, HI > &lhs, const RHS< Scalar_T, LO, HI > &rhs)
Left contraction.
ublas::compressed_matrix< Scalar_T, orientation_t > matrix_t
const basis_matrix_t basis_element(const index_set< LO, HI > &ist) const
Create a basis element matrix within the current frame.
Specific exception class.
friend const index_set< Other_LO, Other_HI > reframe(const matrix_multi< Other_Scalar_T, Other_LO, Other_HI > &lhs, const matrix_multi< Other_Scalar_T, Other_LO, Other_HI > &rhs, matrix_multi< Other_Scalar_T, Other_LO, Other_HI > &lhs_reframed, matrix_multi< Other_Scalar_T, Other_LO, Other_HI > &rhs_reframed)
framed_multi< Scalar_T, LO, HI > framed_multi_t
matrix_t::size_type matrix_index_t
const index_set< LO, HI > reframe(const matrix_multi< Scalar_T, LO, HI > &lhs, const matrix_multi< Scalar_T, LO, HI > &rhs, matrix_multi< Scalar_T, LO, HI > &lhs_reframed, matrix_multi< Scalar_T, LO, HI > &rhs_reframed)
Find a common frame for operands of a binary operator.
friend const matrix_multi< Other_Scalar_T, Other_LO, Other_HI > matrix_sqrt(const matrix_multi< Other_Scalar_T, Other_LO, Other_HI > &val, const matrix_multi< Other_Scalar_T, Other_LO, Other_HI > &i)
matrix_multi(const char *str)
Construct a multivector from a char*: eg: "3+2{1,2}-6.1e-2{2,3}".
static const std::string classname()
Class name used in messages.
matrix_t m_matrix
Matrix value representing the multivector within the folded frame.
const matrix_multi< Scalar_T, LO, HI > matrix_sqrt(const matrix_multi< Scalar_T, LO, HI > &val, const matrix_multi< Scalar_T, LO, HI > &i)
Square root of multivector with specified complexifier.
Index set class based on std::bitset<> in Gnu standard C++ library.
const Multivector< Scalar_T, LO, HI > operator|(const Multivector< Scalar_T, LO, HI > &lhs, const RHS< Scalar_T, LO, HI > &rhs)
Transformation via twisted adjoint action.
multivector_t & operator+=(const term_t &rhs)
Add a term, if non-zero.
~matrix_multi()
Destructor.
ublas::compressed_matrix< int, orientation_t > basis_matrix_t
std::istream & operator>>(std::istream &s, framed_multi< Scalar_T, LO, HI > &val)
Read multivector from input.
multivector_t matrix_multi_t
#define _GLUCAT_CLIFFORD_ALGEBRA_OPERATIONS
matrix_multi()
Default constructor.
matrix_multi(const char *str, const index_set_t frm, const bool prechecked=false)
Construct a multivector, within a given frame, from a char*: eg: "3+2{1,2}-6.1e-2{2,3}".