29 # include <QTextStream>
39 template <
size_t nRows,
size_t nCols,
typename T =
double>
class Matrix {
61 for(
size_t i = 0; i < nRows; i++)
62 for(
size_t j = 0; j < nCols; j++)
73 for(
size_t i = 0; i < nRows; i++)
74 for(
size_t j = 0; j < nCols; j++)
75 rows[i][j] = T(mat(i, j));
85 for(
size_t i = 0; i < nRows; i++)
113 for(
size_t i = 0; i < nRows; i++)
129 for(
size_t i = 0; i < nRows; i++)
141 for(
size_t i = 0; i < nRows; i++)
142 for(
size_t j = 0; j < nCols; j++)
143 rows[i][j] = (i == j) ? value : 0;
189 return rows[0].
data();
200 for(
size_t i = 0; i < nRows; i++)
201 ans.rows[i] = -rows[i];
214 for(
size_t i = 0; i < nRows; i++)
215 ans.rows[i] = rows[i] + mat.rows[i];
228 for(
size_t i = 0; i < nRows; i++)
229 ans.rows[i] = rows[i] - mat.rows[i];
242 for(
size_t i = 0; i < nRows; i++)
243 ans[i] = rows[i] * scalar;
256 for(
size_t i = 0; i < nRows; i++)
257 ans[i] = rows[i] / scalar;
270 for(
size_t i = 0; i < nRows; i++)
271 ans[i] = scalar * mat.rows[i];
283 for(
size_t i = 0; i < nRows; ++i) {
285 for(
size_t j = 0; j < nCols; ++j)
286 value += rows[i][j] * vec[j];
295 for(
size_t i = 0; i < nRows; i++)
296 rows[i] = mat.rows[i];
303 return ((*
this) = (*
this) + mat);
308 return ((*
this) = (*
this) - mat);
313 return ((*
this) = (*
this) * scalar);
318 return ((*
this) = (*
this) / scalar);
323 return ((*
this) = (*
this) * mat);
332 for(
size_t i = 0; i < nRows; i++)
333 if(rows[i] != mat.rows[i])
344 return (!((*
this) == mat));
355 for(
size_t i = 0; i < nRows; ++i) {
356 if(rows[i] < other.rows[i])
358 if(rows[i] > other.rows[i])
367 for(
size_t i = 0; i < nRows; i++) {
378 for(
size_t i = 0; i < nRows && !in.atEnd(); i++)
387 for(
size_t i = 0; i < nRows; i++) {
399 for(
size_t i = 0; i < nRows && in; i++)
456 for(
size_t i = 0; i < nRows; i++)
457 for(
size_t j = 0; j < nCols; j++)
470 for(
size_t i = 0; i < nRows; ++i) {
471 for(
size_t j = 0; j < nCols; ++j) {
488 for(
size_t i = 0; i < nRows; ++i)
489 for(
size_t j = 0; j < nCols; ++j)
490 t[i][j] = rows[j][i];
503 T ca = std::cos(angle);
504 T sa = std::sin(angle);
509 r[0].set(ca + (1 - ca) * x * x, (1 - ca) * x * y - sa * z, (1 - ca) * z * x + sa * y);
510 r[1].set((1 - ca) * y * x + sa * z, ca + (1 - ca) * y * y, (1 - ca) * z * y - sa * x);
511 r[2].set((1 - ca) * x * z - sa * y, (1 - ca) * y * z + sa * x, ca + (1 - ca) * z * z);
524 T ca = std::cos(angle);
525 T sa = std::sin(angle);
527 T x = direction.
x() / direction.
t();
528 T y = direction.
y() / direction.
t();
529 T z = direction.
z() / direction.
t();
530 r[0].set(ca + (1 - ca) * x * x, (1 - ca) * x * y - sa * z, (1 - ca) * z * x + sa * y, 0);
531 r[1].set((1 - ca) * y * x + sa * z, ca + (1 - ca) * y * y, (1 - ca) * z * y - sa * x, 0);
532 r[2].set((1 - ca) * x * z - sa * y, (1 - ca) * y * z + sa * x, ca + (1 - ca) * z * z, 0);
533 r[3].set(0, 0, 0, 1);
544 for(
size_t i = 0; i <
min(nRows, nCols); ++i) {
553 memcpy(array, &rows[0][0],
sizeof(T) * nRows * nCols);
564 for(
size_t i = 0; i < nRows; ++i)
565 res[i] = (*
this)(i, i);
574 template <
size_t nRows,
size_t nCols,
typename T>
581 template <
size_t nRows,
size_t nSize,
size_t nCols,
typename T>
583 const Matrix<nSize, nCols, T>&
mat2);
606 template <
size_t nRows,
typename T> T
CU_HOST_DEVICE det(
const Matrix<nRows, nRows, T>& mat);
608 template <
size_t nRows,
typename T>
615 template <
size_t nRows,
typename T>
CU_HOST_DEVICE T
cofactor(
const Matrix<nRows, nRows, T>& mat,
size_t i,
size_t j);
649 template <
size_t nRows,
typename T>
CU_HOST_DEVICE Matrix<nRows, nRows, T>
inverse(
const Matrix<nRows, nRows, T>& mat);
656 template <
size_t nRows,
size_t nCols,
typename T>
667 template <
size_t nRows,
size_t nCols,
typename T>
CU_HOST_DEVICE T
norm(
const Matrix<nRows, nCols, T>& mat);
676 template <
size_t nRows,
size_t nCols,
typename T>
CU_HOST_DEVICE T
normsq(
const Matrix<nRows, nCols, T>& mat);
683 template <
size_t nRows,
size_t nCols,
typename T>
687 for(
size_t i = 0; i < nRows; ++i) {
690 for(
size_t j = 0; j < nCols; ++j) {
691 rrow[j] = (*fct)(mrow[j]);
702 template <
size_t nRows,
size_t nCols,
typename T>
706 for(
size_t i = 0; i < nRows; ++i) {
709 for(
size_t j = 0; j < nCols; ++j) {
710 rrow[j] = (*fct)(mrow[j]);
721 template <
size_t nRows,
size_t nCols,
typename T>
725 for(
size_t i = 0; i < nRows; ++i) {
728 for(
size_t j = 0; j < nCols; ++j) {
729 rrow[j] = (*fct)(mrow[j]);
740 template <
size_t nRows,
size_t nCols,
typename T,
typename T1>
744 for(
size_t i = 0; i < nRows; ++i) {
747 for(
size_t j = 0; j < nCols; ++j) {
748 rrow[j] = (*fct)(mrow[j]);
759 template <
size_t nRows,
size_t nCols,
typename T,
typename T1>
763 for(
size_t i = 0; i < nRows; ++i) {
766 for(
size_t j = 0; j < nCols; ++j) {
767 rrow[j] = (*fct)(mrow[j]);
778 template <
size_t nRows,
size_t nCols,
typename T,
typename T1>
782 for(
size_t i = 0; i < nRows; ++i) {
785 for(
size_t j = 0; j < nCols; ++j) {
786 rrow[j] = (*fct)(mrow[j]);
797 template <
size_t nRows,
size_t nCols,
typename T>
802 for(
size_t i = 0; i < nRows; ++i) {
806 for(
size_t j = 0; j < nCols; ++j) {
807 rrow[j] = (*fct)(mrow1[j], mrow2[j]);
818 template <
size_t nRows,
size_t nCols,
typename T>
823 for(
size_t i = 0; i < nRows; ++i) {
827 for(
size_t j = 0; j < nCols; ++j) {
828 rrow[j] = (*fct)(mrow1[j], mrow2[j]);
839 template <
size_t nRows,
size_t nCols,
typename T>
844 for(
size_t i = 0; i < nRows; ++i) {
848 for(
size_t j = 0; j < nCols; ++j) {
849 rrow[j] = (*fct)(mrow1[j], mrow2[j]);
860 template <
size_t nRows,
size_t nCols,
typename T,
typename T1,
typename T2>
865 for(
size_t i = 0; i < nRows; ++i) {
869 for(
size_t j = 0; j < nCols; ++j) {
870 rrow[j] = (*fct)(mrow1[j], mrow2[j]);
881 template <
size_t nRows,
size_t nCols,
typename T,
typename T1,
typename T2>
886 for(
size_t i = 0; i < nRows; ++i) {
890 for(
size_t j = 0; j < nCols; ++j) {
891 rrow[j] = (*fct)(mrow1[j], mrow2[j]);
902 template <
size_t nRows,
size_t nCols,
typename T,
typename T1,
typename T2>
907 for(
size_t i = 0; i < nRows; ++i) {
911 for(
size_t j = 0; j < nCols; ++j) {
912 rrow[j] = (*fct)(mrow1[j], mrow2[j]);
918 template <
size_t nRows,
size_t nCols,
typename T>
922 for(
size_t i = 0; i < nCols; ++i) {
924 for(
size_t j = 0; j < nRows; ++j)
925 value += mat(j, i) * vec[j];
931 template <
size_t nRows,
size_t intSize,
size_t nCols,
typename T>
936 for(
size_t i = 0; i < nRows; i++)
937 for(
size_t j = 0; j < nCols; j++) {
939 for(
size_t k = 0; k < intSize; k++)
940 acc += mat1(i, k) *
mat2(k, j);
952 return mat(0, 0) * mat(1, 1) - mat(0, 1) * mat(1, 0);
957 return mat(0, 0) * mat(1, 1) * mat(2, 2) + mat(0, 1) * mat(1, 2) * mat(2, 0) + mat(0, 2) * mat(1, 0) * mat(2, 1)
958 - mat(0, 0) * mat(1, 2) * mat(2, 1) - mat(0, 1) * mat(1, 0) * mat(2, 2) - mat(0, 2) * mat(1, 1) * mat(2, 0);
965 for(
size_t i = 0; i < nRows; i++) {
966 acc += mat(i, 0) *
cofactor(mat, i, 0);
971 template <
size_t nRows,
typename T>
975 Matrix<nRows - 1, nRows - 1, T> ans;
976 for(
size_t i1 = 0, i2 = 0; i1 < nRows; i1++, i2++) {
980 for(
size_t j1 = 0, j2 = 0; j1 < nRows; j1++, j2++) {
984 ans(i2, j2) = mat(i1, j1);
1004 ans[0][0] = 1 / mat(0, 0);
1015 ans(0, 0) = mat(1, 1) / d;
1016 ans(0, 1) = mat(0, 1) / -d;
1017 ans(1, 0) = mat(1, 0) / -d;
1018 ans(1, 1) = mat(0, 0) / d;
1029 ans(0, 0) = (mat(1, 1) * mat(2, 2) - mat(1, 2) * mat(2, 1)) / d;
1030 ans(1, 1) = (mat(0, 0) * mat(2, 2) - mat(0, 2) * mat(2, 0)) / d;
1031 ans(2, 2) = (mat(1, 1) * mat(0, 0) - mat(1, 0) * mat(0, 1)) / d;
1032 ans(1, 0) = (mat(1, 2) * mat(2, 0) - mat(1, 0) * mat(2, 2)) / d;
1033 ans(0, 1) = (mat(2, 1) * mat(0, 2) - mat(0, 1) * mat(2, 2)) / d;
1034 ans(2, 0) = (mat(1, 0) * mat(2, 1) - mat(1, 1) * mat(2, 0)) / d;
1035 ans(0, 2) = (mat(0, 1) * mat(1, 2) - mat(1, 1) * mat(0, 2)) / d;
1036 ans(1, 2) = (mat(0, 2) * mat(1, 0) - mat(0, 0) * mat(1, 2)) / d;
1037 ans(2, 1) = (mat(2, 0) * mat(0, 1) - mat(0, 0) * mat(2, 1)) / d;
1045 inv(0, 0) = (m(1, 1) * m(2, 2) * m(3, 3) - m(1, 1) * m(3, 2) * m(2, 3) - m(1, 2) * m(2, 1) * m(3, 3)
1046 + m(1, 2) * m(3, 1) * m(2, 3) + m(1, 3) * m(2, 1) * m(3, 2) - m(1, 3) * m(3, 1) * m(2, 2));
1048 inv(0, 1) = (-m(0, 1) * m(2, 2) * m(3, 3) + m(0, 1) * m(3, 2) * m(2, 3) + m(0, 2) * m(2, 1) * m(3, 3)
1049 - m(0, 2) * m(3, 1) * m(2, 3) - m(0, 3) * m(2, 1) * m(3, 2) + m(0, 3) * m(3, 1) * m(2, 2));
1051 inv(0, 2) = (m(0, 1) * m(1, 2) * m(3, 3) - m(0, 1) * m(3, 2) * m(1, 3) - m(0, 2) * m(1, 1) * m(3, 3)
1052 + m(0, 2) * m(3, 1) * m(1, 3) + m(0, 3) * m(1, 1) * m(3, 2) - m(0, 3) * m(3, 1) * m(1, 2));
1054 inv(0, 3) = (-m(0, 1) * m(1, 2) * m(2, 3) + m(0, 1) * m(2, 2) * m(1, 3) + m(0, 2) * m(1, 1) * m(2, 3)
1055 - m(0, 2) * m(2, 1) * m(1, 3) - m(0, 3) * m(1, 1) * m(2, 2) + m(0, 3) * m(2, 1) * m(1, 2));
1057 inv(1, 0) = (-m(1, 0) * m(2, 2) * m(3, 3) + m(1, 0) * m(3, 2) * m(2, 3) + m(1, 2) * m(2, 0) * m(3, 3)
1058 - m(1, 2) * m(3, 0) * m(2, 3) - m(1, 3) * m(2, 0) * m(3, 2) + m(1, 3) * m(3, 0) * m(2, 2));
1060 inv(1, 1) = (m(0, 0) * m(2, 2) * m(3, 3) - m(0, 0) * m(3, 2) * m(2, 3) - m(0, 2) * m(2, 0) * m(3, 3)
1061 + m(0, 2) * m(3, 0) * m(2, 3) + m(0, 3) * m(2, 0) * m(3, 2) - m(0, 3) * m(3, 0) * m(2, 2));
1063 inv(1, 2) = (-m(0, 0) * m(1, 2) * m(3, 3) + m(0, 0) * m(3, 2) * m(1, 3) + m(0, 2) * m(1, 0) * m(3, 3)
1064 - m(0, 2) * m(3, 0) * m(1, 3) - m(0, 3) * m(1, 0) * m(3, 2) + m(0, 3) * m(3, 0) * m(1, 2));
1066 inv(1, 3) = (m(0, 0) * m(1, 2) * m(2, 3) - m(0, 0) * m(2, 2) * m(1, 3) - m(0, 2) * m(1, 0) * m(2, 3)
1067 + m(0, 2) * m(2, 0) * m(1, 3) + m(0, 3) * m(1, 0) * m(2, 2) - m(0, 3) * m(2, 0) * m(1, 2));
1069 inv(2, 0) = (m(1, 0) * m(2, 1) * m(3, 3) - m(1, 0) * m(3, 1) * m(2, 3) - m(1, 1) * m(2, 0) * m(3, 3)
1070 + m(1, 1) * m(3, 0) * m(2, 3) + m(1, 3) * m(2, 0) * m(3, 1) - m(1, 3) * m(3, 0) * m(2, 1));
1072 inv(2, 1) = (-m(0, 0) * m(2, 1) * m(3, 3) + m(0, 0) * m(3, 1) * m(2, 3) + m(0, 1) * m(2, 0) * m(3, 3)
1073 - m(0, 1) * m(3, 0) * m(2, 3) - m(0, 3) * m(2, 0) * m(3, 1) + m(0, 3) * m(3, 0) * m(2, 1));
1075 inv(2, 2) = (m(0, 0) * m(1, 1) * m(3, 3) - m(0, 0) * m(3, 1) * m(1, 3) - m(0, 1) * m(1, 0) * m(3, 3)
1076 + m(0, 1) * m(3, 0) * m(1, 3) + m(0, 3) * m(1, 0) * m(3, 1) - m(0, 3) * m(3, 0) * m(1, 1));
1078 inv(2, 3) = (-m(0, 0) * m(1, 1) * m(2, 3) + m(0, 0) * m(2, 1) * m(1, 3) + m(0, 1) * m(1, 0) * m(2, 3)
1079 - m(0, 1) * m(2, 0) * m(1, 3) - m(0, 3) * m(1, 0) * m(2, 1) + m(0, 3) * m(2, 0) * m(1, 1));
1081 inv(3, 0) = (-m(1, 0) * m(2, 1) * m(3, 2) + m(1, 0) * m(3, 1) * m(2, 2) + m(1, 1) * m(2, 0) * m(3, 2)
1082 - m(1, 1) * m(3, 0) * m(2, 2) - m(1, 2) * m(2, 0) * m(3, 1) + m(1, 2) * m(3, 0) * m(2, 1));
1084 inv(3, 1) = (m(0, 0) * m(2, 1) * m(3, 2) - m(0, 0) * m(3, 1) * m(2, 2) - m(0, 1) * m(2, 0) * m(3, 2)
1085 + m(0, 1) * m(3, 0) * m(2, 2) + m(0, 2) * m(2, 0) * m(3, 1) - m(0, 2) * m(3, 0) * m(2, 1));
1087 inv(3, 2) = (-m(0, 0) * m(1, 1) * m(3, 2) + m(0, 0) * m(3, 1) * m(1, 2) + m(0, 1) * m(1, 0) * m(3, 2)
1088 - m(0, 1) * m(3, 0) * m(1, 2) - m(0, 2) * m(1, 0) * m(3, 1) + m(0, 2) * m(3, 0) * m(1, 1));
1090 inv(3, 3) = (m(0, 0) * m(1, 1) * m(2, 2) - m(0, 0) * m(2, 1) * m(1, 2) - m(0, 1) * m(1, 0) * m(2, 2)
1091 + m(0, 1) * m(2, 0) * m(1, 2) + m(0, 2) * m(1, 0) * m(2, 1) - m(0, 2) * m(2, 0) * m(1, 1));
1093 T
det = m(0, 0) * inv(0, 0) + m(1, 0) * inv(0, 1) + m(2, 0) * inv(0, 2) + m(3, 0) * inv(0, 3);
1095 T inv_det = 1.0 /
det;
1097 return inv_det * inv;
1106 for(
size_t i = 0; i < nRows; ++i)
1107 for(
size_t j = 0; j < nRows; ++j) {
1108 ans(i, j) =
cofactor(mat, j, i) / d;
1113 template <
size_t nRows,
size_t nCols,
typename T>
1117 for(
size_t i = 0; i < nRows; i++)
1118 for(
size_t j = 0; j < nCols; j++)
1119 ans(j, i) = mat(i, j);
1126 for(
size_t i = 0; i < nRows; i++)
1127 for(
size_t j = 0; j < nCols; j++) {
1128 const T& v = mat(i, j);
1136 return std::sqrt(
normsq(mat));