18 template <
class T,
unsigned int D>
20 static const unsigned int _D2 = D*D;
21 unsigned int dim2()
const {
return _D2;}
22 #define TOOLS_MAT_CLASS mat
24 #undef TOOLS_MAT_CLASS
27 static const std::string& s_class() {
28 static const std::string s_v(
"tools::mat");
39 if(a_inc) mem::increment(s_class().c_str());
44 for(
unsigned int i=0;i<_D2;i++)
m_vec[i] = zero();
51 mem::decrement(s_class().c_str());
57 mem::increment(s_class().c_str());
65 if(&a_from==
this)
return *
this;
72 mem::increment(s_class().c_str());
88 private:
static void check_instantiation() {
mat<float,2> dummy;}
93 unsigned int dim2()
const {
return m_D2;}
94 #define TOOLS_MAT_CLASS nmat
96 #undef TOOLS_MAT_CLASS
99 static const std::string& s_class() {
100 static const std::string s_v(
"tools::nmat");
107 mem::increment(s_class().c_str());
110 for(
unsigned int i=0;i<
m_D2;i++)
m_vec[i] = zero();
115 mem::decrement(s_class().c_str());
123 mem::increment(s_class().c_str());
129 if(&a_from==
this)
return *
this;
140 nmat(
unsigned int a_D,
const T a_v[])
144 mem::increment(s_class().c_str());
155 private:
static void check_instantiation() {
nmat<float> dummy(2);}
158 template <
class T,
unsigned int D>
160 unsigned int D2 = D*D;
162 for(
unsigned int i=0;i<D2;i++) v[i] = a_from[i];
166 template <
class VECTOR>
167 inline void multiply(VECTOR& a_vec,
const typename VECTOR::value_type& a_mat) {
171 typedef typename VECTOR::iterator it_t;
172 for(it_t it=a_vec.begin();it!=a_vec.end();++it) *it *= a_mat;
175 template <
class VECTOR>
176 inline void multiply(VECTOR& a_vec,
const typename VECTOR::value_type::elem_t& a_value) {
177 typedef typename VECTOR::iterator it_t;
178 for(it_t it=a_vec.begin();it!=a_vec.end();++it) (*it).multiply(a_value);
186 inline void conjugate(MAT& a_m,
typename MAT::elem_t (*a_conj)(
const typename MAT::elem_t&)) {
187 typedef typename MAT::elem_t T;
188 T* pos =
const_cast<T*
>(a_m.data());
189 unsigned int D2 = a_m.dimension()*a_m.dimension();
190 for(
unsigned int i=0;i<D2;i++,pos++) {
196 inline bool is_real(MAT& a_m,
typename MAT::elem_t::value_type (*a_imag)(
const typename MAT::elem_t&)) {
197 typedef typename MAT::elem_t T;
198 T* pos =
const_cast<T*
>(a_m.data());
199 unsigned int D2 = a_m.dimension()*a_m.dimension();
200 for(
unsigned int i=0;i<D2;i++,pos++) {
if(a_imag(*pos))
return false;}
204 template <
class MAT,
class PREC>
205 inline bool is_real_prec(MAT& a_m,
typename MAT::elem_t::value_type (*a_imag)(
const typename MAT::elem_t&),
206 const PREC& a_prec,PREC(*a_fabs)(
const typename MAT::elem_t::value_type&)) {\
207 typedef
typename MAT::elem_t T;
208 T* pos =
const_cast<T*
>(a_m.data());
209 unsigned int D2 = a_m.dimension()*a_m.dimension();
210 for(
unsigned int i=0;i<D2;i++,pos++) {
if(a_fabs(a_imag(*pos))>=a_prec)
return false;}
215 inline bool is_imag(MAT& a_m,
typename MAT::elem_t::value_type (*a_real)(
const typename MAT::elem_t&)) {
216 typedef typename MAT::elem_t T;
217 T* pos =
const_cast<T*
>(a_m.data());
218 unsigned int D2 = a_m.dimension()*a_m.dimension();
219 for(
unsigned int i=0;i<D2;i++,pos++) {
if(a_real(*pos))
return false;}
223 template <
class CMAT,
class RMAT>
224 inline bool to_real(
const CMAT& a_c,RMAT& a_r,
typename CMAT::elem_t::value_type (*a_real)(
const typename CMAT::elem_t&)) {
225 if(a_r.dimension()!=a_c.dimension())
return false;
226 typedef typename CMAT::elem_t CT;
227 const CT* cpos = a_c.data();
228 typedef typename RMAT::elem_t RT;
229 RT* rpos =
const_cast<RT*
>(a_r.data());
230 unsigned int D2 = a_c.dimension()*a_c.dimension();
231 for(
unsigned int i=0;i<D2;i++,cpos++,rpos++) *rpos = a_real(*cpos);
235 template <
class RMAT,
class CMAT>
237 if(a_c.dimension()!=a_r.dimension())
return false;
238 typedef typename RMAT::elem_t RT;
239 const RT* rpos = a_r.data();
240 typedef typename CMAT::elem_t CT;
241 CT* cpos =
const_cast<CT*
>(a_c.data());
242 unsigned int D2 = a_r.dimension()*a_r.dimension();
243 for(
unsigned int i=0;i<D2;i++,rpos++,cpos++) *cpos = CT(*rpos);
248 inline void dagger(MAT& a_m,
typename MAT::elem_t (*a_conj)(
const typename MAT::elem_t&)) {
249 conjugate<MAT>(a_m,a_conj);
253 template <
class CMAT,
class RMAT>
255 typename CMAT::elem_t::value_type (*a_real)(
const typename CMAT::elem_t&),
256 typename CMAT::elem_t::value_type (*a_imag)(
const typename CMAT::elem_t&)) {
260 typedef typename CMAT::elem_t CT;
261 typedef typename RMAT::elem_t RT;
263 unsigned int cdim = a_c.dimension();
264 if(a_r.dimension()!=2*cdim) {a_r.set_zero();
return false;}
265 RT
value;
unsigned int r,c;
266 for(r=0;r<cdim;r++) {
267 for(c=0;c<cdim;c++) {
268 const CT& cvalue = a_c.
value(r,c);
269 value = a_real(cvalue);
270 a_r.set_value(r,c,
value);
271 a_r.set_value(r+cdim,c+cdim,
value);
272 value = a_imag(cvalue);
273 a_r.set_value(r,c+cdim,
value);
274 a_r.set_value(r+cdim,c,-
value);
280 template <
class VEC_CMAT,
class VEC_RMAT>
282 const VEC_CMAT& a_vc,VEC_RMAT& a_vr
283 ,
typename VEC_CMAT::value_type::elem_t::value_type (*a_real)(
const typename VEC_CMAT::value_type::elem_t&)
284 ,
typename VEC_CMAT::value_type::elem_t::value_type (*a_imag)(
const typename VEC_CMAT::value_type::elem_t&)
289 typedef typename VEC_CMAT::size_type sz_t;
290 sz_t number = a_vc.size();
292 for(sz_t index=0;index<number;index++) {
293 if(!
decomplex(a_vc[index],a_vr[index],a_real,a_imag)) {
320 inline void commutator(
const MAT& a1,
const MAT& a2,MAT& a_tmp,MAT& a_res) {
328 template <
class MAT,
class T>
329 inline void commutator(
const MAT& a1,
const MAT& a2,MAT& a_tmp,T a_vtmp[],MAT& a_res) {
331 a_res.mul_mtx(a2,a_vtmp);
333 a_tmp.mul_mtx(a1,a_vtmp);
346 template <
class MAT,
class T>
347 inline void anticommutator(
const MAT& a1,
const MAT& a2,MAT& a_tmp,T a_vtmp[],MAT& a_res) {
349 a_res.mul_mtx(a2,a_vtmp);
351 a_tmp.mul_mtx(a1,a_vtmp);
355 template <
class T,
unsigned int D>
357 unsigned int order = D;
358 const T* p1 = a_1.data();
359 const T* p2 = a_2.data();
360 const T* pc = a_c.data();
361 for(
unsigned int r=0;r<order;r++) {
362 for(
unsigned int c=0;c<order;c++) {
364 {
for(
unsigned int i=0;i<order;i++) {
365 _12 += (*(p1+r+i*order)) * (*(p2+i+c*order));
368 {
for(
unsigned int i=0;i<order;i++) {
369 _21 += (*(p2+r+i*order)) * (*(p1+i+c*order));
371 T
diff = (_12-_21) - *(pc+r+c*order);
373 if(
diff>=a_prec)
return false;
379 template <
class T,
unsigned int D>
381 unsigned int order = D;
382 const T* p1 = a_1.data();
383 const T* p2 = a_2.data();
384 const T* pc = a_c.data();
385 for(
unsigned int r=0;r<order;r++) {
386 for(
unsigned int c=0;c<order;c++) {
388 {
for(
unsigned int i=0;i<order;i++) {
389 _12 += (*(p1+r+i*order)) * (*(p2+i+c*order));
392 {
for(
unsigned int i=0;i<order;i++) {
393 _21 += (*(p2+r+i*order)) * (*(p1+i+c*order));
395 T
diff = (_12+_21) - *(pc+r+c*order);
397 if(
diff>=a_prec)
return false;
403 template <
class T,
unsigned int D>
409 template <
class T,
unsigned int D>
415 template <
class T,
unsigned int D>
421 template <
class T,
unsigned int D>
469 template <
class MAT,
class REAL>
470 inline bool mat_fabs(
const MAT& a_in,MAT& a_ou,REAL(*a_fabs)(
const typename MAT::elem_t&)) {
471 if(a_in.dimension()!=a_ou.dimension()) {a_ou.set_zero();
return false;}
472 typedef typename MAT::elem_t T;
473 T* in_pos =
const_cast<T*
>(a_in.data());
474 T* ou_pos =
const_cast<T*
>(a_ou.data());
475 unsigned int D2 = a_in.dimension()*a_in.dimension();
476 for(
unsigned int i=0;i<D2;i++,in_pos++,ou_pos++) {*ou_pos = a_fabs(*in_pos);}
506 #define TOOLS_MELEM const typename MAT::elem_t&
518 typename MAT::elem_t* vec =
const_cast<typename MAT::elem_t*
>(a_m.data());
519 vec[0] = a_00;vec[2] = a_01;
520 vec[1] = a_10;vec[3] = a_11;
534 typename MAT::elem_t* vec =
const_cast<typename MAT::elem_t*
>(a_m.data());
535 vec[0] = a_00;vec[3] = a_01;vec[6] = a_02;
536 vec[1] = a_10;vec[4] = a_11;vec[7] = a_12;
537 vec[2] = a_20;vec[5] = a_21;vec[8] = a_22;
552 typename MAT::elem_t* vec =
const_cast<typename MAT::elem_t*
>(a_m.data());
553 vec[0] = a_00;vec[4] = a_01;vec[ 8] = a_02;vec[12] = a_03;
554 vec[1] = a_10;vec[5] = a_11;vec[ 9] = a_12;vec[13] = a_13;
555 vec[2] = a_20;vec[6] = a_21;vec[10] = a_22;vec[14] = a_23;
556 vec[3] = a_30;vec[7] = a_31;vec[11] = a_32;vec[15] = a_33;
572 typename MAT::elem_t* vec =
const_cast<typename MAT::elem_t*
>(a_m.data());
573 vec[0] = a_00;vec[5] = a_01;vec[10] = a_02;vec[15] = a_03;vec[20] = a_04;
574 vec[1] = a_10;vec[6] = a_11;vec[11] = a_12;vec[16] = a_13;vec[21] = a_14;
575 vec[2] = a_20;vec[7] = a_21;vec[12] = a_22;vec[17] = a_23;vec[22] = a_24;
576 vec[3] = a_30;vec[8] = a_31;vec[13] = a_32;vec[18] = a_33;vec[23] = a_34;
577 vec[4] = a_40;vec[9] = a_41;vec[14] = a_42;vec[19] = a_43;vec[24] = a_44;
594 typename MAT::elem_t* vec =
const_cast<typename MAT::elem_t*
>(a_m.data());
595 vec[0] = a_00;vec[ 6] = a_01;vec[12] = a_02;vec[18] = a_03;vec[24] = a_04;vec[30] = a_05;
596 vec[1] = a_10;vec[ 7] = a_11;vec[13] = a_12;vec[19] = a_13;vec[25] = a_14;vec[31] = a_15;
597 vec[2] = a_20;vec[ 8] = a_21;vec[14] = a_22;vec[20] = a_23;vec[26] = a_24;vec[32] = a_25;
598 vec[3] = a_30;vec[ 9] = a_31;vec[15] = a_32;vec[21] = a_33;vec[27] = a_34;vec[33] = a_35;
599 vec[4] = a_40;vec[10] = a_41;vec[16] = a_42;vec[22] = a_43;vec[28] = a_44;vec[34] = a_45;
600 vec[5] = a_50;vec[11] = a_51;vec[17] = a_52;vec[23] = a_53;vec[29] = a_54;vec[35] = a_55;
608 ,
TOOLS_MELEM a_00,
TOOLS_MELEM a_01,
TOOLS_MELEM a_02,
TOOLS_MELEM a_03,
TOOLS_MELEM a_04,
TOOLS_MELEM a_05,
TOOLS_MELEM a_06,
TOOLS_MELEM a_07,
TOOLS_MELEM a_08,
TOOLS_MELEM a_09
609 ,
TOOLS_MELEM a_10,
TOOLS_MELEM a_11,
TOOLS_MELEM a_12,
TOOLS_MELEM a_13,
TOOLS_MELEM a_14,
TOOLS_MELEM a_15,
TOOLS_MELEM a_16,
TOOLS_MELEM a_17,
TOOLS_MELEM a_18,
TOOLS_MELEM a_19
610 ,
TOOLS_MELEM a_20,
TOOLS_MELEM a_21,
TOOLS_MELEM a_22,
TOOLS_MELEM a_23,
TOOLS_MELEM a_24,
TOOLS_MELEM a_25,
TOOLS_MELEM a_26,
TOOLS_MELEM a_27,
TOOLS_MELEM a_28,
TOOLS_MELEM a_29
611 ,
TOOLS_MELEM a_30,
TOOLS_MELEM a_31,
TOOLS_MELEM a_32,
TOOLS_MELEM a_33,
TOOLS_MELEM a_34,
TOOLS_MELEM a_35,
TOOLS_MELEM a_36,
TOOLS_MELEM a_37,
TOOLS_MELEM a_38,
TOOLS_MELEM a_39
612 ,
TOOLS_MELEM a_40,
TOOLS_MELEM a_41,
TOOLS_MELEM a_42,
TOOLS_MELEM a_43,
TOOLS_MELEM a_44,
TOOLS_MELEM a_45,
TOOLS_MELEM a_46,
TOOLS_MELEM a_47,
TOOLS_MELEM a_48,
TOOLS_MELEM a_49
613 ,
TOOLS_MELEM a_50,
TOOLS_MELEM a_51,
TOOLS_MELEM a_52,
TOOLS_MELEM a_53,
TOOLS_MELEM a_54,
TOOLS_MELEM a_55,
TOOLS_MELEM a_56,
TOOLS_MELEM a_57,
TOOLS_MELEM a_58,
TOOLS_MELEM a_59
614 ,
TOOLS_MELEM a_60,
TOOLS_MELEM a_61,
TOOLS_MELEM a_62,
TOOLS_MELEM a_63,
TOOLS_MELEM a_64,
TOOLS_MELEM a_65,
TOOLS_MELEM a_66,
TOOLS_MELEM a_67,
TOOLS_MELEM a_68,
TOOLS_MELEM a_69
615 ,
TOOLS_MELEM a_70,
TOOLS_MELEM a_71,
TOOLS_MELEM a_72,
TOOLS_MELEM a_73,
TOOLS_MELEM a_74,
TOOLS_MELEM a_75,
TOOLS_MELEM a_76,
TOOLS_MELEM a_77,
TOOLS_MELEM a_78,
TOOLS_MELEM a_79
616 ,
TOOLS_MELEM a_80,
TOOLS_MELEM a_81,
TOOLS_MELEM a_82,
TOOLS_MELEM a_83,
TOOLS_MELEM a_84,
TOOLS_MELEM a_85,
TOOLS_MELEM a_86,
TOOLS_MELEM a_87,
TOOLS_MELEM a_88,
TOOLS_MELEM a_89
617 ,
TOOLS_MELEM a_90,
TOOLS_MELEM a_91,
TOOLS_MELEM a_92,
TOOLS_MELEM a_93,
TOOLS_MELEM a_94,
TOOLS_MELEM a_95,
TOOLS_MELEM a_96,
TOOLS_MELEM a_97,
TOOLS_MELEM a_98,
TOOLS_MELEM a_99
622 typename MAT::elem_t* vec =
const_cast<typename MAT::elem_t*
>(a_m.data());
623 vec[0] = a_00;vec[10] = a_01;vec[20] = a_02;vec[30] = a_03;vec[40] = a_04;vec[50] = a_05;vec[60] = a_06;vec[70] = a_07;vec[80] = a_08;vec[90] = a_09;
624 vec[1] = a_10;vec[11] = a_11;vec[21] = a_12;vec[31] = a_13;vec[41] = a_14;vec[51] = a_15;vec[61] = a_16;vec[71] = a_17;vec[81] = a_18;vec[91] = a_19;
625 vec[2] = a_20;vec[12] = a_21;vec[22] = a_22;vec[32] = a_23;vec[42] = a_24;vec[52] = a_25;vec[62] = a_26;vec[72] = a_27;vec[82] = a_28;vec[92] = a_29;
626 vec[3] = a_30;vec[13] = a_31;vec[23] = a_32;vec[33] = a_33;vec[43] = a_34;vec[53] = a_35;vec[63] = a_36;vec[73] = a_37;vec[83] = a_38;vec[93] = a_39;
627 vec[4] = a_40;vec[14] = a_41;vec[24] = a_42;vec[34] = a_43;vec[44] = a_44;vec[54] = a_45;vec[64] = a_46;vec[74] = a_47;vec[84] = a_48;vec[94] = a_49;
628 vec[5] = a_50;vec[15] = a_51;vec[25] = a_52;vec[35] = a_53;vec[45] = a_54;vec[55] = a_55;vec[65] = a_56;vec[75] = a_57;vec[85] = a_58;vec[95] = a_59;
629 vec[6] = a_60;vec[16] = a_61;vec[26] = a_62;vec[36] = a_63;vec[46] = a_64;vec[56] = a_65;vec[66] = a_66;vec[76] = a_67;vec[86] = a_68;vec[96] = a_69;
630 vec[7] = a_70;vec[17] = a_71;vec[27] = a_72;vec[37] = a_73;vec[47] = a_74;vec[57] = a_75;vec[67] = a_76;vec[77] = a_77;vec[87] = a_78;vec[97] = a_79;
631 vec[8] = a_80;vec[18] = a_81;vec[28] = a_82;vec[38] = a_83;vec[48] = a_84;vec[58] = a_85;vec[68] = a_86;vec[78] = a_87;vec[88] = a_88;vec[98] = a_89;
632 vec[9] = a_90;vec[19] = a_91;vec[29] = a_92;vec[39] = a_93;vec[49] = a_94;vec[59] = a_95;vec[69] = a_96;vec[79] = a_97;vec[89] = a_98;vec[99] = a_99;
648 inline void dump(std::ostream& a_out,
const std::string& aCMT,
const MAT& a_matrix) {
649 if(aCMT.size()) a_out << aCMT << std::endl;
650 unsigned int D = a_matrix.dimension();
651 for(
unsigned int r=0;r<D;r++) {
652 for(
unsigned int c=0;c<D;c++) {
653 a_out <<
" " << a_matrix.value(r,c);
661 MAT I;I.set_identity();
663 if(!a_matrix.invert(tmp))
return false;
664 tmp.mul_mtx(a_matrix);
666 dump(a_out,
"problem with inv of :",a_matrix);