35 #ifndef _BLAZE_MATH_DENSE_INVERSION_H_ 36 #define _BLAZE_MATH_DENSE_INVERSION_H_ 100 inline void invertGeneral2x2( DenseMatrix<MT,SO>& dm )
108 using ET = ElementType_t<MT>;
112 const ET
det( A(0,0)*A(1,1) - A(0,1)*A(1,0) );
118 const ET idet( ET(1) /
det );
119 const ET a11( A(0,0) * idet );
121 A(0,0) = A(1,1) * idet;
122 A(1,0) = -A(1,0) * idet;
123 A(0,1) = -A(0,1) * idet;
147 template<
typename MT
149 inline void invertSymmetric2x2( DenseMatrix<MT,SO>& dm )
156 using ET = ElementType_t<MT>;
161 const ET
det( A(0,0)*A(1,1) - A(0,1)*A(1,0) );
167 const ET idet( ET(1) /
det );
168 const ET a11( A(0,0) * idet );
170 B(0,0) = A(1,1) * idet;
171 B(1,0) = -A(1,0) * idet;
195 template<
typename MT
197 inline void invertHermitian2x2( DenseMatrix<MT,SO>& dm )
204 using ET = ElementType_t<MT>;
209 const ET
det(
real( A(0,0)*A(1,1) - A(0,1)*A(1,0) ) );
215 const ET idet( ET(1) /
det );
216 const ET a11( A(0,0) * idet );
218 B(0,0) = ET( A(1,1) * idet );
219 B(1,0) = -A(1,0) * idet;
220 B(0,1) =
conj( B(1,0) );
243 template<
typename MT
245 inline void invertLower2x2( DenseMatrix<MT,SO>& dm )
252 using ET = ElementType_t<MT>;
256 const ET
det( A(0,0) * A(1,1) );
262 const ET idet( ET(1) /
det );
263 const ET a11( A(0,0) * idet );
265 A(0,0) = A(1,1) * idet;
266 A(1,0) = -A(1,0) * idet;
287 template<
typename MT
289 inline void invertUniLower2x2( DenseMatrix<MT,SO>& dm )
320 template<
typename MT
322 inline void invertUpper2x2( DenseMatrix<MT,SO>& dm )
329 using ET = ElementType_t<MT>;
333 const ET
det( A(0,0) * A(1,1) );
339 const ET idet( ET(1) /
det );
340 const ET a11( A(0,0) * idet );
342 A(0,0) = A(1,1) * idet;
343 A(0,1) = -A(0,1) * idet;
364 template<
typename MT
366 inline void invertUniUpper2x2( DenseMatrix<MT,SO>& dm )
397 template<
typename MT
399 inline void invertDiagonal2x2( DenseMatrix<MT,SO>& dm )
406 using ET = ElementType_t<MT>;
410 const ET
det( A(0,0) * A(1,1) );
416 const ET idet( ET(1) /
det );
417 const ET a11( A(0,0) * idet );
419 A(0,0) = A(1,1) * idet;
452 inline void invert2x2( DenseMatrix<MT,SO>& dm )
460 case byLU : invertGeneral2x2 ( ~dm );
break;
461 case byLDLT : invertSymmetric2x2( ~dm );
break;
462 case byLDLH : invertHermitian2x2( ~dm );
break;
463 case byLLH : invertHermitian2x2( ~dm );
break;
464 case asGeneral : invertGeneral2x2 ( ~dm );
break;
465 case asSymmetric: invertSymmetric2x2( ~dm );
break;
466 case asHermitian: invertHermitian2x2( ~dm );
break;
467 case asLower : invertLower2x2 ( ~dm );
break;
468 case asUniLower : invertUniLower2x2 ( ~dm );
break;
469 case asUpper : invertUpper2x2 ( ~dm );
break;
470 case asUniUpper : invertUniUpper2x2 ( ~dm );
break;
471 case asDiagonal : invertDiagonal2x2 ( ~dm );
break;
506 template<
typename MT
508 inline void invertGeneral3x3( DenseMatrix<MT,SO>& dm )
516 using ET = ElementType_t<MT>;
518 const StaticMatrix<ET,3UL,3UL,SO> A( ~dm );
521 B(0,0) = A(1,1)*A(2,2) - A(1,2)*A(2,1);
522 B(1,0) = A(1,2)*A(2,0) - A(1,0)*A(2,2);
523 B(2,0) = A(1,0)*A(2,1) - A(1,1)*A(2,0);
525 const ET
det( A(0,0)*B(0,0) + A(0,1)*B(1,0) + A(0,2)*B(2,0) );
531 B(0,1) = A(0,2)*A(2,1) - A(0,1)*A(2,2);
532 B(1,1) = A(0,0)*A(2,2) - A(0,2)*A(2,0);
533 B(2,1) = A(0,1)*A(2,0) - A(0,0)*A(2,1);
534 B(0,2) = A(0,1)*A(1,2) - A(0,2)*A(1,1);
535 B(1,2) = A(0,2)*A(1,0) - A(0,0)*A(1,2);
536 B(2,2) = A(0,0)*A(1,1) - A(0,1)*A(1,0);
561 template<
typename MT
563 inline void invertSymmetric3x3( DenseMatrix<MT,SO>& dm )
570 using ET = ElementType_t<MT>;
572 const StaticMatrix<ET,3UL,3UL,SO> A( ~dm );
575 B(0,0) = A(1,1)*A(2,2) - A(1,2)*A(2,1);
576 B(1,0) = A(1,2)*A(2,0) - A(1,0)*A(2,2);
577 B(2,0) = A(1,0)*A(2,1) - A(1,1)*A(2,0);
579 const ET
det( A(0,0)*B(0,0) + A(0,1)*B(1,0) + A(0,2)*B(2,0) );
586 B(1,1) = A(0,0)*A(2,2) - A(0,2)*A(2,0);
587 B(2,1) = A(0,1)*A(2,0) - A(0,0)*A(2,1);
590 B(2,2) = A(0,0)*A(1,1) - A(0,1)*A(1,0);
614 template<
typename MT
616 inline void invertHermitian3x3( DenseMatrix<MT,SO>& dm )
623 using ET = ElementType_t<MT>;
625 const StaticMatrix<ET,3UL,3UL,SO> A( ~dm );
628 B(0,0) = ET(
real( A(1,1)*A(2,2) - A(1,2)*A(2,1) ) );
629 B(1,0) = A(1,2)*A(2,0) - A(1,0)*A(2,2);
630 B(2,0) = A(1,0)*A(2,1) - A(1,1)*A(2,0);
632 const ET
det(
real( A(0,0)*B(0,0) + A(0,1)*B(1,0) + A(0,2)*B(2,0) ) );
638 B(0,1) =
conj( B(1,0) );
639 B(1,1) = ET(
real( A(0,0)*A(2,2) - A(0,2)*A(2,0) ) );
640 B(2,1) = A(0,1)*A(2,0) - A(0,0)*A(2,1);
641 B(0,2) =
conj( B(2,0) );
642 B(1,2) =
conj( B(2,1) );
643 B(2,2) = ET(
real( A(0,0)*A(1,1) - A(0,1)*A(1,0) ) );
667 template<
typename MT
669 inline void invertLower3x3( DenseMatrix<MT,SO>& dm )
676 using ET = ElementType_t<MT>;
678 const StaticMatrix<ET,3UL,3UL,SO> A( ~dm );
681 const ET tmp( A(1,1)*A(2,2) );
682 const ET
det( A(0,0)*tmp );
689 B(1,0) = - A(1,0)*A(2,2);
690 B(2,0) = A(1,0)*A(2,1) - A(1,1)*A(2,0);
691 B(1,1) = A(0,0)*A(2,2);
692 B(2,1) = - A(0,0)*A(2,1);
693 B(2,2) = A(0,0)*A(1,1);
715 template<
typename MT
717 inline void invertUniLower3x3( DenseMatrix<MT,SO>& dm )
724 using ET = ElementType_t<MT>;
726 const StaticMatrix<ET,3UL,3UL,SO> A( ~dm );
730 B(2,0) = A(1,0)*A(2,1) - A(2,0);
753 template<
typename MT
755 inline void invertUpper3x3( DenseMatrix<MT,SO>& dm )
762 using ET = ElementType_t<MT>;
764 const StaticMatrix<ET,3UL,3UL,SO> A( ~dm );
767 const ET tmp( A(1,1)*A(2,2) );
768 const ET
det( A(0,0)*tmp );
775 B(0,1) = - A(0,1)*A(2,2);
776 B(1,1) = A(0,0)*A(2,2);
777 B(0,2) = A(0,1)*A(1,2) - A(0,2)*A(1,1);
778 B(1,2) = - A(0,0)*A(1,2);
779 B(2,2) = A(0,0)*A(1,1);
801 template<
typename MT
803 inline void invertUniUpper3x3( DenseMatrix<MT,SO>& dm )
810 using ET = ElementType_t<MT>;
812 const StaticMatrix<ET,3UL,3UL,SO> A( ~dm );
816 B(0,2) = A(0,1)*A(1,2) - A(0,2);
839 template<
typename MT
841 inline void invertDiagonal3x3( DenseMatrix<MT,SO>& dm )
848 using ET = ElementType_t<MT>;
852 const ET tmp1( A(0,0)*A(1,1) );
853 const ET tmp2( A(0,0)*A(2,2) );
855 const ET
det( tmp1*A(2,2) );
861 const ET idet( ET(1) /
det );
863 A(0,0) = A(1,1)*A(2,2)*idet;
897 inline void invert3x3( DenseMatrix<MT,SO>& dm )
905 case byLU : invertGeneral3x3 ( ~dm );
break;
906 case byLDLT : invertSymmetric3x3( ~dm );
break;
907 case byLDLH : invertHermitian3x3( ~dm );
break;
908 case byLLH : invertHermitian3x3( ~dm );
break;
909 case asGeneral : invertGeneral3x3 ( ~dm );
break;
910 case asSymmetric: invertSymmetric3x3( ~dm );
break;
911 case asHermitian: invertHermitian3x3( ~dm );
break;
912 case asLower : invertLower3x3 ( ~dm );
break;
913 case asUniLower : invertUniLower3x3 ( ~dm );
break;
914 case asUpper : invertUpper3x3 ( ~dm );
break;
915 case asUniUpper : invertUniUpper3x3 ( ~dm );
break;
916 case asDiagonal : invertDiagonal3x3 ( ~dm );
break;
951 template<
typename MT
953 inline void invertGeneral4x4( DenseMatrix<MT,SO>& dm )
961 using ET = ElementType_t<MT>;
963 const StaticMatrix<ET,4UL,4UL,SO> A( ~dm );
966 ET tmp1( A(2,2)*A(3,3) - A(2,3)*A(3,2) );
967 ET tmp2( A(2,1)*A(3,3) - A(2,3)*A(3,1) );
968 ET tmp3( A(2,1)*A(3,2) - A(2,2)*A(3,1) );
970 B(0,0) = A(1,1)*tmp1 - A(1,2)*tmp2 + A(1,3)*tmp3;
971 B(0,1) = A(0,2)*tmp2 - A(0,1)*tmp1 - A(0,3)*tmp3;
973 ET tmp4( A(2,0)*A(3,3) - A(2,3)*A(3,0) );
974 ET tmp5( A(2,0)*A(3,2) - A(2,2)*A(3,0) );
976 B(1,0) = A(1,2)*tmp4 - A(1,0)*tmp1 - A(1,3)*tmp5;
977 B(1,1) = A(0,0)*tmp1 - A(0,2)*tmp4 + A(0,3)*tmp5;
979 tmp1 = A(2,0)*A(3,1) - A(2,1)*A(3,0);
981 B(2,0) = A(1,0)*tmp2 - A(1,1)*tmp4 + A(1,3)*tmp1;
982 B(2,1) = A(0,1)*tmp4 - A(0,0)*tmp2 - A(0,3)*tmp1;
983 B(3,0) = A(1,1)*tmp5 - A(1,0)*tmp3 - A(1,2)*tmp1;
984 B(3,1) = A(0,0)*tmp3 - A(0,1)*tmp5 + A(0,2)*tmp1;
986 tmp1 = A(0,2)*A(1,3) - A(0,3)*A(1,2);
987 tmp2 = A(0,1)*A(1,3) - A(0,3)*A(1,1);
988 tmp3 = A(0,1)*A(1,2) - A(0,2)*A(1,1);
990 B(0,2) = A(3,1)*tmp1 - A(3,2)*tmp2 + A(3,3)*tmp3;
991 B(0,3) = A(2,2)*tmp2 - A(2,1)*tmp1 - A(2,3)*tmp3;
993 tmp4 = A(0,0)*A(1,3) - A(0,3)*A(1,0);
994 tmp5 = A(0,0)*A(1,2) - A(0,2)*A(1,0);
996 B(1,2) = A(3,2)*tmp4 - A(3,0)*tmp1 - A(3,3)*tmp5;
997 B(1,3) = A(2,0)*tmp1 - A(2,2)*tmp4 + A(2,3)*tmp5;
999 tmp1 = A(0,0)*A(1,1) - A(0,1)*A(1,0);
1001 B(2,2) = A(3,0)*tmp2 - A(3,1)*tmp4 + A(3,3)*tmp1;
1002 B(2,3) = A(2,1)*tmp4 - A(2,0)*tmp2 - A(2,3)*tmp1;
1003 B(3,2) = A(3,1)*tmp5 - A(3,0)*tmp3 - A(3,2)*tmp1;
1004 B(3,3) = A(2,0)*tmp3 - A(2,1)*tmp5 + A(2,2)*tmp1;
1006 const ET
det( A(0,0)*B(0,0) + A(0,1)*B(1,0) + A(0,2)*B(2,0) + A(0,3)*B(3,0) );
1035 template<
typename MT
1037 inline void invertSymmetric4x4( DenseMatrix<MT,SO>& dm )
1044 using ET = ElementType_t<MT>;
1046 const StaticMatrix<ET,4UL,4UL,SO> A( ~dm );
1049 ET tmp1( A(2,2)*A(3,3) - A(2,3)*A(3,2) );
1050 ET tmp2( A(2,1)*A(3,3) - A(2,3)*A(3,1) );
1051 ET tmp3( A(2,1)*A(3,2) - A(2,2)*A(3,1) );
1053 B(0,0) = A(1,1)*tmp1 - A(1,2)*tmp2 + A(1,3)*tmp3;
1054 B(0,1) = A(0,2)*tmp2 - A(0,1)*tmp1 - A(0,3)*tmp3;
1056 ET tmp4( A(2,0)*A(3,3) - A(2,3)*A(3,0) );
1057 ET tmp5( A(2,0)*A(3,2) - A(2,2)*A(3,0) );
1059 B(1,1) = A(0,0)*tmp1 - A(0,2)*tmp4 + A(0,3)*tmp5;
1061 tmp1 = A(2,0)*A(3,1) - A(2,1)*A(3,0);
1063 B(2,0) = A(1,0)*tmp2 - A(1,1)*tmp4 + A(1,3)*tmp1;
1064 B(2,1) = A(0,1)*tmp4 - A(0,0)*tmp2 - A(0,3)*tmp1;
1065 B(3,0) = A(1,1)*tmp5 - A(1,0)*tmp3 - A(1,2)*tmp1;
1066 B(3,1) = A(0,0)*tmp3 - A(0,1)*tmp5 + A(0,2)*tmp1;
1068 tmp1 = A(0,1)*A(1,3) - A(0,3)*A(1,1);
1069 tmp2 = A(0,1)*A(1,2) - A(0,2)*A(1,1);
1070 tmp3 = A(0,0)*A(1,3) - A(0,3)*A(1,0);
1071 tmp4 = A(0,0)*A(1,2) - A(0,2)*A(1,0);
1072 tmp5 = A(0,0)*A(1,1) - A(0,1)*A(1,0);
1074 B(2,2) = A(3,0)*tmp1 - A(3,1)*tmp3 + A(3,3)*tmp5;
1075 B(2,3) = A(2,1)*tmp3 - A(2,0)*tmp1 - A(2,3)*tmp5;
1076 B(3,3) = A(2,0)*tmp2 - A(2,1)*tmp4 + A(2,2)*tmp5;
1085 const ET
det( A(0,0)*B(0,0) + A(0,1)*B(1,0) + A(0,2)*B(2,0) + A(0,3)*B(3,0) );
1113 template<
typename MT
1115 inline void invertHermitian4x4( DenseMatrix<MT,SO>& dm )
1122 using ET = ElementType_t<MT>;
1124 const StaticMatrix<ET,4UL,4UL,SO> A( ~dm );
1127 ET tmp1( A(2,2)*A(3,3) - A(2,3)*A(3,2) );
1128 ET tmp2( A(2,1)*A(3,3) - A(2,3)*A(3,1) );
1129 ET tmp3( A(2,1)*A(3,2) - A(2,2)*A(3,1) );
1131 B(0,0) = ET(
real( A(1,1)*tmp1 - A(1,2)*tmp2 + A(1,3)*tmp3 ) );
1132 B(0,1) = A(0,2)*tmp2 - A(0,1)*tmp1 - A(0,3)*tmp3;
1134 ET tmp4( A(2,0)*A(3,3) - A(2,3)*A(3,0) );
1135 ET tmp5( A(2,0)*A(3,2) - A(2,2)*A(3,0) );
1137 B(1,1) = ET(
real( A(0,0)*tmp1 - A(0,2)*tmp4 + A(0,3)*tmp5 ) );
1139 tmp1 = A(2,0)*A(3,1) - A(2,1)*A(3,0);
1141 B(2,0) = A(1,0)*tmp2 - A(1,1)*tmp4 + A(1,3)*tmp1;
1142 B(2,1) = A(0,1)*tmp4 - A(0,0)*tmp2 - A(0,3)*tmp1;
1143 B(3,0) = A(1,1)*tmp5 - A(1,0)*tmp3 - A(1,2)*tmp1;
1144 B(3,1) = A(0,0)*tmp3 - A(0,1)*tmp5 + A(0,2)*tmp1;
1146 tmp1 = A(0,1)*A(1,3) - A(0,3)*A(1,1);
1147 tmp2 = A(0,1)*A(1,2) - A(0,2)*A(1,1);
1148 tmp3 = A(0,0)*A(1,3) - A(0,3)*A(1,0);
1149 tmp4 = A(0,0)*A(1,2) - A(0,2)*A(1,0);
1150 tmp5 = A(0,0)*A(1,1) - A(0,1)*A(1,0);
1152 B(2,2) = ET(
real( A(3,0)*tmp1 - A(3,1)*tmp3 + A(3,3)*tmp5 ) );
1153 B(2,3) = A(2,1)*tmp3 - A(2,0)*tmp1 - A(2,3)*tmp5;
1154 B(3,3) = ET(
real( A(2,0)*tmp2 - A(2,1)*tmp4 + A(2,2)*tmp5 ) );
1156 B(0,2) =
conj( B(2,0) );
1157 B(0,3) =
conj( B(3,0) );
1158 B(1,0) =
conj( B(0,1) );
1159 B(1,2) =
conj( B(2,1) );
1160 B(1,3) =
conj( B(3,1) );
1161 B(3,2) =
conj( B(2,3) );
1163 const ET
det(
real( A(0,0)*B(0,0) + A(0,1)*B(1,0) + A(0,2)*B(2,0) + A(0,3)*B(3,0) ) );
1191 template<
typename MT
1193 inline void invertLower4x4( DenseMatrix<MT,SO>& dm )
1200 using ET = ElementType_t<MT>;
1202 const StaticMatrix<ET,4UL,4UL,SO> A( ~dm );
1205 const ET tmp1( A(2,2)*A(3,3) );
1206 const ET tmp2( A(2,1)*A(3,3) );
1207 const ET tmp3( A(2,1)*A(3,2) - A(2,2)*A(3,1) );
1208 const ET tmp4( A(0,0)*A(1,1) );
1210 const ET
det( tmp4 * A(2,2) * A(3,3) );
1216 B(0,0) = A(1,1)*tmp1;
1217 B(1,0) = - A(1,0)*tmp1;
1218 B(2,0) = A(1,0)*tmp2 - A(1,1)*A(2,0)*A(3,3);
1219 B(3,0) = A(1,1)*( A(2,0)*A(3,2) - A(2,2)*A(3,0) ) - A(1,0)*tmp3;
1220 B(1,1) = A(0,0)*tmp1;
1221 B(2,1) = - A(0,0)*tmp2;
1222 B(3,1) = A(0,0)*tmp3;
1223 B(2,2) = A(3,3)*tmp4;
1224 B(3,2) = - A(3,2)*tmp4;
1225 B(3,3) = A(2,2)*tmp4;
1247 template<
typename MT
1249 inline void invertUniLower4x4( DenseMatrix<MT,SO>& dm )
1256 using ET = ElementType_t<MT>;
1258 const StaticMatrix<ET,4UL,4UL,SO> A( ~dm );
1261 const ET tmp( A(2,1)*A(3,2) - A(3,1) );
1264 B(2,0) = A(1,0)*A(2,1) - A(2,0);
1265 B(3,0) = A(2,0)*A(3,2) - A(3,0) - A(1,0)*tmp;
1290 template<
typename MT
1292 inline void invertUpper4x4( DenseMatrix<MT,SO>& dm )
1299 using ET = ElementType_t<MT>;
1301 const StaticMatrix<ET,4UL,4UL,SO> A( ~dm );
1304 ET tmp1( A(2,2)*A(3,3) );
1305 ET tmp2( A(0,1)*A(1,2) - A(0,2)*A(1,1) );
1306 ET tmp3( A(0,0)*A(1,2) );
1307 ET tmp4( A(0,0)*A(1,1) );
1309 const ET
det( A(0,0)*A(1,1)*tmp1 );
1315 B(0,0) = A(1,1)*tmp1;
1316 B(0,1) = - A(0,1)*tmp1;
1317 B(1,1) = A(0,0)*tmp1;
1318 B(0,2) = A(3,3)*tmp2;
1319 B(1,2) = - A(3,3)*tmp3;
1320 B(2,2) = A(3,3)*tmp4;
1321 B(0,3) = A(2,2)*( A(0,1)*A(1,3) - A(0,3)*A(1,1) ) - A(2,3)*tmp2;
1322 B(1,3) = A(2,3)*tmp3 - A(2,2)*A(0,0)*A(1,3);
1323 B(2,3) = - A(2,3)*tmp4;
1324 B(3,3) = A(2,2)*tmp4;
1346 template<
typename MT
1348 inline void invertUniUpper4x4( DenseMatrix<MT,SO>& dm )
1355 using ET = ElementType_t<MT>;
1357 const StaticMatrix<ET,4UL,4UL,SO> A( ~dm );
1360 ET tmp( A(0,1)*A(1,2) - A(0,2) );
1365 B(0,3) = A(0,1)*A(1,3) - A(0,3) - A(2,3)*tmp;
1366 B(1,3) = A(2,3)*A(1,2) - A(1,3);
1389 template<
typename MT
1391 inline void invertDiagonal4x4( DenseMatrix<MT,SO>& dm )
1398 using ET = ElementType_t<MT>;
1402 const ET tmp1( A(2,2)*A(3,3) );
1403 const ET tmp2( A(0,0)*A(1,1) );
1404 const ET tmp3( A(0,0)*tmp1 );
1405 const ET tmp4( A(2,2)*tmp2 );
1407 const ET
det( tmp1 * tmp2 );
1413 const ET idet( ET(1) /
det );
1415 A(0,0) = A(1,1)*tmp1*idet;
1417 A(2,2) = A(3,3)*tmp2*idet;
1450 inline void invert4x4( DenseMatrix<MT,SO>& dm )
1458 case byLU : invertGeneral4x4 ( ~dm );
break;
1459 case byLDLT : invertSymmetric4x4( ~dm );
break;
1460 case byLDLH : invertHermitian4x4( ~dm );
break;
1461 case byLLH : invertHermitian4x4( ~dm );
break;
1462 case asGeneral : invertGeneral4x4 ( ~dm );
break;
1463 case asSymmetric: invertSymmetric4x4( ~dm );
break;
1464 case asHermitian: invertHermitian4x4( ~dm );
break;
1465 case asLower : invertLower4x4 ( ~dm );
break;
1466 case asUniLower : invertUniLower4x4 ( ~dm );
break;
1467 case asUpper : invertUpper4x4 ( ~dm );
break;
1468 case asUniUpper : invertUniUpper4x4 ( ~dm );
break;
1469 case asDiagonal : invertDiagonal4x4 ( ~dm );
break;
1504 template<
typename MT
1506 inline void invertGeneral5x5( DenseMatrix<MT,SO>& dm )
1514 using ET = ElementType_t<MT>;
1516 const StaticMatrix<ET,5UL,5UL,SO> A( ~dm );
1519 ET tmp1 ( A(3,3)*A(4,4) - A(3,4)*A(4,3) );
1520 ET tmp2 ( A(3,2)*A(4,4) - A(3,4)*A(4,2) );
1521 ET tmp3 ( A(3,2)*A(4,3) - A(3,3)*A(4,2) );
1522 ET tmp4 ( A(3,1)*A(4,4) - A(3,4)*A(4,1) );
1523 ET tmp5 ( A(3,1)*A(4,3) - A(3,3)*A(4,1) );
1524 ET tmp6 ( A(3,1)*A(4,2) - A(3,2)*A(4,1) );
1525 ET tmp7 ( A(3,0)*A(4,4) - A(3,4)*A(4,0) );
1526 ET tmp8 ( A(3,0)*A(4,3) - A(3,3)*A(4,0) );
1527 ET tmp9 ( A(3,0)*A(4,2) - A(3,2)*A(4,0) );
1528 ET tmp10( A(3,0)*A(4,1) - A(3,1)*A(4,0) );
1530 ET tmp11( A(2,2)*tmp1 - A(2,3)*tmp2 + A(2,4)*tmp3 );
1531 ET tmp12( A(2,1)*tmp1 - A(2,3)*tmp4 + A(2,4)*tmp5 );
1532 ET tmp13( A(2,1)*tmp2 - A(2,2)*tmp4 + A(2,4)*tmp6 );
1533 ET tmp14( A(2,1)*tmp3 - A(2,2)*tmp5 + A(2,3)*tmp6 );
1534 ET tmp15( A(2,0)*tmp1 - A(2,3)*tmp7 + A(2,4)*tmp8 );
1535 ET tmp16( A(2,0)*tmp2 - A(2,2)*tmp7 + A(2,4)*tmp9 );
1536 ET tmp17( A(2,0)*tmp3 - A(2,2)*tmp8 + A(2,3)*tmp9 );
1538 B(0,0) = A(1,1)*tmp11 - A(1,2)*tmp12 + A(1,3)*tmp13 - A(1,4)*tmp14;
1539 B(0,1) = - A(0,1)*tmp11 + A(0,2)*tmp12 - A(0,3)*tmp13 + A(0,4)*tmp14;
1540 B(1,0) = - A(1,0)*tmp11 + A(1,2)*tmp15 - A(1,3)*tmp16 + A(1,4)*tmp17;
1541 B(1,1) = A(0,0)*tmp11 - A(0,2)*tmp15 + A(0,3)*tmp16 - A(0,4)*tmp17;
1543 ET tmp18( A(2,0)*tmp4 - A(2,1)*tmp7 + A(2,4)*tmp10 );
1544 ET tmp19( A(2,0)*tmp5 - A(2,1)*tmp8 + A(2,3)*tmp10 );
1545 ET tmp20( A(2,0)*tmp6 - A(2,1)*tmp9 + A(2,2)*tmp10 );
1547 B(2,0) = A(1,0)*tmp12 - A(1,1)*tmp15 + A(1,3)*tmp18 - A(1,4)*tmp19;
1548 B(2,1) = - A(0,0)*tmp12 + A(0,1)*tmp15 - A(0,3)*tmp18 + A(0,4)*tmp19;
1549 B(3,0) = - A(1,0)*tmp13 + A(1,1)*tmp16 - A(1,2)*tmp18 + A(1,4)*tmp20;
1550 B(3,1) = A(0,0)*tmp13 - A(0,1)*tmp16 + A(0,2)*tmp18 - A(0,4)*tmp20;
1551 B(4,0) = A(1,0)*tmp14 - A(1,1)*tmp17 + A(1,2)*tmp19 - A(1,3)*tmp20;
1552 B(4,1) = - A(0,0)*tmp14 + A(0,1)*tmp17 - A(0,2)*tmp19 + A(0,3)*tmp20;
1554 tmp11 = A(1,2)*tmp1 - A(1,3)*tmp2 + A(1,4)*tmp3;
1555 tmp12 = A(1,1)*tmp1 - A(1,3)*tmp4 + A(1,4)*tmp5;
1556 tmp13 = A(1,1)*tmp2 - A(1,2)*tmp4 + A(1,4)*tmp6;
1557 tmp14 = A(1,1)*tmp3 - A(1,2)*tmp5 + A(1,3)*tmp6;
1558 tmp15 = A(1,0)*tmp1 - A(1,3)*tmp7 + A(1,4)*tmp8;
1559 tmp16 = A(1,0)*tmp2 - A(1,2)*tmp7 + A(1,4)*tmp9;
1560 tmp17 = A(1,0)*tmp3 - A(1,2)*tmp8 + A(1,3)*tmp9;
1561 tmp18 = A(1,0)*tmp4 - A(1,1)*tmp7 + A(1,4)*tmp10;
1562 tmp19 = A(1,0)*tmp5 - A(1,1)*tmp8 + A(1,3)*tmp10;
1564 B(0,2) = A(0,1)*tmp11 - A(0,2)*tmp12 + A(0,3)*tmp13 - A(0,4)*tmp14;
1565 B(1,2) = - A(0,0)*tmp11 + A(0,2)*tmp15 - A(0,3)*tmp16 + A(0,4)*tmp17;
1566 B(2,2) = A(0,0)*tmp12 - A(0,1)*tmp15 + A(0,3)*tmp18 - A(0,4)*tmp19;
1568 tmp1 = A(0,2)*A(1,3) - A(0,3)*A(1,2);
1569 tmp2 = A(0,1)*A(1,3) - A(0,3)*A(1,1);
1570 tmp3 = A(0,1)*A(1,2) - A(0,2)*A(1,1);
1571 tmp4 = A(0,0)*A(1,3) - A(0,3)*A(1,0);
1572 tmp5 = A(0,0)*A(1,2) - A(0,2)*A(1,0);
1573 tmp6 = A(0,0)*A(1,1) - A(0,1)*A(1,0);
1574 tmp7 = A(0,2)*A(1,4) - A(0,4)*A(1,2);
1575 tmp8 = A(0,1)*A(1,4) - A(0,4)*A(1,1);
1576 tmp9 = A(0,0)*A(1,4) - A(0,4)*A(1,0);
1577 tmp10 = A(0,3)*A(1,4) - A(0,4)*A(1,3);
1579 tmp11 = A(2,2)*tmp10 - A(2,3)*tmp7 + A(2,4)*tmp1;
1580 tmp12 = A(2,1)*tmp10 - A(2,3)*tmp8 + A(2,4)*tmp2;
1581 tmp13 = A(2,1)*tmp7 - A(2,2)*tmp8 + A(2,4)*tmp3;
1582 tmp14 = A(2,1)*tmp1 - A(2,2)*tmp2 + A(2,3)*tmp3;
1583 tmp15 = A(2,0)*tmp10 - A(2,3)*tmp9 + A(2,4)*tmp4;
1584 tmp16 = A(2,0)*tmp7 - A(2,2)*tmp9 + A(2,4)*tmp5;
1585 tmp17 = A(2,0)*tmp1 - A(2,2)*tmp4 + A(2,3)*tmp5;
1587 B(0,3) = A(4,1)*tmp11 - A(4,2)*tmp12 + A(4,3)*tmp13 - A(4,4)*tmp14;
1588 B(0,4) = - A(3,1)*tmp11 + A(3,2)*tmp12 - A(3,3)*tmp13 + A(3,4)*tmp14;
1589 B(1,3) = - A(4,0)*tmp11 + A(4,2)*tmp15 - A(4,3)*tmp16 + A(4,4)*tmp17;
1590 B(1,4) = A(3,0)*tmp11 - A(3,2)*tmp15 + A(3,3)*tmp16 - A(3,4)*tmp17;
1592 tmp18 = A(2,0)*tmp8 - A(2,1)*tmp9 + A(2,4)*tmp6;
1593 tmp19 = A(2,0)*tmp2 - A(2,1)*tmp4 + A(2,3)*tmp6;
1594 tmp20 = A(2,0)*tmp3 - A(2,1)*tmp5 + A(2,2)*tmp6;
1596 B(2,3) = A(4,0)*tmp12 - A(4,1)*tmp15 + A(4,3)*tmp18 - A(4,4)*tmp19;
1597 B(2,4) = - A(3,0)*tmp12 + A(3,1)*tmp15 - A(3,3)*tmp18 + A(3,4)*tmp19;
1598 B(3,3) = - A(4,0)*tmp13 + A(4,1)*tmp16 - A(4,2)*tmp18 + A(4,4)*tmp20;
1599 B(3,4) = A(3,0)*tmp13 - A(3,1)*tmp16 + A(3,2)*tmp18 - A(3,4)*tmp20;
1600 B(4,3) = A(4,0)*tmp14 - A(4,1)*tmp17 + A(4,2)*tmp19 - A(4,3)*tmp20;
1601 B(4,4) = - A(3,0)*tmp14 + A(3,1)*tmp17 - A(3,2)*tmp19 + A(3,3)*tmp20;
1603 tmp11 = A(3,1)*tmp7 - A(3,2)*tmp8 + A(3,4)*tmp3;
1604 tmp12 = A(3,0)*tmp7 - A(3,2)*tmp9 + A(3,4)*tmp5;
1605 tmp13 = A(3,0)*tmp8 - A(3,1)*tmp9 + A(3,4)*tmp6;
1606 tmp14 = A(3,0)*tmp3 - A(3,1)*tmp5 + A(3,2)*tmp6;
1608 tmp15 = A(3,1)*tmp1 - A(3,2)*tmp2 + A(3,3)*tmp3;
1609 tmp16 = A(3,0)*tmp1 - A(3,2)*tmp4 + A(3,3)*tmp5;
1610 tmp17 = A(3,0)*tmp2 - A(3,1)*tmp4 + A(3,3)*tmp6;
1612 B(3,2) = A(4,0)*tmp11 - A(4,1)*tmp12 + A(4,2)*tmp13 - A(4,4)*tmp14;
1613 B(4,2) = - A(4,0)*tmp15 + A(4,1)*tmp16 - A(4,2)*tmp17 + A(4,3)*tmp14;
1615 const ET
det( A(0,0)*B(0,0) + A(0,1)*B(1,0) + A(0,2)*B(2,0) + A(0,3)*B(3,0) + A(0,4)*B(4,0) );
1644 template<
typename MT
1646 inline void invertSymmetric5x5( DenseMatrix<MT,SO>& dm )
1653 using ET = ElementType_t<MT>;
1655 const StaticMatrix<ET,5UL,5UL,SO> A( ~dm );
1658 ET tmp1 ( A(3,3)*A(4,4) - A(3,4)*A(4,3) );
1659 ET tmp2 ( A(3,2)*A(4,4) - A(3,4)*A(4,2) );
1660 ET tmp3 ( A(3,2)*A(4,3) - A(3,3)*A(4,2) );
1661 ET tmp4 ( A(3,1)*A(4,4) - A(3,4)*A(4,1) );
1662 ET tmp5 ( A(3,1)*A(4,3) - A(3,3)*A(4,1) );
1663 ET tmp6 ( A(3,1)*A(4,2) - A(3,2)*A(4,1) );
1664 ET tmp7 ( A(3,0)*A(4,4) - A(3,4)*A(4,0) );
1665 ET tmp8 ( A(3,0)*A(4,3) - A(3,3)*A(4,0) );
1666 ET tmp9 ( A(3,0)*A(4,2) - A(3,2)*A(4,0) );
1667 ET tmp10( A(3,0)*A(4,1) - A(3,1)*A(4,0) );
1669 ET tmp11( A(2,2)*tmp1 - A(2,3)*tmp2 + A(2,4)*tmp3 );
1670 ET tmp12( A(2,1)*tmp1 - A(2,3)*tmp4 + A(2,4)*tmp5 );
1671 ET tmp13( A(2,1)*tmp2 - A(2,2)*tmp4 + A(2,4)*tmp6 );
1672 ET tmp14( A(2,1)*tmp3 - A(2,2)*tmp5 + A(2,3)*tmp6 );
1673 ET tmp15( A(2,0)*tmp1 - A(2,3)*tmp7 + A(2,4)*tmp8 );
1674 ET tmp16( A(2,0)*tmp2 - A(2,2)*tmp7 + A(2,4)*tmp9 );
1675 ET tmp17( A(2,0)*tmp3 - A(2,2)*tmp8 + A(2,3)*tmp9 );
1677 B(0,0) = A(1,1)*tmp11 - A(1,2)*tmp12 + A(1,3)*tmp13 - A(1,4)*tmp14;
1678 B(0,1) = - A(0,1)*tmp11 + A(0,2)*tmp12 - A(0,3)*tmp13 + A(0,4)*tmp14;
1679 B(1,1) = A(0,0)*tmp11 - A(0,2)*tmp15 + A(0,3)*tmp16 - A(0,4)*tmp17;
1681 ET tmp18( A(2,0)*tmp4 - A(2,1)*tmp7 + A(2,4)*tmp10 );
1682 ET tmp19( A(2,0)*tmp5 - A(2,1)*tmp8 + A(2,3)*tmp10 );
1683 ET tmp20( A(2,0)*tmp6 - A(2,1)*tmp9 + A(2,2)*tmp10 );
1685 B(2,0) = A(1,0)*tmp12 - A(1,1)*tmp15 + A(1,3)*tmp18 - A(1,4)*tmp19;
1686 B(2,1) = - A(0,0)*tmp12 + A(0,1)*tmp15 - A(0,3)*tmp18 + A(0,4)*tmp19;
1687 B(3,0) = - A(1,0)*tmp13 + A(1,1)*tmp16 - A(1,2)*tmp18 + A(1,4)*tmp20;
1688 B(3,1) = A(0,0)*tmp13 - A(0,1)*tmp16 + A(0,2)*tmp18 - A(0,4)*tmp20;
1689 B(4,0) = A(1,0)*tmp14 - A(1,1)*tmp17 + A(1,2)*tmp19 - A(1,3)*tmp20;
1690 B(4,1) = - A(0,0)*tmp14 + A(0,1)*tmp17 - A(0,2)*tmp19 + A(0,3)*tmp20;
1692 tmp11 = A(1,1)*tmp1 - A(1,3)*tmp4 + A(1,4)*tmp5;
1693 tmp12 = A(1,0)*tmp1 - A(1,3)*tmp7 + A(1,4)*tmp8;
1694 tmp13 = A(1,0)*tmp4 - A(1,1)*tmp7 + A(1,4)*tmp10;
1695 tmp14 = A(1,0)*tmp5 - A(1,1)*tmp8 + A(1,3)*tmp10;
1697 B(2,2) = A(0,0)*tmp11 - A(0,1)*tmp12 + A(0,3)*tmp13 - A(0,4)*tmp14;
1699 tmp1 = A(0,2)*A(1,3) - A(0,3)*A(1,2);
1700 tmp2 = A(0,1)*A(1,3) - A(0,3)*A(1,1);
1701 tmp3 = A(0,1)*A(1,2) - A(0,2)*A(1,1);
1702 tmp4 = A(0,0)*A(1,3) - A(0,3)*A(1,0);
1703 tmp5 = A(0,0)*A(1,2) - A(0,2)*A(1,0);
1704 tmp6 = A(0,0)*A(1,1) - A(0,1)*A(1,0);
1705 tmp7 = A(0,2)*A(1,4) - A(0,4)*A(1,2);
1706 tmp8 = A(0,1)*A(1,4) - A(0,4)*A(1,1);
1707 tmp9 = A(0,0)*A(1,4) - A(0,4)*A(1,0);
1708 tmp10 = A(0,3)*A(1,4) - A(0,4)*A(1,3);
1710 tmp11 = A(2,1)*tmp10 - A(2,3)*tmp8 + A(2,4)*tmp2;
1711 tmp12 = A(2,1)*tmp7 - A(2,2)*tmp8 + A(2,4)*tmp3;
1712 tmp13 = A(2,1)*tmp1 - A(2,2)*tmp2 + A(2,3)*tmp3;
1713 tmp14 = A(2,0)*tmp10 - A(2,3)*tmp9 + A(2,4)*tmp4;
1714 tmp15 = A(2,0)*tmp7 - A(2,2)*tmp9 + A(2,4)*tmp5;
1715 tmp16 = A(2,0)*tmp1 - A(2,2)*tmp4 + A(2,3)*tmp5;
1716 tmp17 = A(2,0)*tmp8 - A(2,1)*tmp9 + A(2,4)*tmp6;
1717 tmp18 = A(2,0)*tmp2 - A(2,1)*tmp4 + A(2,3)*tmp6;
1718 tmp19 = A(2,0)*tmp3 - A(2,1)*tmp5 + A(2,2)*tmp6;
1720 B(2,3) = A(4,0)*tmp11 - A(4,1)*tmp14 + A(4,3)*tmp17 - A(4,4)*tmp18;
1721 B(2,4) = - A(3,0)*tmp11 + A(3,1)*tmp14 - A(3,3)*tmp17 + A(3,4)*tmp18;
1722 B(3,3) = - A(4,0)*tmp12 + A(4,1)*tmp15 - A(4,2)*tmp17 + A(4,4)*tmp19;
1723 B(3,4) = A(3,0)*tmp12 - A(3,1)*tmp15 + A(3,2)*tmp17 - A(3,4)*tmp19;
1724 B(4,4) = - A(3,0)*tmp13 + A(3,1)*tmp16 - A(3,2)*tmp18 + A(3,3)*tmp19;
1737 const ET
det( A(0,0)*B(0,0) + A(0,1)*B(1,0) + A(0,2)*B(2,0) + A(0,3)*B(3,0) + A(0,4)*B(4,0) );
1765 template<
typename MT
1767 inline void invertHermitian5x5( DenseMatrix<MT,SO>& dm )
1774 using ET = ElementType_t<MT>;
1776 const StaticMatrix<ET,5UL,5UL,SO> A( ~dm );
1779 ET tmp1 ( A(3,3)*A(4,4) - A(3,4)*A(4,3) );
1780 ET tmp2 ( A(3,2)*A(4,4) - A(3,4)*A(4,2) );
1781 ET tmp3 ( A(3,2)*A(4,3) - A(3,3)*A(4,2) );
1782 ET tmp4 ( A(3,1)*A(4,4) - A(3,4)*A(4,1) );
1783 ET tmp5 ( A(3,1)*A(4,3) - A(3,3)*A(4,1) );
1784 ET tmp6 ( A(3,1)*A(4,2) - A(3,2)*A(4,1) );
1785 ET tmp7 ( A(3,0)*A(4,4) - A(3,4)*A(4,0) );
1786 ET tmp8 ( A(3,0)*A(4,3) - A(3,3)*A(4,0) );
1787 ET tmp9 ( A(3,0)*A(4,2) - A(3,2)*A(4,0) );
1788 ET tmp10( A(3,0)*A(4,1) - A(3,1)*A(4,0) );
1790 ET tmp11( A(2,2)*tmp1 - A(2,3)*tmp2 + A(2,4)*tmp3 );
1791 ET tmp12( A(2,1)*tmp1 - A(2,3)*tmp4 + A(2,4)*tmp5 );
1792 ET tmp13( A(2,1)*tmp2 - A(2,2)*tmp4 + A(2,4)*tmp6 );
1793 ET tmp14( A(2,1)*tmp3 - A(2,2)*tmp5 + A(2,3)*tmp6 );
1794 ET tmp15( A(2,0)*tmp1 - A(2,3)*tmp7 + A(2,4)*tmp8 );
1795 ET tmp16( A(2,0)*tmp2 - A(2,2)*tmp7 + A(2,4)*tmp9 );
1796 ET tmp17( A(2,0)*tmp3 - A(2,2)*tmp8 + A(2,3)*tmp9 );
1798 B(0,0) = ET(
real( A(1,1)*tmp11 - A(1,2)*tmp12 + A(1,3)*tmp13 - A(1,4)*tmp14 ) );
1799 B(0,1) = - A(0,1)*tmp11 + A(0,2)*tmp12 - A(0,3)*tmp13 + A(0,4)*tmp14;
1800 B(1,1) = ET(
real( A(0,0)*tmp11 - A(0,2)*tmp15 + A(0,3)*tmp16 - A(0,4)*tmp17 ) );
1802 ET tmp18( A(2,0)*tmp4 - A(2,1)*tmp7 + A(2,4)*tmp10 );
1803 ET tmp19( A(2,0)*tmp5 - A(2,1)*tmp8 + A(2,3)*tmp10 );
1804 ET tmp20( A(2,0)*tmp6 - A(2,1)*tmp9 + A(2,2)*tmp10 );
1806 B(2,0) = A(1,0)*tmp12 - A(1,1)*tmp15 + A(1,3)*tmp18 - A(1,4)*tmp19;
1807 B(2,1) = - A(0,0)*tmp12 + A(0,1)*tmp15 - A(0,3)*tmp18 + A(0,4)*tmp19;
1808 B(3,0) = - A(1,0)*tmp13 + A(1,1)*tmp16 - A(1,2)*tmp18 + A(1,4)*tmp20;
1809 B(3,1) = A(0,0)*tmp13 - A(0,1)*tmp16 + A(0,2)*tmp18 - A(0,4)*tmp20;
1810 B(4,0) = A(1,0)*tmp14 - A(1,1)*tmp17 + A(1,2)*tmp19 - A(1,3)*tmp20;
1811 B(4,1) = - A(0,0)*tmp14 + A(0,1)*tmp17 - A(0,2)*tmp19 + A(0,3)*tmp20;
1813 tmp11 = A(1,1)*tmp1 - A(1,3)*tmp4 + A(1,4)*tmp5;
1814 tmp12 = A(1,0)*tmp1 - A(1,3)*tmp7 + A(1,4)*tmp8;
1815 tmp13 = A(1,0)*tmp4 - A(1,1)*tmp7 + A(1,4)*tmp10;
1816 tmp14 = A(1,0)*tmp5 - A(1,1)*tmp8 + A(1,3)*tmp10;
1818 B(2,2) = ET(
real( A(0,0)*tmp11 - A(0,1)*tmp12 + A(0,3)*tmp13 - A(0,4)*tmp14 ) );
1820 tmp1 = A(0,2)*A(1,3) - A(0,3)*A(1,2);
1821 tmp2 = A(0,1)*A(1,3) - A(0,3)*A(1,1);
1822 tmp3 = A(0,1)*A(1,2) - A(0,2)*A(1,1);
1823 tmp4 = A(0,0)*A(1,3) - A(0,3)*A(1,0);
1824 tmp5 = A(0,0)*A(1,2) - A(0,2)*A(1,0);
1825 tmp6 = A(0,0)*A(1,1) - A(0,1)*A(1,0);
1826 tmp7 = A(0,2)*A(1,4) - A(0,4)*A(1,2);
1827 tmp8 = A(0,1)*A(1,4) - A(0,4)*A(1,1);
1828 tmp9 = A(0,0)*A(1,4) - A(0,4)*A(1,0);
1829 tmp10 = A(0,3)*A(1,4) - A(0,4)*A(1,3);
1831 tmp11 = A(2,1)*tmp10 - A(2,3)*tmp8 + A(2,4)*tmp2;
1832 tmp12 = A(2,1)*tmp7 - A(2,2)*tmp8 + A(2,4)*tmp3;
1833 tmp13 = A(2,1)*tmp1 - A(2,2)*tmp2 + A(2,3)*tmp3;
1834 tmp14 = A(2,0)*tmp10 - A(2,3)*tmp9 + A(2,4)*tmp4;
1835 tmp15 = A(2,0)*tmp7 - A(2,2)*tmp9 + A(2,4)*tmp5;
1836 tmp16 = A(2,0)*tmp1 - A(2,2)*tmp4 + A(2,3)*tmp5;
1837 tmp17 = A(2,0)*tmp8 - A(2,1)*tmp9 + A(2,4)*tmp6;
1838 tmp18 = A(2,0)*tmp2 - A(2,1)*tmp4 + A(2,3)*tmp6;
1839 tmp19 = A(2,0)*tmp3 - A(2,1)*tmp5 + A(2,2)*tmp6;
1841 B(2,3) = A(4,0)*tmp11 - A(4,1)*tmp14 + A(4,3)*tmp17 - A(4,4)*tmp18;
1842 B(2,4) = - A(3,0)*tmp11 + A(3,1)*tmp14 - A(3,3)*tmp17 + A(3,4)*tmp18;
1843 B(3,3) = - ET(
real( A(4,0)*tmp12 - A(4,1)*tmp15 + A(4,2)*tmp17 - A(4,4)*tmp19 ) );
1844 B(3,4) = A(3,0)*tmp12 - A(3,1)*tmp15 + A(3,2)*tmp17 - A(3,4)*tmp19;
1845 B(4,4) = - ET(
real( A(3,0)*tmp13 - A(3,1)*tmp16 + A(3,2)*tmp18 - A(3,3)*tmp19 ) );
1847 B(0,2) =
conj( B(2,0) );
1848 B(0,3) =
conj( B(3,0) );
1849 B(0,4) =
conj( B(4,0) );
1850 B(1,0) =
conj( B(0,1) );
1851 B(1,2) =
conj( B(2,1) );
1852 B(1,3) =
conj( B(3,1) );
1853 B(1,4) =
conj( B(4,1) );
1854 B(3,2) =
conj( B(2,3) );
1855 B(4,2) =
conj( B(2,4) );
1856 B(4,3) =
conj( B(3,4) );
1858 const ET
det(
real( A(0,0)*B(0,0) + A(0,1)*B(1,0) + A(0,2)*B(2,0) + A(0,3)*B(3,0) + A(0,4)*B(4,0) ) );
1886 template<
typename MT
1888 inline void invertLower5x5( DenseMatrix<MT,SO>& dm )
1895 using ET = ElementType_t<MT>;
1897 const StaticMatrix<ET,5UL,5UL,SO> A( ~dm );
1900 const ET tmp1( A(3,3)*A(4,4) );
1901 const ET tmp2( A(3,2)*A(4,4) );
1902 const ET tmp3( A(3,2)*A(4,3) - A(3,3)*A(4,2) );
1903 const ET tmp4( A(0,0)*A(1,1) );
1905 const ET tmp5 ( A(2,2)*tmp1 );
1906 const ET tmp6 ( A(2,1)*tmp1 );
1907 const ET tmp7 ( A(2,1)*tmp2 - A(2,2)*A(3,1)*A(4,4) );
1908 const ET tmp8 ( A(2,1)*tmp3 - A(2,2)*( A(3,1)*A(4,3) - A(3,3)*A(4,1) ) );
1909 const ET tmp9 ( A(3,2)*tmp4 );
1910 const ET tmp10( A(2,2)*tmp4 );
1912 B(0,0) = A(1,1)*tmp5;
1913 B(1,0) = - A(1,0)*tmp5;
1914 B(2,0) = A(1,0)*tmp6 - A(1,1)*A(2,0)*tmp1;
1915 B(3,0) = A(1,1)*( A(2,0)*tmp2 - A(2,2)*A(3,0)*A(4,4) ) - A(1,0)*tmp7;
1916 B(4,0) = A(1,0)*tmp8 - A(1,1)*( A(2,0)*tmp3 - A(2,2)*( A(3,0)*A(4,3) - A(3,3)*A(4,0) ) );
1917 B(1,1) = A(0,0)*tmp5;
1918 B(2,1) = - A(0,0)*tmp6;
1919 B(3,1) = A(0,0)*tmp7;
1920 B(4,1) = - A(0,0)*tmp8;
1921 B(2,2) = A(0,0)*A(1,1)*tmp1;
1922 B(3,2) = - A(4,4)*tmp9;
1923 B(4,2) = A(4,3)*tmp9 - A(4,2)*A(3,3)*tmp4;
1924 B(3,3) = A(4,4)*tmp10;
1925 B(4,3) = - A(4,3)*tmp10;
1926 B(4,4) = A(3,3)*tmp10;
1928 const ET
det( B(4,4) * A(4,4) );
1954 template<
typename MT
1956 inline void invertUniLower5x5( DenseMatrix<MT,SO>& dm )
1963 using ET = ElementType_t<MT>;
1965 const StaticMatrix<ET,5UL,5UL,SO> A( ~dm );
1968 const ET tmp1( A(3,2)*A(4,3) - A(4,2) );
1969 const ET tmp2( A(2,1)*A(3,2) - A(3,1) );
1970 const ET tmp3( A(2,1)*tmp1 - A(3,1)*A(4,3) + A(4,1) );
1973 B(2,0) = A(1,0)*A(2,1) - A(2,0);
1974 B(3,0) = - A(1,0)*tmp2 + A(2,0)*A(3,2) - A(3,0);
1975 B(4,0) = A(1,0)*tmp3 - A(2,0)*tmp1 + A(3,0)*A(4,3) - A(4,0);
1980 B(4,2) = A(4,3)*A(3,2) - A(4,2);
2003 template<
typename MT
2005 inline void invertUpper5x5( DenseMatrix<MT,SO>& dm )
2012 using ET = ElementType_t<MT>;
2014 const StaticMatrix<ET,5UL,5UL,SO> A( ~dm );
2017 const ET tmp1( A(3,3)*A(4,4) );
2018 const ET tmp2( A(0,1)*A(1,2) - A(0,2)*A(1,1) );
2019 const ET tmp3( A(0,0)*A(1,2) );
2020 const ET tmp4( A(0,0)*A(1,1) );
2022 const ET tmp5 ( A(2,2)*tmp1 );
2023 const ET tmp6 ( A(1,2)*tmp1 );
2024 const ET tmp7 ( A(1,1)*tmp1 );
2025 const ET tmp8 ( A(2,3)*tmp2 - A(2,2)*( A(0,1)*A(1,3) - A(0,3)*A(1,1) ) );
2026 const ET tmp9 ( A(2,3)*tmp3 - A(2,2)*A(0,0)*A(1,3) );
2027 const ET tmp10( A(2,3)*tmp4 );
2028 const ET tmp11( A(2,2)*tmp4 );
2030 B(0,0) = A(1,1)*tmp5;
2031 B(0,1) = - A(0,1)*tmp5;
2032 B(1,1) = A(0,0)*tmp5;
2033 B(0,2) = A(0,1)*tmp6 - A(0,2)*tmp7;
2034 B(1,2) = - A(0,0)*tmp6;
2035 B(2,2) = A(0,0)*tmp7;
2036 B(0,3) = - A(4,4)*tmp8;
2037 B(1,3) = A(4,4)*tmp9;
2038 B(2,3) = - A(4,4)*tmp10;
2039 B(3,3) = A(4,4)*tmp11;
2040 B(0,4) = A(3,4)*tmp8 - A(3,3)*( A(2,4)*tmp2 - A(2,2)*( A(0,1)*A(1,4) - A(0,4)*A(1,1) ) );
2041 B(1,4) = A(3,3)*( A(2,4)*tmp3 - A(2,2)*A(0,0)*A(1,4) ) - A(3,4)*tmp9;
2042 B(2,4) = A(3,4)*tmp10 - A(3,3)*A(2,4)*tmp4;
2043 B(3,4) = - A(3,4)*tmp11;
2044 B(4,4) = A(3,3)*tmp11;
2046 const ET
det( A(0,0) * B(0,0) );
2072 template<
typename MT
2074 inline void invertUniUpper5x5( DenseMatrix<MT,SO>& dm )
2081 using ET = ElementType_t<MT>;
2083 const StaticMatrix<ET,5UL,5UL,SO> A( ~dm );
2086 const ET tmp1( A(0,1)*A(1,2) - A(0,2) );
2087 const ET tmp2( A(2,3)*A(1,2) - A(1,3) );
2088 const ET tmp3( A(2,3)*tmp1 - A(0,1)*A(1,3) + A(0,3) );
2091 B(0,2) = A(0,1)*A(1,2) - A(0,2);
2096 B(0,4) = A(3,4)*tmp3 - A(2,4)*tmp1 + A(0,1)*A(1,4) - A(0,4);
2097 B(1,4) = A(2,4)*A(1,2) - A(1,4) - A(3,4)*tmp2;
2098 B(2,4) = A(3,4)*A(2,3) - A(2,4);
2121 template<
typename MT
2123 inline void invertDiagonal5x5( DenseMatrix<MT,SO>& dm )
2130 using ET = ElementType_t<MT>;
2134 const ET tmp1( A(0,0)*A(1,1) );
2135 const ET tmp2( A(3,3)*A(4,4) );
2136 const ET tmp3( A(0,0)*tmp2 );
2137 const ET tmp4( tmp1*A(2,2) );
2138 const ET tmp5( tmp4*A(3,3) );
2140 const ET
det( tmp2*tmp4 );
2146 const ET idet( ET(1) /
det );
2148 A(0,0) = A(1,1)*A(2,2)*tmp2*idet;
2149 A(1,1) = A(2,2)*tmp3*idet;
2150 A(2,2) = tmp1*tmp2*idet;
2151 A(3,3) = tmp4*A(4,4)*idet;
2184 inline void invert5x5( DenseMatrix<MT,SO>& dm )
2192 case byLU : invertGeneral5x5 ( ~dm );
break;
2193 case byLDLT : invertSymmetric5x5( ~dm );
break;
2194 case byLDLH : invertHermitian5x5( ~dm );
break;
2195 case byLLH : invertHermitian5x5( ~dm );
break;
2196 case asGeneral : invertGeneral5x5 ( ~dm );
break;
2197 case asSymmetric: invertSymmetric5x5( ~dm );
break;
2198 case asHermitian: invertHermitian5x5( ~dm );
break;
2199 case asLower : invertLower5x5 ( ~dm );
break;
2200 case asUniLower : invertUniLower5x5 ( ~dm );
break;
2201 case asUpper : invertUpper5x5 ( ~dm );
break;
2202 case asUniUpper : invertUniUpper5x5 ( ~dm );
break;
2203 case asDiagonal : invertDiagonal5x5 ( ~dm );
break;
2238 template<
typename MT
2240 inline void invertGeneral6x6( DenseMatrix<MT,SO>& dm )
2248 using ET = ElementType_t<MT>;
2250 const StaticMatrix<ET,6UL,6UL,SO> A( ~dm );
2253 ET tmp1 ( A(4,4)*A(5,5) - A(4,5)*A(5,4) );
2254 ET tmp2 ( A(4,3)*A(5,5) - A(4,5)*A(5,3) );
2255 ET tmp3 ( A(4,3)*A(5,4) - A(4,4)*A(5,3) );
2256 ET tmp4 ( A(4,2)*A(5,5) - A(4,5)*A(5,2) );
2257 ET tmp5 ( A(4,2)*A(5,4) - A(4,4)*A(5,2) );
2258 ET tmp6 ( A(4,2)*A(5,3) - A(4,3)*A(5,2) );
2259 ET tmp7 ( A(4,1)*A(5,5) - A(4,5)*A(5,1) );
2260 ET tmp8 ( A(4,1)*A(5,4) - A(4,4)*A(5,1) );
2261 ET tmp9 ( A(4,1)*A(5,3) - A(4,3)*A(5,1) );
2262 ET tmp10( A(4,1)*A(5,2) - A(4,2)*A(5,1) );
2263 ET tmp11( A(4,0)*A(5,5) - A(4,5)*A(5,0) );
2264 ET tmp12( A(4,0)*A(5,4) - A(4,4)*A(5,0) );
2265 ET tmp13( A(4,0)*A(5,3) - A(4,3)*A(5,0) );
2266 ET tmp14( A(4,0)*A(5,2) - A(4,2)*A(5,0) );
2267 ET tmp15( A(4,0)*A(5,1) - A(4,1)*A(5,0) );
2269 ET tmp16( A(3,3)*tmp1 - A(3,4)*tmp2 + A(3,5)*tmp3 );
2270 ET tmp17( A(3,2)*tmp1 - A(3,4)*tmp4 + A(3,5)*tmp5 );
2271 ET tmp18( A(3,2)*tmp2 - A(3,3)*tmp4 + A(3,5)*tmp6 );
2272 ET tmp19( A(3,2)*tmp3 - A(3,3)*tmp5 + A(3,4)*tmp6 );
2273 ET tmp20( A(3,1)*tmp1 - A(3,4)*tmp7 + A(3,5)*tmp8 );
2274 ET tmp21( A(3,1)*tmp2 - A(3,3)*tmp7 + A(3,5)*tmp9 );
2275 ET tmp22( A(3,1)*tmp3 - A(3,3)*tmp8 + A(3,4)*tmp9 );
2276 ET tmp23( A(3,1)*tmp4 - A(3,2)*tmp7 + A(3,5)*tmp10 );
2277 ET tmp24( A(3,1)*tmp5 - A(3,2)*tmp8 + A(3,4)*tmp10 );
2278 ET tmp25( A(3,1)*tmp6 - A(3,2)*tmp9 + A(3,3)*tmp10 );
2279 ET tmp26( A(3,0)*tmp1 - A(3,4)*tmp11 + A(3,5)*tmp12 );
2280 ET tmp27( A(3,0)*tmp2 - A(3,3)*tmp11 + A(3,5)*tmp13 );
2281 ET tmp28( A(3,0)*tmp3 - A(3,3)*tmp12 + A(3,4)*tmp13 );
2282 ET tmp29( A(3,0)*tmp4 - A(3,2)*tmp11 + A(3,5)*tmp14 );
2283 ET tmp30( A(3,0)*tmp5 - A(3,2)*tmp12 + A(3,4)*tmp14 );
2284 ET tmp31( A(3,0)*tmp6 - A(3,2)*tmp13 + A(3,3)*tmp14 );
2285 ET tmp32( A(3,0)*tmp7 - A(3,1)*tmp11 + A(3,5)*tmp15 );
2286 ET tmp33( A(3,0)*tmp8 - A(3,1)*tmp12 + A(3,4)*tmp15 );
2287 ET tmp34( A(3,0)*tmp9 - A(3,1)*tmp13 + A(3,3)*tmp15 );
2288 ET tmp35( A(3,0)*tmp10 - A(3,1)*tmp14 + A(3,2)*tmp15 );
2290 ET tmp36( A(2,2)*tmp16 - A(2,3)*tmp17 + A(2,4)*tmp18 - A(2,5)*tmp19 );
2291 ET tmp37( A(2,1)*tmp16 - A(2,3)*tmp20 + A(2,4)*tmp21 - A(2,5)*tmp22 );
2292 ET tmp38( A(2,1)*tmp17 - A(2,2)*tmp20 + A(2,4)*tmp23 - A(2,5)*tmp24 );
2293 ET tmp39( A(2,1)*tmp18 - A(2,2)*tmp21 + A(2,3)*tmp23 - A(2,5)*tmp25 );
2294 ET tmp40( A(2,1)*tmp19 - A(2,2)*tmp22 + A(2,3)*tmp24 - A(2,4)*tmp25 );
2295 ET tmp41( A(2,0)*tmp16 - A(2,3)*tmp26 + A(2,4)*tmp27 - A(2,5)*tmp28 );
2296 ET tmp42( A(2,0)*tmp17 - A(2,2)*tmp26 + A(2,4)*tmp29 - A(2,5)*tmp30 );
2297 ET tmp43( A(2,0)*tmp18 - A(2,2)*tmp27 + A(2,3)*tmp29 - A(2,5)*tmp31 );
2298 ET tmp44( A(2,0)*tmp19 - A(2,2)*tmp28 + A(2,3)*tmp30 - A(2,4)*tmp31 );
2300 B(0,0) = A(1,1)*tmp36 - A(1,2)*tmp37 + A(1,3)*tmp38 - A(1,4)*tmp39 + A(1,5)*tmp40;
2301 B(0,1) = - A(0,1)*tmp36 + A(0,2)*tmp37 - A(0,3)*tmp38 + A(0,4)*tmp39 - A(0,5)*tmp40;
2302 B(1,0) = - A(1,0)*tmp36 + A(1,2)*tmp41 - A(1,3)*tmp42 + A(1,4)*tmp43 - A(1,5)*tmp44;
2303 B(1,1) = A(0,0)*tmp36 - A(0,2)*tmp41 + A(0,3)*tmp42 - A(0,4)*tmp43 + A(0,5)*tmp44;
2305 ET tmp45( A(2,0)*tmp20 - A(2,1)*tmp26 + A(2,4)*tmp32 - A(2,5)*tmp33 );
2306 ET tmp46( A(2,0)*tmp21 - A(2,1)*tmp27 + A(2,3)*tmp32 - A(2,5)*tmp34 );
2307 ET tmp47( A(2,0)*tmp22 - A(2,1)*tmp28 + A(2,3)*tmp33 - A(2,4)*tmp34 );
2308 ET tmp48( A(2,0)*tmp23 - A(2,1)*tmp29 + A(2,2)*tmp32 - A(2,5)*tmp35 );
2309 ET tmp49( A(2,0)*tmp24 - A(2,1)*tmp30 + A(2,2)*tmp33 - A(2,4)*tmp35 );
2311 B(2,0) = A(1,0)*tmp37 - A(1,1)*tmp41 + A(1,3)*tmp45 - A(1,4)*tmp46 + A(1,5)*tmp47;
2312 B(2,1) = - A(0,0)*tmp37 + A(0,1)*tmp41 - A(0,3)*tmp45 + A(0,4)*tmp46 - A(0,5)*tmp47;
2313 B(3,0) = - A(1,0)*tmp38 + A(1,1)*tmp42 - A(1,2)*tmp45 + A(1,4)*tmp48 - A(1,5)*tmp49;
2314 B(3,1) = A(0,0)*tmp38 - A(0,1)*tmp42 + A(0,2)*tmp45 - A(0,4)*tmp48 + A(0,5)*tmp49;
2316 ET tmp50( A(2,0)*tmp25 - A(2,1)*tmp31 + A(2,2)*tmp34 - A(2,3)*tmp35 );
2318 B(4,0) = A(1,0)*tmp39 - A(1,1)*tmp43 + A(1,2)*tmp46 - A(1,3)*tmp48 + A(1,5)*tmp50;
2319 B(4,1) = - A(0,0)*tmp39 + A(0,1)*tmp43 - A(0,2)*tmp46 + A(0,3)*tmp48 - A(0,5)*tmp50;
2320 B(5,0) = - A(1,0)*tmp40 + A(1,1)*tmp44 - A(1,2)*tmp47 + A(1,3)*tmp49 - A(1,4)*tmp50;
2321 B(5,1) = A(0,0)*tmp40 - A(0,1)*tmp44 + A(0,2)*tmp47 - A(0,3)*tmp49 + A(0,4)*tmp50;
2323 tmp36 = A(1,2)*tmp16 - A(1,3)*tmp17 + A(1,4)*tmp18 - A(1,5)*tmp19;
2324 tmp37 = A(1,1)*tmp16 - A(1,3)*tmp20 + A(1,4)*tmp21 - A(1,5)*tmp22;
2325 tmp38 = A(1,1)*tmp17 - A(1,2)*tmp20 + A(1,4)*tmp23 - A(1,5)*tmp24;
2326 tmp39 = A(1,1)*tmp18 - A(1,2)*tmp21 + A(1,3)*tmp23 - A(1,5)*tmp25;
2327 tmp40 = A(1,1)*tmp19 - A(1,2)*tmp22 + A(1,3)*tmp24 - A(1,4)*tmp25;
2328 tmp41 = A(1,0)*tmp16 - A(1,3)*tmp26 + A(1,4)*tmp27 - A(1,5)*tmp28;
2329 tmp42 = A(1,0)*tmp17 - A(1,2)*tmp26 + A(1,4)*tmp29 - A(1,5)*tmp30;
2330 tmp43 = A(1,0)*tmp18 - A(1,2)*tmp27 + A(1,3)*tmp29 - A(1,5)*tmp31;
2331 tmp44 = A(1,0)*tmp19 - A(1,2)*tmp28 + A(1,3)*tmp30 - A(1,4)*tmp31;
2332 tmp45 = A(1,0)*tmp20 - A(1,1)*tmp26 + A(1,4)*tmp32 - A(1,5)*tmp33;
2333 tmp46 = A(1,0)*tmp21 - A(1,1)*tmp27 + A(1,3)*tmp32 - A(1,5)*tmp34;
2334 tmp47 = A(1,0)*tmp22 - A(1,1)*tmp28 + A(1,3)*tmp33 - A(1,4)*tmp34;
2335 tmp48 = A(1,0)*tmp23 - A(1,1)*tmp29 + A(1,2)*tmp32 - A(1,5)*tmp35;
2336 tmp49 = A(1,0)*tmp24 - A(1,1)*tmp30 + A(1,2)*tmp33 - A(1,4)*tmp35;
2337 tmp50 = A(1,0)*tmp25 - A(1,1)*tmp31 + A(1,2)*tmp34 - A(1,3)*tmp35;
2339 B(0,2) = A(0,1)*tmp36 - A(0,2)*tmp37 + A(0,3)*tmp38 - A(0,4)*tmp39 + A(0,5)*tmp40;
2340 B(1,2) = - A(0,0)*tmp36 + A(0,2)*tmp41 - A(0,3)*tmp42 + A(0,4)*tmp43 - A(0,5)*tmp44;
2341 B(2,2) = A(0,0)*tmp37 - A(0,1)*tmp41 + A(0,3)*tmp45 - A(0,4)*tmp46 + A(0,5)*tmp47;
2342 B(3,2) = - A(0,0)*tmp38 + A(0,1)*tmp42 - A(0,2)*tmp45 + A(0,4)*tmp48 - A(0,5)*tmp49;
2343 B(4,2) = A(0,0)*tmp39 - A(0,1)*tmp43 + A(0,2)*tmp46 - A(0,3)*tmp48 + A(0,5)*tmp50;
2344 B(5,2) = - A(0,0)*tmp40 + A(0,1)*tmp44 - A(0,2)*tmp47 + A(0,3)*tmp49 - A(0,4)*tmp50;
2346 tmp1 = A(0,3)*A(1,4) - A(0,4)*A(1,3);
2347 tmp2 = A(0,2)*A(1,4) - A(0,4)*A(1,2);
2348 tmp3 = A(0,2)*A(1,3) - A(0,3)*A(1,2);
2349 tmp4 = A(0,1)*A(1,4) - A(0,4)*A(1,1);
2350 tmp5 = A(0,1)*A(1,3) - A(0,3)*A(1,1);
2351 tmp6 = A(0,1)*A(1,2) - A(0,2)*A(1,1);
2352 tmp7 = A(0,0)*A(1,4) - A(0,4)*A(1,0);
2353 tmp8 = A(0,0)*A(1,3) - A(0,3)*A(1,0);
2354 tmp9 = A(0,0)*A(1,2) - A(0,2)*A(1,0);
2355 tmp10 = A(0,0)*A(1,1) - A(0,1)*A(1,0);
2356 tmp11 = A(0,3)*A(1,5) - A(0,5)*A(1,3);
2357 tmp12 = A(0,2)*A(1,5) - A(0,5)*A(1,2);
2358 tmp13 = A(0,1)*A(1,5) - A(0,5)*A(1,1);
2359 tmp14 = A(0,0)*A(1,5) - A(0,5)*A(1,0);
2360 tmp15 = A(0,4)*A(1,5) - A(0,5)*A(1,4);
2362 tmp16 = A(2,3)*tmp15 - A(2,4)*tmp11 + A(2,5)*tmp1;
2363 tmp17 = A(2,2)*tmp15 - A(2,4)*tmp12 + A(2,5)*tmp2;
2364 tmp18 = A(2,2)*tmp11 - A(2,3)*tmp12 + A(2,5)*tmp3;
2365 tmp19 = A(2,2)*tmp1 - A(2,3)*tmp2 + A(2,4)*tmp3;
2366 tmp20 = A(2,1)*tmp15 - A(2,4)*tmp13 + A(2,5)*tmp4;
2367 tmp21 = A(2,1)*tmp11 - A(2,3)*tmp13 + A(2,5)*tmp5;
2368 tmp22 = A(2,1)*tmp1 - A(2,3)*tmp4 + A(2,4)*tmp5;
2369 tmp23 = A(2,1)*tmp12 - A(2,2)*tmp13 + A(2,5)*tmp6;
2370 tmp24 = A(2,1)*tmp2 - A(2,2)*tmp4 + A(2,4)*tmp6;
2371 tmp25 = A(2,1)*tmp3 - A(2,2)*tmp5 + A(2,3)*tmp6;
2372 tmp26 = A(2,0)*tmp15 - A(2,4)*tmp14 + A(2,5)*tmp7;
2373 tmp27 = A(2,0)*tmp11 - A(2,3)*tmp14 + A(2,5)*tmp8;
2374 tmp28 = A(2,0)*tmp1 - A(2,3)*tmp7 + A(2,4)*tmp8;
2375 tmp29 = A(2,0)*tmp12 - A(2,2)*tmp14 + A(2,5)*tmp9;
2376 tmp30 = A(2,0)*tmp2 - A(2,2)*tmp7 + A(2,4)*tmp9;
2377 tmp31 = A(2,0)*tmp3 - A(2,2)*tmp8 + A(2,3)*tmp9;
2378 tmp32 = A(2,0)*tmp13 - A(2,1)*tmp14 + A(2,5)*tmp10;
2379 tmp33 = A(2,0)*tmp4 - A(2,1)*tmp7 + A(2,4)*tmp10;
2380 tmp34 = A(2,0)*tmp5 - A(2,1)*tmp8 + A(2,3)*tmp10;
2381 tmp35 = A(2,0)*tmp6 - A(2,1)*tmp9 + A(2,2)*tmp10;
2383 tmp36 = A(3,2)*tmp16 - A(3,3)*tmp17 + A(3,4)*tmp18 - A(3,5)*tmp19;
2384 tmp37 = A(3,1)*tmp16 - A(3,3)*tmp20 + A(3,4)*tmp21 - A(3,5)*tmp22;
2385 tmp38 = A(3,1)*tmp17 - A(3,2)*tmp20 + A(3,4)*tmp23 - A(3,5)*tmp24;
2386 tmp39 = A(3,1)*tmp18 - A(3,2)*tmp21 + A(3,3)*tmp23 - A(3,5)*tmp25;
2387 tmp40 = A(3,1)*tmp19 - A(3,2)*tmp22 + A(3,3)*tmp24 - A(3,4)*tmp25;
2388 tmp41 = A(3,0)*tmp16 - A(3,3)*tmp26 + A(3,4)*tmp27 - A(3,5)*tmp28;
2389 tmp42 = A(3,0)*tmp17 - A(3,2)*tmp26 + A(3,4)*tmp29 - A(3,5)*tmp30;
2390 tmp43 = A(3,0)*tmp18 - A(3,2)*tmp27 + A(3,3)*tmp29 - A(3,5)*tmp31;
2391 tmp44 = A(3,0)*tmp19 - A(3,2)*tmp28 + A(3,3)*tmp30 - A(3,4)*tmp31;
2393 B(0,4) = - A(5,1)*tmp36 + A(5,2)*tmp37 - A(5,3)*tmp38 + A(5,4)*tmp39 - A(5,5)*tmp40;
2394 B(0,5) = A(4,1)*tmp36 - A(4,2)*tmp37 + A(4,3)*tmp38 - A(4,4)*tmp39 + A(4,5)*tmp40;
2395 B(1,4) = A(5,0)*tmp36 - A(5,2)*tmp41 + A(5,3)*tmp42 - A(5,4)*tmp43 + A(5,5)*tmp44;
2396 B(1,5) = - A(4,0)*tmp36 + A(4,2)*tmp41 - A(4,3)*tmp42 + A(4,4)*tmp43 - A(4,5)*tmp44;
2398 tmp45 = A(3,0)*tmp20 - A(3,1)*tmp26 + A(3,4)*tmp32 - A(3,5)*tmp33;
2399 tmp46 = A(3,0)*tmp21 - A(3,1)*tmp27 + A(3,3)*tmp32 - A(3,5)*tmp34;
2400 tmp47 = A(3,0)*tmp22 - A(3,1)*tmp28 + A(3,3)*tmp33 - A(3,4)*tmp34;
2401 tmp48 = A(3,0)*tmp23 - A(3,1)*tmp29 + A(3,2)*tmp32 - A(3,5)*tmp35;
2402 tmp49 = A(3,0)*tmp24 - A(3,1)*tmp30 + A(3,2)*tmp33 - A(3,4)*tmp35;
2404 B(2,4) = - A(5,0)*tmp37 + A(5,1)*tmp41 - A(5,3)*tmp45 + A(5,4)*tmp46 - A(5,5)*tmp47;
2405 B(2,5) = A(4,0)*tmp37 - A(4,1)*tmp41 + A(4,3)*tmp45 - A(4,4)*tmp46 + A(4,5)*tmp47;
2406 B(3,4) = A(5,0)*tmp38 - A(5,1)*tmp42 + A(5,2)*tmp45 - A(5,4)*tmp48 + A(5,5)*tmp49;
2407 B(3,5) = - A(4,0)*tmp38 + A(4,1)*tmp42 - A(4,2)*tmp45 + A(4,4)*tmp48 - A(4,5)*tmp49;
2409 tmp50 = A(3,0)*tmp25 - A(3,1)*tmp31 + A(3,2)*tmp34 - A(3,3)*tmp35;
2411 B(4,4) = - A(5,0)*tmp39 + A(5,1)*tmp43 - A(5,2)*tmp46 + A(5,3)*tmp48 - A(5,5)*tmp50;
2412 B(4,5) = A(4,0)*tmp39 - A(4,1)*tmp43 + A(4,2)*tmp46 - A(4,3)*tmp48 + A(4,5)*tmp50;
2413 B(5,4) = A(5,0)*tmp40 - A(5,1)*tmp44 + A(5,2)*tmp47 - A(5,3)*tmp49 + A(5,4)*tmp50;
2414 B(5,5) = - A(4,0)*tmp40 + A(4,1)*tmp44 - A(4,2)*tmp47 + A(4,3)*tmp49 - A(4,4)*tmp50;
2416 tmp36 = A(4,2)*tmp16 - A(4,3)*tmp17 + A(4,4)*tmp18 - A(4,5)*tmp19;
2417 tmp37 = A(4,1)*tmp16 - A(4,3)*tmp20 + A(4,4)*tmp21 - A(4,5)*tmp22;
2418 tmp38 = A(4,1)*tmp17 - A(4,2)*tmp20 + A(4,4)*tmp23 - A(4,5)*tmp24;
2419 tmp39 = A(4,1)*tmp18 - A(4,2)*tmp21 + A(4,3)*tmp23 - A(4,5)*tmp25;
2420 tmp40 = A(4,1)*tmp19 - A(4,2)*tmp22 + A(4,3)*tmp24 - A(4,4)*tmp25;
2421 tmp41 = A(4,0)*tmp16 - A(4,3)*tmp26 + A(4,4)*tmp27 - A(4,5)*tmp28;
2422 tmp42 = A(4,0)*tmp17 - A(4,2)*tmp26 + A(4,4)*tmp29 - A(4,5)*tmp30;
2423 tmp43 = A(4,0)*tmp18 - A(4,2)*tmp27 + A(4,3)*tmp29 - A(4,5)*tmp31;
2424 tmp44 = A(4,0)*tmp19 - A(4,2)*tmp28 + A(4,3)*tmp30 - A(4,4)*tmp31;
2425 tmp45 = A(4,0)*tmp20 - A(4,1)*tmp26 + A(4,4)*tmp32 - A(4,5)*tmp33;
2426 tmp46 = A(4,0)*tmp21 - A(4,1)*tmp27 + A(4,3)*tmp32 - A(4,5)*tmp34;
2427 tmp47 = A(4,0)*tmp22 - A(4,1)*tmp28 + A(4,3)*tmp33 - A(4,4)*tmp34;
2428 tmp48 = A(4,0)*tmp23 - A(4,1)*tmp29 + A(4,2)*tmp32 - A(4,5)*tmp35;
2429 tmp49 = A(4,0)*tmp24 - A(4,1)*tmp30 + A(4,2)*tmp33 - A(4,4)*tmp35;
2430 tmp50 = A(4,0)*tmp25 - A(4,1)*tmp31 + A(4,2)*tmp34 - A(4,3)*tmp35;
2432 B(0,3) = A(5,1)*tmp36 - A(5,2)*tmp37 + A(5,3)*tmp38 - A(5,4)*tmp39 + A(5,5)*tmp40;
2433 B(1,3) = - A(5,0)*tmp36 + A(5,2)*tmp41 - A(5,3)*tmp42 + A(5,4)*tmp43 - A(5,5)*tmp44;
2434 B(2,3) = A(5,0)*tmp37 - A(5,1)*tmp41 + A(5,3)*tmp45 - A(5,4)*tmp46 + A(5,5)*tmp47;
2435 B(3,3) = - A(5,0)*tmp38 + A(5,1)*tmp42 - A(5,2)*tmp45 + A(5,4)*tmp48 - A(5,5)*tmp49;
2436 B(4,3) = A(5,0)*tmp39 - A(5,1)*tmp43 + A(5,2)*tmp46 - A(5,3)*tmp48 + A(5,5)*tmp50;
2437 B(5,3) = - A(5,0)*tmp40 + A(5,1)*tmp44 - A(5,2)*tmp47 + A(5,3)*tmp49 - A(5,4)*tmp50;
2439 const ET
det( A(0,0)*B(0,0) + A(0,1)*B(1,0) + A(0,2)*B(2,0) +
2440 A(0,3)*B(3,0) + A(0,4)*B(4,0) + A(0,5)*B(5,0) );
2469 template<
typename MT
2471 inline void invertSymmetric6x6( DenseMatrix<MT,SO>& dm )
2478 using ET = ElementType_t<MT>;
2480 const StaticMatrix<ET,6UL,6UL,SO> A( ~dm );
2483 ET tmp1 ( A(4,4)*A(5,5) - A(4,5)*A(5,4) );
2484 ET tmp2 ( A(4,3)*A(5,5) - A(4,5)*A(5,3) );
2485 ET tmp3 ( A(4,3)*A(5,4) - A(4,4)*A(5,3) );
2486 ET tmp4 ( A(4,2)*A(5,5) - A(4,5)*A(5,2) );
2487 ET tmp5 ( A(4,2)*A(5,4) - A(4,4)*A(5,2) );
2488 ET tmp6 ( A(4,2)*A(5,3) - A(4,3)*A(5,2) );
2489 ET tmp7 ( A(4,1)*A(5,5) - A(4,5)*A(5,1) );
2490 ET tmp8 ( A(4,1)*A(5,4) - A(4,4)*A(5,1) );
2491 ET tmp9 ( A(4,1)*A(5,3) - A(4,3)*A(5,1) );
2492 ET tmp10( A(4,1)*A(5,2) - A(4,2)*A(5,1) );
2493 ET tmp11( A(4,0)*A(5,5) - A(4,5)*A(5,0) );
2494 ET tmp12( A(4,0)*A(5,4) - A(4,4)*A(5,0) );
2495 ET tmp13( A(4,0)*A(5,3) - A(4,3)*A(5,0) );
2496 ET tmp14( A(4,0)*A(5,2) - A(4,2)*A(5,0) );
2497 ET tmp15( A(4,0)*A(5,1) - A(4,1)*A(5,0) );
2499 ET tmp16( A(3,3)*tmp1 - A(3,4)*tmp2 + A(3,5)*tmp3 );
2500 ET tmp17( A(3,2)*tmp1 - A(3,4)*tmp4 + A(3,5)*tmp5 );
2501 ET tmp18( A(3,2)*tmp2 - A(3,3)*tmp4 + A(3,5)*tmp6 );
2502 ET tmp19( A(3,2)*tmp3 - A(3,3)*tmp5 + A(3,4)*tmp6 );
2503 ET tmp20( A(3,1)*tmp1 - A(3,4)*tmp7 + A(3,5)*tmp8 );
2504 ET tmp21( A(3,1)*tmp2 - A(3,3)*tmp7 + A(3,5)*tmp9 );
2505 ET tmp22( A(3,1)*tmp3 - A(3,3)*tmp8 + A(3,4)*tmp9 );
2506 ET tmp23( A(3,1)*tmp4 - A(3,2)*tmp7 + A(3,5)*tmp10 );
2507 ET tmp24( A(3,1)*tmp5 - A(3,2)*tmp8 + A(3,4)*tmp10 );
2508 ET tmp25( A(3,1)*tmp6 - A(3,2)*tmp9 + A(3,3)*tmp10 );
2509 ET tmp26( A(3,0)*tmp1 - A(3,4)*tmp11 + A(3,5)*tmp12 );
2510 ET tmp27( A(3,0)*tmp2 - A(3,3)*tmp11 + A(3,5)*tmp13 );
2511 ET tmp28( A(3,0)*tmp3 - A(3,3)*tmp12 + A(3,4)*tmp13 );
2512 ET tmp29( A(3,0)*tmp4 - A(3,2)*tmp11 + A(3,5)*tmp14 );
2513 ET tmp30( A(3,0)*tmp5 - A(3,2)*tmp12 + A(3,4)*tmp14 );
2514 ET tmp31( A(3,0)*tmp6 - A(3,2)*tmp13 + A(3,3)*tmp14 );
2515 ET tmp32( A(3,0)*tmp7 - A(3,1)*tmp11 + A(3,5)*tmp15 );
2516 ET tmp33( A(3,0)*tmp8 - A(3,1)*tmp12 + A(3,4)*tmp15 );
2517 ET tmp34( A(3,0)*tmp9 - A(3,1)*tmp13 + A(3,3)*tmp15 );
2518 ET tmp35( A(3,0)*tmp10 - A(3,1)*tmp14 + A(3,2)*tmp15 );
2520 ET tmp36( A(2,2)*tmp16 - A(2,3)*tmp17 + A(2,4)*tmp18 - A(2,5)*tmp19 );
2521 ET tmp37( A(2,1)*tmp16 - A(2,3)*tmp20 + A(2,4)*tmp21 - A(2,5)*tmp22 );
2522 ET tmp38( A(2,1)*tmp17 - A(2,2)*tmp20 + A(2,4)*tmp23 - A(2,5)*tmp24 );
2523 ET tmp39( A(2,1)*tmp18 - A(2,2)*tmp21 + A(2,3)*tmp23 - A(2,5)*tmp25 );
2524 ET tmp40( A(2,1)*tmp19 - A(2,2)*tmp22 + A(2,3)*tmp24 - A(2,4)*tmp25 );
2525 ET tmp41( A(2,0)*tmp16 - A(2,3)*tmp26 + A(2,4)*tmp27 - A(2,5)*tmp28 );
2526 ET tmp42( A(2,0)*tmp17 - A(2,2)*tmp26 + A(2,4)*tmp29 - A(2,5)*tmp30 );
2527 ET tmp43( A(2,0)*tmp18 - A(2,2)*tmp27 + A(2,3)*tmp29 - A(2,5)*tmp31 );
2528 ET tmp44( A(2,0)*tmp19 - A(2,2)*tmp28 + A(2,3)*tmp30 - A(2,4)*tmp31 );
2530 B(0,0) = A(1,1)*tmp36 - A(1,2)*tmp37 + A(1,3)*tmp38 - A(1,4)*tmp39 + A(1,5)*tmp40;
2531 B(0,1) = - A(0,1)*tmp36 + A(0,2)*tmp37 - A(0,3)*tmp38 + A(0,4)*tmp39 - A(0,5)*tmp40;
2532 B(1,1) = A(0,0)*tmp36 - A(0,2)*tmp41 + A(0,3)*tmp42 - A(0,4)*tmp43 + A(0,5)*tmp44;
2534 ET tmp45( A(2,0)*tmp20 - A(2,1)*tmp26 + A(2,4)*tmp32 - A(2,5)*tmp33 );
2535 ET tmp46( A(2,0)*tmp21 - A(2,1)*tmp27 + A(2,3)*tmp32 - A(2,5)*tmp34 );
2536 ET tmp47( A(2,0)*tmp22 - A(2,1)*tmp28 + A(2,3)*tmp33 - A(2,4)*tmp34 );
2537 ET tmp48( A(2,0)*tmp23 - A(2,1)*tmp29 + A(2,2)*tmp32 - A(2,5)*tmp35 );
2538 ET tmp49( A(2,0)*tmp24 - A(2,1)*tmp30 + A(2,2)*tmp33 - A(2,4)*tmp35 );
2540 B(2,0) = A(1,0)*tmp37 - A(1,1)*tmp41 + A(1,3)*tmp45 - A(1,4)*tmp46 + A(1,5)*tmp47;
2541 B(2,1) = - A(0,0)*tmp37 + A(0,1)*tmp41 - A(0,3)*tmp45 + A(0,4)*tmp46 - A(0,5)*tmp47;
2542 B(3,0) = - A(1,0)*tmp38 + A(1,1)*tmp42 - A(1,2)*tmp45 + A(1,4)*tmp48 - A(1,5)*tmp49;
2543 B(3,1) = A(0,0)*tmp38 - A(0,1)*tmp42 + A(0,2)*tmp45 - A(0,4)*tmp48 + A(0,5)*tmp49;
2545 ET tmp50( A(2,0)*tmp25 - A(2,1)*tmp31 + A(2,2)*tmp34 - A(2,3)*tmp35 );
2547 B(4,0) = A(1,0)*tmp39 - A(1,1)*tmp43 + A(1,2)*tmp46 - A(1,3)*tmp48 + A(1,5)*tmp50;
2548 B(4,1) = - A(0,0)*tmp39 + A(0,1)*tmp43 - A(0,2)*tmp46 + A(0,3)*tmp48 - A(0,5)*tmp50;
2549 B(5,0) = - A(1,0)*tmp40 + A(1,1)*tmp44 - A(1,2)*tmp47 + A(1,3)*tmp49 - A(1,4)*tmp50;
2550 B(5,1) = A(0,0)*tmp40 - A(0,1)*tmp44 + A(0,2)*tmp47 - A(0,3)*tmp49 + A(0,4)*tmp50;
2552 tmp36 = A(1,1)*tmp16 - A(1,3)*tmp20 + A(1,4)*tmp21 - A(1,5)*tmp22;
2553 tmp37 = A(1,1)*tmp17 - A(1,2)*tmp20 + A(1,4)*tmp23 - A(1,5)*tmp24;
2554 tmp38 = A(1,0)*tmp16 - A(1,3)*tmp26 + A(1,4)*tmp27 - A(1,5)*tmp28;
2555 tmp39 = A(1,0)*tmp17 - A(1,2)*tmp26 + A(1,4)*tmp29 - A(1,5)*tmp30;
2556 tmp40 = A(1,0)*tmp20 - A(1,1)*tmp26 + A(1,4)*tmp32 - A(1,5)*tmp33;
2557 tmp41 = A(1,0)*tmp21 - A(1,1)*tmp27 + A(1,3)*tmp32 - A(1,5)*tmp34;
2558 tmp42 = A(1,0)*tmp22 - A(1,1)*tmp28 + A(1,3)*tmp33 - A(1,4)*tmp34;
2559 tmp43 = A(1,0)*tmp23 - A(1,1)*tmp29 + A(1,2)*tmp32 - A(1,5)*tmp35;
2560 tmp44 = A(1,0)*tmp24 - A(1,1)*tmp30 + A(1,2)*tmp33 - A(1,4)*tmp35;
2562 B(2,2) = A(0,0)*tmp36 - A(0,1)*tmp38 + A(0,3)*tmp40 - A(0,4)*tmp41 + A(0,5)*tmp42;
2563 B(3,2) = - A(0,0)*tmp37 + A(0,1)*tmp39 - A(0,2)*tmp40 + A(0,4)*tmp43 - A(0,5)*tmp44;
2565 tmp1 = A(0,3)*A(1,4) - A(0,4)*A(1,3);
2566 tmp2 = A(0,2)*A(1,4) - A(0,4)*A(1,2);
2567 tmp3 = A(0,2)*A(1,3) - A(0,3)*A(1,2);
2568 tmp4 = A(0,1)*A(1,4) - A(0,4)*A(1,1);
2569 tmp5 = A(0,1)*A(1,3) - A(0,3)*A(1,1);
2570 tmp6 = A(0,1)*A(1,2) - A(0,2)*A(1,1);
2571 tmp7 = A(0,0)*A(1,4) - A(0,4)*A(1,0);
2572 tmp8 = A(0,0)*A(1,3) - A(0,3)*A(1,0);
2573 tmp9 = A(0,0)*A(1,2) - A(0,2)*A(1,0);
2574 tmp10 = A(0,0)*A(1,1) - A(0,1)*A(1,0);
2575 tmp11 = A(0,3)*A(1,5) - A(0,5)*A(1,3);
2576 tmp12 = A(0,2)*A(1,5) - A(0,5)*A(1,2);
2577 tmp13 = A(0,1)*A(1,5) - A(0,5)*A(1,1);
2578 tmp14 = A(0,0)*A(1,5) - A(0,5)*A(1,0);
2579 tmp15 = A(0,4)*A(1,5) - A(0,5)*A(1,4);
2581 tmp16 = A(2,3)*tmp15 - A(2,4)*tmp11 + A(2,5)*tmp1;
2582 tmp17 = A(2,2)*tmp15 - A(2,4)*tmp12 + A(2,5)*tmp2;
2583 tmp18 = A(2,2)*tmp11 - A(2,3)*tmp12 + A(2,5)*tmp3;
2584 tmp19 = A(2,2)*tmp1 - A(2,3)*tmp2 + A(2,4)*tmp3;
2585 tmp20 = A(2,1)*tmp15 - A(2,4)*tmp13 + A(2,5)*tmp4;
2586 tmp21 = A(2,1)*tmp11 - A(2,3)*tmp13 + A(2,5)*tmp5;
2587 tmp22 = A(2,1)*tmp1 - A(2,3)*tmp4 + A(2,4)*tmp5;
2588 tmp23 = A(2,1)*tmp12 - A(2,2)*tmp13 + A(2,5)*tmp6;
2589 tmp24 = A(2,1)*tmp2 - A(2,2)*tmp4 + A(2,4)*tmp6;
2590 tmp25 = A(2,1)*tmp3 - A(2,2)*tmp5 + A(2,3)*tmp6;
2591 tmp26 = A(2,0)*tmp15 - A(2,4)*tmp14 + A(2,5)*tmp7;
2592 tmp27 = A(2,0)*tmp11 - A(2,3)*tmp14 + A(2,5)*tmp8;
2593 tmp28 = A(2,0)*tmp1 - A(2,3)*tmp7 + A(2,4)*tmp8;
2594 tmp29 = A(2,0)*tmp12 - A(2,2)*tmp14 + A(2,5)*tmp9;
2595 tmp30 = A(2,0)*tmp2 - A(2,2)*tmp7 + A(2,4)*tmp9;
2596 tmp31 = A(2,0)*tmp3 - A(2,2)*tmp8 + A(2,3)*tmp9;
2597 tmp32 = A(2,0)*tmp13 - A(2,1)*tmp14 + A(2,5)*tmp10;
2598 tmp33 = A(2,0)*tmp4 - A(2,1)*tmp7 + A(2,4)*tmp10;
2599 tmp34 = A(2,0)*tmp5 - A(2,1)*tmp8 + A(2,3)*tmp10;
2600 tmp35 = A(2,0)*tmp6 - A(2,1)*tmp9 + A(2,2)*tmp10;
2602 tmp36 = A(3,1)*tmp16 - A(3,3)*tmp20 + A(3,4)*tmp21 - A(3,5)*tmp22;
2603 tmp37 = A(3,1)*tmp17 - A(3,2)*tmp20 + A(3,4)*tmp23 - A(3,5)*tmp24;
2604 tmp38 = A(3,0)*tmp16 - A(3,3)*tmp26 + A(3,4)*tmp27 - A(3,5)*tmp28;
2605 tmp39 = A(3,0)*tmp17 - A(3,2)*tmp26 + A(3,4)*tmp29 - A(3,5)*tmp30;
2606 tmp40 = A(3,0)*tmp20 - A(3,1)*tmp26 + A(3,4)*tmp32 - A(3,5)*tmp33;
2607 tmp41 = A(3,0)*tmp21 - A(3,1)*tmp27 + A(3,3)*tmp32 - A(3,5)*tmp34;
2608 tmp42 = A(3,0)*tmp22 - A(3,1)*tmp28 + A(3,3)*tmp33 - A(3,4)*tmp34;
2609 tmp43 = A(3,0)*tmp23 - A(3,1)*tmp29 + A(3,2)*tmp32 - A(3,5)*tmp35;
2610 tmp44 = A(3,0)*tmp24 - A(3,1)*tmp30 + A(3,2)*tmp33 - A(3,4)*tmp35;
2612 B(2,4) = - A(5,0)*tmp36 + A(5,1)*tmp38 - A(5,3)*tmp40 + A(5,4)*tmp41 - A(5,5)*tmp42;
2613 B(2,5) = A(4,0)*tmp36 - A(4,1)*tmp38 + A(4,3)*tmp40 - A(4,4)*tmp41 + A(4,5)*tmp42;
2614 B(3,4) = A(5,0)*tmp37 - A(5,1)*tmp39 + A(5,2)*tmp40 - A(5,4)*tmp43 + A(5,5)*tmp44;
2615 B(3,5) = - A(4,0)*tmp37 + A(4,1)*tmp39 - A(4,2)*tmp40 + A(4,4)*tmp43 - A(4,5)*tmp44;
2617 tmp36 = A(3,1)*tmp18 - A(3,2)*tmp21 + A(3,3)*tmp23 - A(3,5)*tmp25;
2618 tmp37 = A(3,1)*tmp19 - A(3,2)*tmp22 + A(3,3)*tmp24 - A(3,4)*tmp25;
2619 tmp38 = A(3,0)*tmp18 - A(3,2)*tmp27 + A(3,3)*tmp29 - A(3,5)*tmp31;
2620 tmp39 = A(3,0)*tmp19 - A(3,2)*tmp28 + A(3,3)*tmp30 - A(3,4)*tmp31;
2621 tmp40 = A(3,0)*tmp25 - A(3,1)*tmp31 + A(3,2)*tmp34 - A(3,3)*tmp35;
2623 B(4,4) = - A(5,0)*tmp36 + A(5,1)*tmp38 - A(5,2)*tmp41 + A(5,3)*tmp43 - A(5,5)*tmp40;
2624 B(4,5) = A(4,0)*tmp36 - A(4,1)*tmp38 + A(4,2)*tmp41 - A(4,3)*tmp43 + A(4,5)*tmp40;
2625 B(5,5) = - A(4,0)*tmp37 + A(4,1)*tmp39 - A(4,2)*tmp42 + A(4,3)*tmp44 - A(4,4)*tmp40;
2627 tmp36 = A(4,1)*tmp17 - A(4,2)*tmp20 + A(4,4)*tmp23 - A(4,5)*tmp24;
2628 tmp37 = A(4,0)*tmp17 - A(4,2)*tmp26 + A(4,4)*tmp29 - A(4,5)*tmp30;
2629 tmp38 = A(4,0)*tmp20 - A(4,1)*tmp26 + A(4,4)*tmp32 - A(4,5)*tmp33;
2630 tmp39 = A(4,0)*tmp23 - A(4,1)*tmp29 + A(4,2)*tmp32 - A(4,5)*tmp35;
2631 tmp40 = A(4,0)*tmp24 - A(4,1)*tmp30 + A(4,2)*tmp33 - A(4,4)*tmp35;
2633 B(3,3) = - A(5,0)*tmp36 + A(5,1)*tmp37 - A(5,2)*tmp38 + A(5,4)*tmp39 - A(5,5)*tmp40;
2651 const ET
det( A(0,0)*B(0,0) + A(0,1)*B(1,0) + A(0,2)*B(2,0) +
2652 A(0,3)*B(3,0) + A(0,4)*B(4,0) + A(0,5)*B(5,0) );
2680 template<
typename MT
2682 inline void invertHermitian6x6( DenseMatrix<MT,SO>& dm )
2689 using ET = ElementType_t<MT>;
2691 const StaticMatrix<ET,6UL,6UL,SO> A( ~dm );
2694 ET tmp1 ( A(4,4)*A(5,5) - A(4,5)*A(5,4) );
2695 ET tmp2 ( A(4,3)*A(5,5) - A(4,5)*A(5,3) );
2696 ET tmp3 ( A(4,3)*A(5,4) - A(4,4)*A(5,3) );
2697 ET tmp4 ( A(4,2)*A(5,5) - A(4,5)*A(5,2) );
2698 ET tmp5 ( A(4,2)*A(5,4) - A(4,4)*A(5,2) );
2699 ET tmp6 ( A(4,2)*A(5,3) - A(4,3)*A(5,2) );
2700 ET tmp7 ( A(4,1)*A(5,5) - A(4,5)*A(5,1) );
2701 ET tmp8 ( A(4,1)*A(5,4) - A(4,4)*A(5,1) );
2702 ET tmp9 ( A(4,1)*A(5,3) - A(4,3)*A(5,1) );
2703 ET tmp10( A(4,1)*A(5,2) - A(4,2)*A(5,1) );
2704 ET tmp11( A(4,0)*A(5,5) - A(4,5)*A(5,0) );
2705 ET tmp12( A(4,0)*A(5,4) - A(4,4)*A(5,0) );
2706 ET tmp13( A(4,0)*A(5,3) - A(4,3)*A(5,0) );
2707 ET tmp14( A(4,0)*A(5,2) - A(4,2)*A(5,0) );
2708 ET tmp15( A(4,0)*A(5,1) - A(4,1)*A(5,0) );
2710 ET tmp16( A(3,3)*tmp1 - A(3,4)*tmp2 + A(3,5)*tmp3 );
2711 ET tmp17( A(3,2)*tmp1 - A(3,4)*tmp4 + A(3,5)*tmp5 );
2712 ET tmp18( A(3,2)*tmp2 - A(3,3)*tmp4 + A(3,5)*tmp6 );
2713 ET tmp19( A(3,2)*tmp3 - A(3,3)*tmp5 + A(3,4)*tmp6 );
2714 ET tmp20( A(3,1)*tmp1 - A(3,4)*tmp7 + A(3,5)*tmp8 );
2715 ET tmp21( A(3,1)*tmp2 - A(3,3)*tmp7 + A(3,5)*tmp9 );
2716 ET tmp22( A(3,1)*tmp3 - A(3,3)*tmp8 + A(3,4)*tmp9 );
2717 ET tmp23( A(3,1)*tmp4 - A(3,2)*tmp7 + A(3,5)*tmp10 );
2718 ET tmp24( A(3,1)*tmp5 - A(3,2)*tmp8 + A(3,4)*tmp10 );
2719 ET tmp25( A(3,1)*tmp6 - A(3,2)*tmp9 + A(3,3)*tmp10 );
2720 ET tmp26( A(3,0)*tmp1 - A(3,4)*tmp11 + A(3,5)*tmp12 );
2721 ET tmp27( A(3,0)*tmp2 - A(3,3)*tmp11 + A(3,5)*tmp13 );
2722 ET tmp28( A(3,0)*tmp3 - A(3,3)*tmp12 + A(3,4)*tmp13 );
2723 ET tmp29( A(3,0)*tmp4 - A(3,2)*tmp11 + A(3,5)*tmp14 );
2724 ET tmp30( A(3,0)*tmp5 - A(3,2)*tmp12 + A(3,4)*tmp14 );
2725 ET tmp31( A(3,0)*tmp6 - A(3,2)*tmp13 + A(3,3)*tmp14 );
2726 ET tmp32( A(3,0)*tmp7 - A(3,1)*tmp11 + A(3,5)*tmp15 );
2727 ET tmp33( A(3,0)*tmp8 - A(3,1)*tmp12 + A(3,4)*tmp15 );
2728 ET tmp34( A(3,0)*tmp9 - A(3,1)*tmp13 + A(3,3)*tmp15 );
2729 ET tmp35( A(3,0)*tmp10 - A(3,1)*tmp14 + A(3,2)*tmp15 );
2731 ET tmp36( A(2,2)*tmp16 - A(2,3)*tmp17 + A(2,4)*tmp18 - A(2,5)*tmp19 );
2732 ET tmp37( A(2,1)*tmp16 - A(2,3)*tmp20 + A(2,4)*tmp21 - A(2,5)*tmp22 );
2733 ET tmp38( A(2,1)*tmp17 - A(2,2)*tmp20 + A(2,4)*tmp23 - A(2,5)*tmp24 );
2734 ET tmp39( A(2,1)*tmp18 - A(2,2)*tmp21 + A(2,3)*tmp23 - A(2,5)*tmp25 );
2735 ET tmp40( A(2,1)*tmp19 - A(2,2)*tmp22 + A(2,3)*tmp24 - A(2,4)*tmp25 );
2736 ET tmp41( A(2,0)*tmp16 - A(2,3)*tmp26 + A(2,4)*tmp27 - A(2,5)*tmp28 );
2737 ET tmp42( A(2,0)*tmp17 - A(2,2)*tmp26 + A(2,4)*tmp29 - A(2,5)*tmp30 );
2738 ET tmp43( A(2,0)*tmp18 - A(2,2)*tmp27 + A(2,3)*tmp29 - A(2,5)*tmp31 );
2739 ET tmp44( A(2,0)*tmp19 - A(2,2)*tmp28 + A(2,3)*tmp30 - A(2,4)*tmp31 );
2741 B(0,0) = ET(
real( A(1,1)*tmp36 - A(1,2)*tmp37 + A(1,3)*tmp38 - A(1,4)*tmp39 + A(1,5)*tmp40 ) );
2742 B(0,1) = - A(0,1)*tmp36 + A(0,2)*tmp37 - A(0,3)*tmp38 + A(0,4)*tmp39 - A(0,5)*tmp40;
2743 B(1,1) = ET(
real( A(0,0)*tmp36 - A(0,2)*tmp41 + A(0,3)*tmp42 - A(0,4)*tmp43 + A(0,5)*tmp44 ) );
2745 ET tmp45( A(2,0)*tmp20 - A(2,1)*tmp26 + A(2,4)*tmp32 - A(2,5)*tmp33 );
2746 ET tmp46( A(2,0)*tmp21 - A(2,1)*tmp27 + A(2,3)*tmp32 - A(2,5)*tmp34 );
2747 ET tmp47( A(2,0)*tmp22 - A(2,1)*tmp28 + A(2,3)*tmp33 - A(2,4)*tmp34 );
2748 ET tmp48( A(2,0)*tmp23 - A(2,1)*tmp29 + A(2,2)*tmp32 - A(2,5)*tmp35 );
2749 ET tmp49( A(2,0)*tmp24 - A(2,1)*tmp30 + A(2,2)*tmp33 - A(2,4)*tmp35 );
2751 B(2,0) = A(1,0)*tmp37 - A(1,1)*tmp41 + A(1,3)*tmp45 - A(1,4)*tmp46 + A(1,5)*tmp47;
2752 B(2,1) = - A(0,0)*tmp37 + A(0,1)*tmp41 - A(0,3)*tmp45 + A(0,4)*tmp46 - A(0,5)*tmp47;
2753 B(3,0) = - A(1,0)*tmp38 + A(1,1)*tmp42 - A(1,2)*tmp45 + A(1,4)*tmp48 - A(1,5)*tmp49;
2754 B(3,1) = A(0,0)*tmp38 - A(0,1)*tmp42 + A(0,2)*tmp45 - A(0,4)*tmp48 + A(0,5)*tmp49;
2756 ET tmp50( A(2,0)*tmp25 - A(2,1)*tmp31 + A(2,2)*tmp34 - A(2,3)*tmp35 );
2758 B(4,0) = A(1,0)*tmp39 - A(1,1)*tmp43 + A(1,2)*tmp46 - A(1,3)*tmp48 + A(1,5)*tmp50;
2759 B(4,1) = - A(0,0)*tmp39 + A(0,1)*tmp43 - A(0,2)*tmp46 + A(0,3)*tmp48 - A(0,5)*tmp50;
2760 B(5,0) = - A(1,0)*tmp40 + A(1,1)*tmp44 - A(1,2)*tmp47 + A(1,3)*tmp49 - A(1,4)*tmp50;
2761 B(5,1) = A(0,0)*tmp40 - A(0,1)*tmp44 + A(0,2)*tmp47 - A(0,3)*tmp49 + A(0,4)*tmp50;
2763 tmp36 = A(1,1)*tmp16 - A(1,3)*tmp20 + A(1,4)*tmp21 - A(1,5)*tmp22;
2764 tmp37 = A(1,1)*tmp17 - A(1,2)*tmp20 + A(1,4)*tmp23 - A(1,5)*tmp24;
2765 tmp38 = A(1,0)*tmp16 - A(1,3)*tmp26 + A(1,4)*tmp27 - A(1,5)*tmp28;
2766 tmp39 = A(1,0)*tmp17 - A(1,2)*tmp26 + A(1,4)*tmp29 - A(1,5)*tmp30;
2767 tmp40 = A(1,0)*tmp20 - A(1,1)*tmp26 + A(1,4)*tmp32 - A(1,5)*tmp33;
2768 tmp41 = A(1,0)*tmp21 - A(1,1)*tmp27 + A(1,3)*tmp32 - A(1,5)*tmp34;
2769 tmp42 = A(1,0)*tmp22 - A(1,1)*tmp28 + A(1,3)*tmp33 - A(1,4)*tmp34;
2770 tmp43 = A(1,0)*tmp23 - A(1,1)*tmp29 + A(1,2)*tmp32 - A(1,5)*tmp35;
2771 tmp44 = A(1,0)*tmp24 - A(1,1)*tmp30 + A(1,2)*tmp33 - A(1,4)*tmp35;
2773 B(2,2) = ET(
real( A(0,0)*tmp36 - A(0,1)*tmp38 + A(0,3)*tmp40 - A(0,4)*tmp41 + A(0,5)*tmp42 ) );
2774 B(3,2) = - A(0,0)*tmp37 + A(0,1)*tmp39 - A(0,2)*tmp40 + A(0,4)*tmp43 - A(0,5)*tmp44;
2776 tmp1 = A(0,3)*A(1,4) - A(0,4)*A(1,3);
2777 tmp2 = A(0,2)*A(1,4) - A(0,4)*A(1,2);
2778 tmp3 = A(0,2)*A(1,3) - A(0,3)*A(1,2);
2779 tmp4 = A(0,1)*A(1,4) - A(0,4)*A(1,1);
2780 tmp5 = A(0,1)*A(1,3) - A(0,3)*A(1,1);
2781 tmp6 = A(0,1)*A(1,2) - A(0,2)*A(1,1);
2782 tmp7 = A(0,0)*A(1,4) - A(0,4)*A(1,0);
2783 tmp8 = A(0,0)*A(1,3) - A(0,3)*A(1,0);
2784 tmp9 = A(0,0)*A(1,2) - A(0,2)*A(1,0);
2785 tmp10 = A(0,0)*A(1,1) - A(0,1)*A(1,0);
2786 tmp11 = A(0,3)*A(1,5) - A(0,5)*A(1,3);
2787 tmp12 = A(0,2)*A(1,5) - A(0,5)*A(1,2);
2788 tmp13 = A(0,1)*A(1,5) - A(0,5)*A(1,1);
2789 tmp14 = A(0,0)*A(1,5) - A(0,5)*A(1,0);
2790 tmp15 = A(0,4)*A(1,5) - A(0,5)*A(1,4);
2792 tmp16 = A(2,3)*tmp15 - A(2,4)*tmp11 + A(2,5)*tmp1;
2793 tmp17 = A(2,2)*tmp15 - A(2,4)*tmp12 + A(2,5)*tmp2;
2794 tmp18 = A(2,2)*tmp11 - A(2,3)*tmp12 + A(2,5)*tmp3;
2795 tmp19 = A(2,2)*tmp1 - A(2,3)*tmp2 + A(2,4)*tmp3;
2796 tmp20 = A(2,1)*tmp15 - A(2,4)*tmp13 + A(2,5)*tmp4;
2797 tmp21 = A(2,1)*tmp11 - A(2,3)*tmp13 + A(2,5)*tmp5;
2798 tmp22 = A(2,1)*tmp1 - A(2,3)*tmp4 + A(2,4)*tmp5;
2799 tmp23 = A(2,1)*tmp12 - A(2,2)*tmp13 + A(2,5)*tmp6;
2800 tmp24 = A(2,1)*tmp2 - A(2,2)*tmp4 + A(2,4)*tmp6;
2801 tmp25 = A(2,1)*tmp3 - A(2,2)*tmp5 + A(2,3)*tmp6;
2802 tmp26 = A(2,0)*tmp15 - A(2,4)*tmp14 + A(2,5)*tmp7;
2803 tmp27 = A(2,0)*tmp11 - A(2,3)*tmp14 + A(2,5)*tmp8;
2804 tmp28 = A(2,0)*tmp1 - A(2,3)*tmp7 + A(2,4)*tmp8;
2805 tmp29 = A(2,0)*tmp12 - A(2,2)*tmp14 + A(2,5)*tmp9;
2806 tmp30 = A(2,0)*tmp2 - A(2,2)*tmp7 + A(2,4)*tmp9;
2807 tmp31 = A(2,0)*tmp3 - A(2,2)*tmp8 + A(2,3)*tmp9;
2808 tmp32 = A(2,0)*tmp13 - A(2,1)*tmp14 + A(2,5)*tmp10;
2809 tmp33 = A(2,0)*tmp4 - A(2,1)*tmp7 + A(2,4)*tmp10;
2810 tmp34 = A(2,0)*tmp5 - A(2,1)*tmp8 + A(2,3)*tmp10;
2811 tmp35 = A(2,0)*tmp6 - A(2,1)*tmp9 + A(2,2)*tmp10;
2813 tmp36 = A(3,1)*tmp16 - A(3,3)*tmp20 + A(3,4)*tmp21 - A(3,5)*tmp22;
2814 tmp37 = A(3,1)*tmp17 - A(3,2)*tmp20 + A(3,4)*tmp23 - A(3,5)*tmp24;
2815 tmp38 = A(3,0)*tmp16 - A(3,3)*tmp26 + A(3,4)*tmp27 - A(3,5)*tmp28;
2816 tmp39 = A(3,0)*tmp17 - A(3,2)*tmp26 + A(3,4)*tmp29 - A(3,5)*tmp30;
2817 tmp40 = A(3,0)*tmp20 - A(3,1)*tmp26 + A(3,4)*tmp32 - A(3,5)*tmp33;
2818 tmp41 = A(3,0)*tmp21 - A(3,1)*tmp27 + A(3,3)*tmp32 - A(3,5)*tmp34;
2819 tmp42 = A(3,0)*tmp22 - A(3,1)*tmp28 + A(3,3)*tmp33 - A(3,4)*tmp34;
2820 tmp43 = A(3,0)*tmp23 - A(3,1)*tmp29 + A(3,2)*tmp32 - A(3,5)*tmp35;
2821 tmp44 = A(3,0)*tmp24 - A(3,1)*tmp30 + A(3,2)*tmp33 - A(3,4)*tmp35;
2823 B(2,4) = - A(5,0)*tmp36 + A(5,1)*tmp38 - A(5,3)*tmp40 + A(5,4)*tmp41 - A(5,5)*tmp42;
2824 B(2,5) = A(4,0)*tmp36 - A(4,1)*tmp38 + A(4,3)*tmp40 - A(4,4)*tmp41 + A(4,5)*tmp42;
2825 B(3,4) = A(5,0)*tmp37 - A(5,1)*tmp39 + A(5,2)*tmp40 - A(5,4)*tmp43 + A(5,5)*tmp44;
2826 B(3,5) = - A(4,0)*tmp37 + A(4,1)*tmp39 - A(4,2)*tmp40 + A(4,4)*tmp43 - A(4,5)*tmp44;
2828 tmp36 = A(3,1)*tmp18 - A(3,2)*tmp21 + A(3,3)*tmp23 - A(3,5)*tmp25;
2829 tmp37 = A(3,1)*tmp19 - A(3,2)*tmp22 + A(3,3)*tmp24 - A(3,4)*tmp25;
2830 tmp38 = A(3,0)*tmp18 - A(3,2)*tmp27 + A(3,3)*tmp29 - A(3,5)*tmp31;
2831 tmp39 = A(3,0)*tmp19 - A(3,2)*tmp28 + A(3,3)*tmp30 - A(3,4)*tmp31;
2832 tmp40 = A(3,0)*tmp25 - A(3,1)*tmp31 + A(3,2)*tmp34 - A(3,3)*tmp35;
2834 B(4,4) = - ET(
real( A(5,0)*tmp36 - A(5,1)*tmp38 + A(5,2)*tmp41 - A(5,3)*tmp43 + A(5,5)*tmp40 ) );
2835 B(4,5) = A(4,0)*tmp36 - A(4,1)*tmp38 + A(4,2)*tmp41 - A(4,3)*tmp43 + A(4,5)*tmp40;
2836 B(5,5) = - ET(
real( A(4,0)*tmp37 - A(4,1)*tmp39 + A(4,2)*tmp42 - A(4,3)*tmp44 + A(4,4)*tmp40 ) );
2838 tmp36 = A(4,1)*tmp17 - A(4,2)*tmp20 + A(4,4)*tmp23 - A(4,5)*tmp24;
2839 tmp37 = A(4,0)*tmp17 - A(4,2)*tmp26 + A(4,4)*tmp29 - A(4,5)*tmp30;
2840 tmp38 = A(4,0)*tmp20 - A(4,1)*tmp26 + A(4,4)*tmp32 - A(4,5)*tmp33;
2841 tmp39 = A(4,0)*tmp23 - A(4,1)*tmp29 + A(4,2)*tmp32 - A(4,5)*tmp35;
2842 tmp40 = A(4,0)*tmp24 - A(4,1)*tmp30 + A(4,2)*tmp33 - A(4,4)*tmp35;
2844 B(3,3) = - ET(
real( A(5,0)*tmp36 - A(5,1)*tmp37 + A(5,2)*tmp38 - A(5,4)*tmp39 + A(5,5)*tmp40 ) );
2846 B(0,2) =
conj( B(2,0) );
2847 B(0,3) =
conj( B(3,0) );
2848 B(0,4) =
conj( B(4,0) );
2849 B(0,5) =
conj( B(5,0) );
2850 B(1,0) =
conj( B(0,1) );
2851 B(1,2) =
conj( B(2,1) );
2852 B(1,3) =
conj( B(3,1) );
2853 B(1,4) =
conj( B(4,1) );
2854 B(1,5) =
conj( B(5,1) );
2855 B(2,3) =
conj( B(3,2) );
2856 B(4,2) =
conj( B(2,4) );
2857 B(4,3) =
conj( B(3,4) );
2858 B(5,2) =
conj( B(2,5) );
2859 B(5,3) =
conj( B(3,5) );
2860 B(5,4) =
conj( B(4,5) );
2862 const ET
det(
real( A(0,0)*B(0,0) + A(0,1)*B(1,0) + A(0,2)*B(2,0) +
2863 A(0,3)*B(3,0) + A(0,4)*B(4,0) + A(0,5)*B(5,0) ) );
2891 template<
typename MT
2893 inline void invertLower6x6( DenseMatrix<MT,SO>& dm )
2900 using ET = ElementType_t<MT>;
2902 const StaticMatrix<ET,6UL,6UL,SO> A( ~dm );
2905 const ET tmp1( A(4,4)*A(5,5) );
2906 const ET tmp2( A(4,3)*A(5,5) );
2907 const ET tmp3( A(4,3)*A(5,4) - A(4,4)*A(5,3) );
2909 const ET tmp4( A(3,3)*tmp1 );
2910 const ET tmp5( A(3,2)*tmp1 );
2911 const ET tmp6( A(3,2)*tmp2 - A(3,3)*A(4,2)*A(5,5) );
2912 const ET tmp7( A(3,2)*tmp3 - A(3,3)*( A(4,2)*A(5,4) - A(4,4)*A(5,2) ) );
2913 const ET tmp8( A(0,0)*A(1,1)*A(2,2) );
2915 const ET tmp9 ( A(2,2)*tmp4 );
2916 const ET tmp10( A(2,1)*tmp4 );
2917 const ET tmp11( A(2,1)*tmp5 - A(2,2)*A(3,1)*tmp1 );
2918 const ET tmp12( A(2,1)*tmp6 - A(2,2)*( A(3,1)*tmp2 - A(3,3)*A(4,1)*A(5,5) ) );
2919 const ET tmp13( A(2,1)*tmp7 - A(2,2)*( A(3,1)*tmp3 - A(3,3)*( A(4,1)*A(5,4) - A(4,4)*A(5,1) ) ) );
2920 const ET tmp14( A(4,4)*tmp8 );
2921 const ET tmp15( A(4,3)*tmp8 );
2922 const ET tmp16( A(3,3)*tmp8 );
2924 B(0,0) = A(1,1)*tmp9;
2925 B(1,0) = - A(1,0)*tmp9;
2926 B(2,0) = A(1,0)*tmp10 - A(1,1)*A(2,0)*tmp4;
2927 B(3,0) = - A(1,0)*tmp11 + A(1,1)*( A(2,0)*tmp5 - A(2,2)*A(3,0)*tmp1 );
2928 B(4,0) = A(1,0)*tmp12 - A(1,1)*( A(2,0)*tmp6 - A(2,2)*( A(3,0)*tmp2 - A(3,3)*A(4,0)*A(5,5) ) );
2929 B(5,0) = - A(1,0)*tmp13 + A(1,1)*( A(2,0)*tmp7 - A(2,2)*( A(3,0)*tmp3 - A(3,3)*( A(4,0)*A(5,4) - A(4,4)*A(5,0) ) ) );
2930 B(1,1) = A(0,0)*tmp9;
2931 B(2,1) = - A(0,0)*tmp10;
2932 B(3,1) = A(0,0)*tmp11;
2933 B(4,1) = - A(0,0)*tmp12;
2934 B(5,1) = A(0,0)*tmp13;
2935 B(2,2) = A(0,0)*A(1,1)*tmp4;
2936 B(3,2) = - A(0,0)*A(1,1)*tmp5;
2937 B(4,2) = A(0,0)*A(1,1)*tmp6;
2938 B(5,2) = - A(0,0)*A(1,1)*tmp7;
2939 B(3,3) = A(5,5)*tmp14;
2940 B(4,3) = - A(5,5)*tmp15;
2941 B(5,3) = A(5,4)*tmp15 - A(5,3)*tmp14;
2942 B(4,4) = A(5,5)*tmp16 - A(5,3)*A(3,5)*tmp8;
2943 B(5,4) = - A(5,4)*tmp16;
2944 B(5,5) = A(4,4)*tmp16;
2946 const ET
det( B(5,5)*A(5,5) );
2972 template<
typename MT
2974 inline void invertUniLower6x6( DenseMatrix<MT,SO>& dm )
2981 using ET = ElementType_t<MT>;
2983 const StaticMatrix<ET,6UL,6UL,SO> A( ~dm );
2986 const ET tmp1( A(4,3)*A(5,4) - A(5,3) );
2987 const ET tmp2( A(3,2)*A(4,3) - A(4,2) );
2988 const ET tmp3( A(3,2)*tmp1 - A(4,2)*A(5,4) + A(5,2) );
2989 const ET tmp4( A(2,1)*A(3,2) - A(3,1) );
2990 const ET tmp5( A(2,1)*tmp2 - A(3,1)*A(4,3) + A(4,1) );
2991 const ET tmp6( A(2,1)*tmp3 - A(3,1)*tmp1 + A(4,1)*A(5,4) - A(5,1) );
2994 B(2,0) = A(1,0)*A(2,1) - A(2,0);
2995 B(3,0) = - A(1,0)*tmp4 + A(2,0)*A(3,2) - A(3,0);
2996 B(4,0) = A(1,0)*tmp5 - A(2,0)*tmp2 + A(3,0)*A(4,3) - A(4,0);
2997 B(5,0) = - A(1,0)*tmp6 + A(2,0)*tmp3 - A(3,0)*tmp1 + A(4,0)*A(5,4) - A(5,0);
3005 B(4,3) = A(5,3)*A(4,5) - A(4,3);
3006 B(5,3) = A(5,4)*A(4,3) - A(5,3);
3007 B(5,4) = A(5,3)*A(3,4) - A(5,4);
3029 template<
typename MT
3031 inline void invertUpper6x6( DenseMatrix<MT,SO>& dm )
3038 using ET = ElementType_t<MT>;
3040 const StaticMatrix<ET,6UL,6UL,SO> A( ~dm );
3043 const ET tmp1( A(0,1)*A(1,2) - A(0,2)*A(1,1) );
3044 const ET tmp2( A(0,0)*A(1,2) );
3045 const ET tmp3( A(0,0)*A(1,1) );
3047 const ET tmp4( A(3,3)*A(4,4)*A(5,5) );
3048 const ET tmp5( A(2,3)*tmp1 - A(2,2)*( A(0,1)*A(1,3) - A(0,3)*A(1,1) ) );
3049 const ET tmp6( A(2,3)*tmp2 - A(0,0)*A(1,3)*A(2,2) );
3050 const ET tmp7( A(2,3)*tmp3 );
3051 const ET tmp8( A(2,2)*tmp3 );
3053 const ET tmp9 ( A(2,2)*tmp4 );
3054 const ET tmp10( A(1,2)*tmp4 );
3055 const ET tmp11( A(1,1)*tmp4 );
3056 const ET tmp12( A(3,3)*( A(2,4)*tmp1 - A(2,2)*( A(0,1)*A(1,4) - A(0,4)*A(1,1) ) ) - A(3,4)*tmp5 );
3057 const ET tmp13( A(3,3)*( A(2,4)*tmp2 - A(0,0)*A(1,4)*A(2,2) ) - A(3,4)*tmp6 );
3058 const ET tmp14( A(3,3)*A(2,4)*tmp3 - A(3,4)*tmp7 );
3059 const ET tmp15( - A(3,4)*tmp8 );
3060 const ET tmp16( - A(3,3)*tmp8 );
3062 B(0,0) = A(1,1)*tmp9;
3063 B(0,1) = - A(0,1)*tmp9;
3064 B(1,1) = A(0,0)*tmp9;
3065 B(0,2) = A(0,1)*tmp10 - A(0,2)*tmp11;
3066 B(1,2) = - A(0,0)*tmp10;
3067 B(2,2) = A(0,0)*tmp11;
3068 B(0,3) = - A(5,5)*A(4,4)*tmp5;
3069 B(1,3) = A(5,5)*A(4,4)*tmp6;
3070 B(2,3) = - A(5,5)*A(4,4)*tmp7;
3071 B(3,3) = A(5,5)*A(4,4)*tmp8;
3072 B(0,4) = - A(5,5)*tmp12;
3073 B(1,4) = A(5,5)*tmp13;
3074 B(2,4) = - A(5,5)*tmp14;
3075 B(3,4) = A(5,5)*tmp15;
3076 B(4,4) = - A(5,5)*tmp16;
3077 B(0,5) = - A(4,4)*( A(3,3)*( A(2,5)*tmp1 - A(2,2)*( A(0,1)*A(1,5) - A(0,5)*A(1,1) ) ) - A(3,5)*tmp5 ) + A(4,5)*tmp12;
3078 B(1,5) = A(4,4)*( A(3,3)*( A(2,5)*tmp2 - A(0,0)*A(1,5)*A(2,2) ) - A(3,5)*tmp6 ) - A(4,5)*tmp13;
3079 B(2,5) = - A(4,4)*( A(3,3)*A(2,5)*tmp3 - A(3,5)*tmp7 ) + A(4,5)*tmp14;
3080 B(3,5) = - A(4,4)*A(3,5)*tmp8 - A(4,5)*tmp15;
3081 B(4,5) = A(4,5)*tmp16;
3082 B(5,5) = - A(4,4)*tmp16;
3084 const ET
det( A(0,0)*B(0,0) );
3110 template<
typename MT
3112 inline void invertUniUpper6x6( DenseMatrix<MT,SO>& dm )
3119 using ET = ElementType_t<MT>;
3121 const StaticMatrix<ET,6UL,6UL,SO> A( ~dm );
3124 const ET tmp1( A(0,1)*A(1,2) - A(0,2) );
3125 const ET tmp2( A(2,3)*tmp1 - A(0,1)*A(1,3) + A(0,3) );
3126 const ET tmp3( A(2,3)*A(1,2) - A(1,3) );
3127 const ET tmp4( A(2,4)*tmp1 - A(0,1)*A(1,4) + A(0,4) - A(3,4)*tmp2 );
3128 const ET tmp5( A(2,4)*A(1,2) - A(1,4) - A(3,4)*tmp3 );
3129 const ET tmp6( A(2,4) - A(3,4)*A(2,3) );
3132 B(0,2) = A(0,1)*A(1,2) - A(0,2);
3141 B(0,5) = - A(2,5)*tmp1 + A(0,1)*A(1,5) - A(0,5) + A(3,5)*tmp2 + A(4,5)*tmp4;
3142 B(1,5) = A(2,5)*A(1,2) - A(1,5) - A(3,5)*tmp3 - A(4,5)*tmp5;
3143 B(2,5) = - A(2,5) + A(3,5)*A(2,3) + A(4,5)*tmp6;
3144 B(3,5) = - A(3,5) + A(4,5)*A(3,4);
3167 template<
typename MT
3169 inline void invertDiagonal6x6( DenseMatrix<MT,SO>& dm )
3176 using ET = ElementType_t<MT>;
3180 const ET tmp1( A(0,0)*A(1,1) );
3181 const ET tmp2( A(3,3)*A(4,4) );
3182 const ET tmp3( tmp1*A(2,2) );
3183 const ET tmp4( tmp2*A(5,5) );
3184 const ET tmp5( A(0,0)*tmp4 );
3185 const ET tmp6( tmp3*A(3,3) );
3187 const ET
det( tmp3*tmp4 );
3193 const ET idet( ET(1) /
det );
3195 A(0,0) = A(1,1)*A(2,2)*tmp4*idet;
3196 A(1,1) = tmp5*A(2,2)*idet;
3197 A(2,2) = tmp1*tmp4*idet;
3198 A(3,3) = tmp3*A(4,4)*A(5,5)*idet;
3199 A(4,4) = tmp6*A(5,5)*idet;
3200 A(5,5) = tmp2*tmp3*idet;
3232 inline void invert6x6( DenseMatrix<MT,SO>& dm )
3240 case byLU : invertGeneral6x6 ( ~dm );
break;
3241 case byLDLT : invertSymmetric6x6( ~dm );
break;
3242 case byLDLH : invertHermitian6x6( ~dm );
break;
3243 case byLLH : invertHermitian6x6( ~dm );
break;
3244 case asGeneral : invertGeneral6x6 ( ~dm );
break;
3245 case asSymmetric: invertSymmetric6x6( ~dm );
break;
3246 case asHermitian: invertHermitian6x6( ~dm );
break;
3247 case asLower : invertLower6x6 ( ~dm );
break;
3248 case asUniLower : invertUniLower6x6 ( ~dm );
break;
3249 case asUpper : invertUpper6x6 ( ~dm );
break;
3250 case asUniUpper : invertUniUpper6x6 ( ~dm );
break;
3251 case asDiagonal : invertDiagonal6x6 ( ~dm );
break;
3297 template<
typename MT
3299 inline void invertByLU( DenseMatrix<MT,SO>& dm )
3305 const std::unique_ptr<int[]> ipiv(
new int[n] );
3307 getrf( ~dm, ipiv.get() );
3308 getri( ~dm, ipiv.get() );
3342 template<
typename MT
3344 inline void invertByLDLT( DenseMatrix<MT,SO>& dm )
3351 const char uplo( ( SO )?(
'L' ):(
'U' ) );
3352 const std::unique_ptr<int[]> ipiv(
new int[(~dm).
rows()] );
3354 sytrf( ~dm, uplo, ipiv.get() );
3355 sytri( ~dm, uplo, ipiv.get() );
3358 for(
size_t i=1UL; i<(~dm).
rows(); ++i ) {
3359 for(
size_t j=0UL; j<i; ++j ) {
3360 (~dm)(j,i) = (~dm)(i,j);
3365 for(
size_t j=1UL; j<(~dm).
columns(); ++j ) {
3366 for(
size_t i=0UL; i<j; ++i ) {
3367 (~dm)(j,i) = (~dm)(i,j);
3404 template<
typename MT
3406 inline auto invertByLDLH( DenseMatrix<MT,SO>& dm )
3407 -> EnableIf_t< IsBuiltin_v< ElementType_t<MT> > >
3409 invertByLDLT( ~dm );
3443 template<
typename MT
3445 inline auto invertByLDLH( DenseMatrix<MT,SO>& dm )
3446 -> EnableIf_t< IsComplex_v< ElementType_t<MT> > >
3453 const char uplo( ( SO )?(
'L' ):(
'U' ) );
3454 const std::unique_ptr<int[]> ipiv(
new int[(~dm).
rows()] );
3456 hetrf( ~dm, uplo, ipiv.get() );
3457 hetri( ~dm, uplo, ipiv.get() );
3460 for(
size_t i=1UL; i<(~dm).
rows(); ++i ) {
3461 for(
size_t j=0UL; j<i; ++j ) {
3462 (~dm)(j,i) =
conj( (~dm)(i,j) );
3467 for(
size_t j=1UL; j<(~dm).
columns(); ++j ) {
3468 for(
size_t i=0UL; i<j; ++i ) {
3469 (~dm)(j,i) =
conj( (~dm)(i,j) );
3506 template<
typename MT
3508 inline void invertByLLH( DenseMatrix<MT,SO>& dm )
3515 const char uplo( ( SO )?(
'L' ):(
'U' ) );
3521 for(
size_t i=1UL; i<(~dm).
rows(); ++i ) {
3522 for(
size_t j=0UL; j<i; ++j ) {
3523 (~dm)(j,i) =
conj( (~dm)(i,j) );
3528 for(
size_t j=1UL; j<(~dm).
columns(); ++j ) {
3529 for(
size_t i=0UL; i<j; ++i ) {
3530 (~dm)(j,i) =
conj( (~dm)(i,j) );
3567 template<
typename MT
3569 inline void invertLowerNxN( DenseMatrix<MT,SO>& dm )
3574 trtri( ~dm,
'L',
'N' );
3608 template<
typename MT
3610 inline void invertUniLowerNxN( DenseMatrix<MT,SO>& dm )
3615 trtri( ~dm,
'L',
'U' );
3649 template<
typename MT
3651 inline void invertUpperNxN( DenseMatrix<MT,SO>& dm )
3656 trtri( ~dm,
'U',
'N' );
3690 template<
typename MT
3692 inline void invertUniUpperNxN( DenseMatrix<MT,SO>& dm )
3697 trtri( ~dm,
'U',
'U' );
3731 template<
typename MT
3733 inline void invertDiagonalNxN( DenseMatrix<MT,SO>& dm )
3738 for(
size_t i=0UL; i<(~dm).
rows(); ++i )
3777 inline void invertNxN( DenseMatrix<MT,SO>& dm )
3785 case byLU : invertByLU ( ~dm );
break;
3786 case byLDLT : invertByLDLT ( ~dm );
break;
3787 case byLDLH : invertByLDLH ( ~dm );
break;
3788 case byLLH : invertByLLH ( ~dm );
break;
3789 case asGeneral : invertByLU ( ~dm );
break;
3792 case asLower : invertLowerNxN ( ~dm );
break;
3793 case asUniLower : invertUniLowerNxN( ~dm );
break;
3794 case asUpper : invertUpperNxN ( ~dm );
break;
3795 case asUniUpper : invertUniUpperNxN( ~dm );
break;
3796 case asDiagonal : invertDiagonalNxN( ~dm );
break;
3817 template<
typename MT,
bool SO >
3818 inline void invert( DenseMatrix<MT,SO>& dm );
3820 template< InversionFlag IF,
typename MT,
bool SO >
3821 inline void invert( DenseMatrix<MT,SO>& dm );
3852 template<
typename MT
3856 invert<byLU>( ~dm );
3911 switch( (~dm).
rows() ) {
3913 case 1UL:
invert( (~dm)(0,0) );
break;
3914 case 2UL: invert2x2<IF>( ~dm );
break;
3915 case 3UL: invert3x3<IF>( ~dm );
break;
3916 case 4UL: invert4x4<IF>( ~dm );
break;
3917 case 5UL: invert5x5<IF>( ~dm );
break;
3918 case 6UL: invert6x6<IF>( ~dm );
break;
3919 default : invertNxN<IF>( ~dm );
break;
#define BLAZE_THROW_INVALID_ARGUMENT(MESSAGE)
Macro for the emission of a std::invalid_argument exception.This macro encapsulates the default way o...
Definition: Exception.h:235
Header file for auxiliary alias declarations.
Headerfile for the generic min algorithm.
void trtri(char uplo, char diag, int n, float *A, int lda, int *info)
LAPACK kernel for the inversion of the given dense triangular single precision column-major matrix.
Definition: trtri.h:129
#define BLAZE_USER_ASSERT(expr, msg)
Run time assertion macro for user checks.In case of an invalid run time expression,...
Definition: Assert.h:117
void hetri(char uplo, int n, complex< float > *A, int lda, const int *ipiv, complex< float > *work, int *info)
LAPACK kernel for the inversion of the given dense Hermitian indefinite single precision complex colu...
Definition: hetri.h:124
Flag for the inversion of a diagonal matrix.
Definition: InversionFlag.h:115
Header file for the LAPACK matrix Cholesky-based inversion functions (potri)
Header file for basic type definitions.
ElementType_t< MT > det(const DenseMatrix< MT, SO > &dm)
Computation of the determinant of the given dense square matrix.
Definition: DMatDetExpr.h:384
Flag for the inversion of a general matrix (same as byLU).
Definition: InversionFlag.h:108
Header file for the LAPACK Cholesky decomposition functions (potrf)
Flag for the inversion of a upper unitriangular matrix.
Definition: InversionFlag.h:114
Flag for the inversion of a lower unitriangular matrix.
Definition: InversionFlag.h:112
decltype(auto) real(const DenseMatrix< MT, SO > &dm)
Returns a matrix containing the real part of each single element of dm.
Definition: DMatMapExpr.h:1389
Header file for the dense matrix inversion flags.
Flag for the Bunch-Kaufman-based inversion for Hermitian matrices.
Definition: InversionFlag.h:105
void potri(char uplo, int n, float *A, int lda, int *info)
LAPACK kernel for the inversion of the given dense positive definite single precision column-major sq...
Definition: potri.h:125
Header file for the invert shim.
Constraint on the data type.
constexpr size_t columns(const Matrix< MT, SO > &matrix) noexcept
Returns the current number of columns of the matrix.
Definition: Matrix.h:514
#define BLAZE_CONSTRAINT_MUST_NOT_BE_ADAPTOR_TYPE(T)
Constraint on the data type.In case the given data type T is an adaptor type (as for instance LowerMa...
Definition: Adaptor.h:81
Base class for dense matrices.The DenseMatrix class is a base class for all dense matrix classes....
Definition: DenseMatrix.h:81
typename T::ElementType ElementType_t
Alias declaration for nested ElementType type definitions.The ElementType_t alias declaration provide...
Definition: Aliases.h:170
void hetrf(char uplo, int n, complex< float > *A, int lda, int *ipiv, complex< float > *work, int lwork, int *info)
LAPACK kernel for the decomposition of the given dense Hermitian indefinite single precision complex ...
Definition: hetrf.h:140
Header file for the LAPACK Hermitian matrix inversion functionality (hetri)
void sytrf(char uplo, int n, float *A, int lda, int *ipiv, float *work, int lwork, int *info)
LAPACK kernel for the decomposition of the given dense symmetric indefinite single precision column-m...
Definition: sytrf.h:150
Header file for the LAPACK Hermitian matrix decomposition functionality (hetrf)
void invert(const HermitianProxy< MT > &proxy)
In-place inversion of the represented element.
Definition: HermitianProxy.h:779
void sytri(char uplo, int n, float *A, int lda, const int *ipiv, float *work, int *info)
LAPACK kernel for the inversion of the given dense symmetric indefinite single precision column-major...
Definition: sytri.h:132
Flag for the inversion of a upper triangular matrix.
Definition: InversionFlag.h:113
Constraint on the data type.
Flag for the inversion of a lower triangular matrix.
Definition: InversionFlag.h:111
#define BLAZE_THROW_DIVISION_BY_ZERO(MESSAGE)
Macro for the emission of an exception on detection of a division by zero.This macro encapsulates the...
Definition: Exception.h:97
Header file for the LAPACK triangular matrix inversion functions (trtri)
Namespace of the Blaze C++ math library.
Definition: Blaze.h:58
Flag for the LU-based matrix inversion.
Definition: InversionFlag.h:103
decltype(auto) min(const DenseMatrix< MT1, SO1 > &lhs, const DenseMatrix< MT2, SO2 > &rhs)
Computes the componentwise minimum of the dense matrices lhs and rhs.
Definition: DMatDMatMapExpr.h:1162
Header file for the DenseMatrix base class.
Header file for the LAPACK symmetric matrix inversion functions (sytri)
Header file for the implementation of a fixed-size matrix.
Header file for the LAPACK symmetric matrix decomposition functions (sytrf)
Flag for the inversion of a Hermitian matrix (same as byLDLH).
Definition: InversionFlag.h:110
Flag for the Bunch-Kaufman-based inversion for symmetric matrices.
Definition: InversionFlag.h:104
Header file for the exception macros of the math module.
Header file for the EnableIf class template.
Header file for the conjugate shim.
void getri(int n, float *A, int lda, const int *ipiv, float *work, int lwork, int *info)
LAPACK kernel for the inversion of the given dense general single precision column-major square matri...
Definition: getri.h:131
bool isDivisor(const DenseVector< VT, TF > &dv)
Returns whether the given dense vector is a valid divisor.
Definition: DenseVector.h:1179
Flag for the inversion of a symmetric matrix (same as byLDLT).
Definition: InversionFlag.h:109
void getrf(int m, int n, float *A, int lda, int *ipiv, int *info)
LAPACK kernel for the LU decomposition of the given dense general single precision column-major matri...
Definition: getrf.h:131
Header file for run time assertion macros.
bool isHermitian(const DenseMatrix< MT, SO > &dm)
Checks if the given dense matrix is Hermitian.
Definition: DenseMatrix.h:1406
#define BLAZE_CONSTRAINT_MUST_BE_BLAS_COMPATIBLE_TYPE(T)
Constraint on the data type.In case the given data type T is not a BLAS compatible data type (i....
Definition: BLASCompatible.h:61
Flag for the Cholesky-based inversion for positive-definite matrices.
Definition: InversionFlag.h:106
bool isSymmetric(const DenseMatrix< MT, SO > &dm)
Checks if the given dense matrix is symmetric.
Definition: DenseMatrix.h:1328
constexpr size_t rows(const Matrix< MT, SO > &matrix) noexcept
Returns the current number of rows of the matrix.
Definition: Matrix.h:498
Constraint on the data type.
#define BLAZE_CONSTRAINT_MUST_NOT_BE_STRICTLY_TRIANGULAR_MATRIX_TYPE(T)
Constraint on the data type.In case the given data type T is a strictly lower or upper triangular mat...
Definition: StrictlyTriangular.h:81
Header file for the IsBuiltin type trait.
Header file for the isDivisor shim.
bool isIntact(const DiagonalMatrix< MT, SO, DF > &m)
Returns whether the invariants of the given diagonal matrix are intact.
Definition: DiagonalMatrix.h:264
Header file for the IsComplex type trait.
void potrf(char uplo, int n, float *A, int lda, int *info)
LAPACK kernel for the Cholesky decomposition of the given dense positive definite single precision co...
Definition: potrf.h:132
Header file for the real shim.
decltype(auto) conj(const DenseMatrix< MT, SO > &dm)
Returns a matrix containing the complex conjugate of each single element of dm.
Definition: DMatMapExpr.h:1324
Header file for the LAPACK LU-based matrix inversion functionality (getri)
bool isSquare(const Matrix< MT, SO > &matrix) noexcept
Checks if the given matrix is a square matrix.
Definition: Matrix.h:951
Header file for the LAPACK LU decomposition functions (getrf)
InversionFlag
Inversion flag.The InversionFlag type enumeration represents the different types of matrix inversion ...
Definition: InversionFlag.h:101
#define BLAZE_INTERNAL_ASSERT(expr, msg)
Run time assertion macro for internal checks.In case of an invalid run time expression,...
Definition: Assert.h:101