31 #define arcs_assert(a) (assert(a))
34#define PrintMatSize(a) (PrintMatSize_Macro((a),#a))
35#define PrintMatrix(a,b) (PrintMatrix_Macro((a),b,#a))
36#define PrintMat(a) (PrintMat_Macro((a),#a))
43template <
size_t NN,
size_t MM,
typename TT =
double>
54 : Nindex(0), Mindex(0),
Data({0})
56 static_assert(NN != 0);
57 static_assert(MM != 0);
63 constexpr explicit Matrix(
const TT InitValue)
64 : Nindex(0), Mindex(0),
Data({0})
66 static_assert(NN != 0);
67 static_assert(MM != 0);
73 constexpr Matrix(std::initializer_list<TT> InitList)
74 : Nindex(0), Mindex(0),
Data({0})
76 static_assert(NN != 0);
77 static_assert(MM != 0);
78 const TT* ListVal = InitList.begin();
81 for(
size_t i = 0; i < InitList.size(); ++i){
85 Data[Ni][Mi] = (TT)ListVal[i];
97 : Nindex(0), Mindex(0), Data(std::move(r.Data))
105 : Nindex(0), Mindex(0),
Data(right.
Data)
121 static_assert(this->
N == right.
N,
"Matrix Size Error");
122 static_assert(this->
M == right.
M,
"Matrix Size Error");
123 for(
size_t i = 0; i <
N; ++i){
124 for(
size_t j = 0; j <
M; ++j) this->
Data[i][j] = right.
Data[i][j];
133 for(
size_t i = 0; i <
N; ++i){
134 for(
size_t j = 0; j <
M; ++j) ret.
Data[i][j] =
Data[i][j];
143 for(
size_t i = 0; i <
N; ++i){
144 for(
size_t j = 0; j <
M; ++j) ret.
Data[i][j] = -
Data[i][j];
153 static_assert(
N == right.
N,
"Matrix Size Error");
154 static_assert(
M == right.
M,
"Matrix Size Error");
156 for(
size_t i = 0; i <
N; ++i){
157 for(
size_t j = 0; j <
M; ++j) ret.
Data[i][j] =
Data[i][j] + right.
Data[i][j];
167 for(
size_t i = 0; i <
N; ++i){
168 for(
size_t j = 0; j <
M; ++j) ret.
Data[i][j] =
Data[i][j] + right;
177 static_assert(
N == right.
N,
"Matrix Size Error");
178 static_assert(
M == right.
M,
"Matrix Size Error");
180 for(
size_t i = 0; i <
N; ++i){
181 for(
size_t j = 0; j <
M; ++j) ret.
Data[i][j] =
Data[i][j] - right.
Data[i][j];
191 for(
size_t i = 0; i <
N; ++i){
192 for(
size_t j = 0; j <
M; ++j) ret.
Data[i][j] =
Data[i][j] - right;
200 template <
size_t Nright,
size_t Mright,
typename Tright>
202 static_assert(
N == right.
M,
"Matrix Size Error");
204 for(
size_t k = 0; k < right.
N; ++k){
205 for(
size_t i = 0; i <
N; ++i){
206 for(
size_t j = 0; j <
M; ++j) ret.Data[k][j] +=
Data[i][j]*right.
Data[k][i];
217 for(
size_t i = 0; i <
N; ++i){
218 for(
size_t j = 0; j <
M; ++j) ret.
Data[i][j] =
Data[i][j]*right;
228 for(
size_t i = 0; i <
N; ++i){
229 for(
size_t j = 0; j <
M; ++j) ret.
Data[i][j] =
Data[i][j]/right;
238 static_assert(this->
N == right.
N,
"Matrix Size Error");
239 static_assert(this->
M == right.
M,
"Matrix Size Error");
240 for(
size_t i = 0; i <
N; ++i){
241 for(
size_t j = 0; j <
M; ++j) this->
Data[i][j] = this->
Data[i][j] + right.
Data[i][j];
250 for(
size_t i = 0; i <
N; ++i){
251 for(
size_t j = 0; j <
M; ++j) this->
Data[i][j] = this->
Data[i][j] + right;
260 static_assert(this->
N == right.
N,
"Matrix Size Error");
261 static_assert(this->
M == right.
M,
"Matrix Size Error");
262 for(
size_t j = 0; j <
M; ++j){
263 for(
size_t i = 0; i <
N; ++i) this->
Data[i][j] = this->
Data[i][j] - right.
Data[i][j];
272 for(
size_t i = 0; i <
N; ++i){
273 for(
size_t j = 0; j <
M; ++j) this->
Data[i][j] = this->
Data[i][j] - right;
283 for(
size_t i = 0; i <
N; ++i){
284 for(
size_t j = 0; j <
M; ++j) A.
Data[i][j] =
Data[i][j];
287 for(
size_t k = 1; k < right; ++k) ret = ret*A;
295 static_assert(
N == right.
N,
"Matrix Size Error");
296 static_assert(
M == right.
M,
"Matrix Size Error");
298 for(
size_t i = 0; i <
N; ++i){
299 for(
size_t j = 0; j <
M; ++j) ret.
Data[i][j] =
Data[i][j]*right.
Data[i][j];
308 static_assert(
N == right.
N,
"Matrix Size Error");
309 static_assert(
M == right.
M,
"Matrix Size Error");
311 for(
size_t i = 0; i <
N; ++i){
312 for(
size_t j = 0; j <
M; ++j) ret.
Data[i][j] =
Data[i][j]/right.
Data[i][j];
338 return Data[n-1][m-1];
346 return Data[n-1][m-1];
354 for(
size_t i = 0; i < right.
N; ++i){
355 for(
size_t j = 0; j < right.
M; ++j) ret.
Data[i][j] = left + right.
Data[i][j];
365 for(
size_t i = 0; i < right.
N; ++i){
366 for(
size_t j = 0; j < right.
M; ++j) ret.
Data[i][j] = left - right.
Data[i][j];
376 for(
size_t i = 0; i < right.
N; ++i){
377 for(
size_t j = 0; j < right.
M; ++j) ret.
Data[i][j] = right.
Data[i][j]*left;
384 template<
typename T1,
typename... T2>
385 constexpr void Set(
const T1& u1,
const T2&... u2){
388 Data[Nindex][Mindex] = (TT)u1;
396 constexpr void Set(){
404 template<
typename T1,
typename... T2>
405 constexpr void Get(T1& u1, T2&... u2){
408 u1 =
Data[Nindex][Mindex];
416 constexpr void Get(){
424 constexpr void LoadArray(
const std::array<TT, MM>& Array){
427 for(
size_t j = 0; j <
M; ++j)
Data[0][j] = Array[j];
435 for(
size_t j = 0; j <
M; ++j) Array[j] =
Data[0][j];
440 constexpr void LoadArray(
const std::array<std::array<TT, NN>, MM>& Array){
443 for(
size_t i = 0; i <
N; ++i){
444 for(
size_t j = 0; j <
M; ++j)
Data[i][j] = Array[j][i];
452 static_assert(VM < MM);
453 for(
size_t i = 0; i < VM; ++i){
462 constexpr void SetElem(
size_t m,
size_t n, TT val){
464 Data[n-1][m-1] = val;
471 constexpr TT
GetElem(
size_t m,
size_t n)
const {
473 return Data[n-1][m-1];
482 Data[n-1][m-1] = val;
491 return Data[n-1][m-1];
502 for(
size_t i = 0; i < VM; ++i){
516 for(
size_t i = 0; i < HN; ++i){
529 for(
size_t i = 0; i < VM; ++i){
541 for(
size_t i = 0; i < HN; ++i){
549 for(
size_t i = 0; i <
N; ++i){
550 for(
size_t j = 0; j <
M; ++j)
Data[i][j] = u;
581 printf(
"%s = [ %zu x %zu ]\n", varname.c_str(), u.
N, u.
M);
589 printf(
"%s = \n", varname.c_str());
590 for(
size_t j = 0; j < u.
M; ++j){
592 for(
size_t i = 0; i < u.
N; ++i){
594 if constexpr(std::is_same_v<TT, std::complex<double>> || std::is_same_v<TT, std::complex<float>>){
597 printf(format.c_str(), u.
Data[i][j].real());
599 if(0.0 <= u.
Data[i][j].imag()){
604 printf( format.c_str(), std::abs(u.
Data[i][j].imag()) );
607 printf(format.c_str(), u.
Data[i][j]);
622 if constexpr(std::is_same_v<TT, double> || std::is_same_v<TT, float>){
628 if constexpr(std::is_same_v<TT, int>){
634 if constexpr(std::is_same_v<TT, long>){
640 if constexpr(std::is_same_v<TT, std::complex<double>> || std::is_same_v<TT, std::complex<float>>){
664 static_assert(NN == MM,
"Matrix Size Error");
666 if constexpr(std::is_same_v<TT, std::complex<double>> || std::is_same_v<TT, std::complex<float>>){
668 for(
size_t i = 0; i <
N; ++i) ret.
SetElem(i+1,i+1, std::complex(1.0,0.0));
671 for(
size_t i = 0; i <
N; ++i) ret.
SetElem(i+1,i+1, 1);
685 static_assert(NN == 1,
"Matrix Size Error");
687 for(
size_t j = 1; j <=
M; ++j) ret[j] = j;
696 for(
size_t j = 0; j < U.
M; ++j){
697 for(
size_t i = 0; i < U.
N; ++i) y.Data[j][i] = U.
Data[i][j];
706 static_assert(U.
N == U.
M,
"Matrix Size Error");
708 for(
size_t i = 0; i < U.
N; ++i) y += (TT)U.
Data[i][i];
716 static_assert(U.
N == U.
M,
"Matrix Size Error");
718 for(
size_t i = 0; i < U.
N; ++i) y *= U.
Data[i][i];
726 constexpr size_t K = std::min(NN,MM);
728 for(
size_t i = 0; i < K; ++i) y.
Data[0][i] = U.
Data[i][i];
737 for(
size_t i = 0; i < U.
N; ++i){
738 for(
size_t j = 0; j < U.
M; ++j) y.Data[0][j] += U.
Data[i][j];
748 for(
size_t i = 0; i < U.
N; ++i){
749 for(
size_t j = 0; j < U.
M; ++j) y.Data[i][0] += U.
Data[i][j];
766 static_assert( (u.
N == 1)||(u.
M == 1),
"Input is NOT vector." );
771 for(
size_t i = 1; i < u.
N; ++i)
if(u.
Data[k][0] < u.
Data[i][0]) k = i;
776 for(
size_t i = 1; i < u.
M; ++i)
if(u.
Data[0][k] < u.
Data[0][i]) k = i;
786 static_assert( (u.
N == 1)||(u.
M == 1),
"Input is NOT vector." );
791 for(
size_t i = 1; i < u.
N; ++i)
if(fabs(u.
Data[k][0]) < fabs(u.
Data[i][0])) k = i;
796 for(
size_t i = 1; i < u.
M; ++i)
if(fabs(u.
Data[0][k]) < fabs(u.
Data[0][i])) k = i;
806 static_assert( (u.
N == 1)||(u.
M == 1),
"Input is NOT vector." );
810 for(
size_t i = 1; i < u.
N; ++i)
if(u.
Data[k][0] < u.
Data[i][0]) k = i;
814 for(
size_t i = 1; i < u.
M; ++i)
if(u.
Data[0][k] < u.
Data[0][i]) k = i;
823 static_assert( (u.
N == 1)||(u.
M == 1),
"Input is NOT vector." );
827 for(
size_t i = 1; i < u.
N; ++i)
if(fabs(u.
Data[k][0]) < fabs(u.
Data[i][0])) k = i;
831 for(
size_t i = 1; i < u.
M; ++i)
if(fabs(u.
Data[0][k]) < fabs(u.
Data[0][i])) k = i;
841 for(
size_t i = 0; i < U.
N; ++i){
842 for(
size_t j = 0; j < U.
M; ++j){
843 if(epsilon < std::abs(U.
Data[i][j])) ++ret;
853 static_assert(NN == MM,
"Matrix Size Error");
866 for(
size_t i=0;i<U.
N;i++) y.Data[i][0] = U.
Data[i][m-1];
875 static_assert(U.
N == v.
N,
"Matrix Size Error");
876 static_assert(v.
M == 1,
"Input is NOT vector.");
878 for(
size_t i=0;i<U.
N;i++) U.
Data[i][m-1] = v.
Data[i][0];
885 constexpr friend void setrow(
Matrix& U,
const std::array<TT, NN>& v,
size_t m){
886 static_assert(U.
N == NN,
"Matrix Size Error");
888 for(
size_t i=0;i<U.
N;i++) U.
Data[i][m-1] = v.at(i);
911 constexpr friend void fillrow(
Matrix& U, TT a,
size_t m,
size_t n1,
size_t n2){
916 for(
size_t i=n1;i<=n2;i++) U.
Data[i-1][m-1] = a;
926 for(
size_t i=0;i<U.
M;i++) y.Data[0][i] = U.
Data[n-1][i];
935 static_assert(U.
M == v.
M,
"Matrix Size Error");
936 static_assert(v.
N == 1,
"Input is NOT vector.");
938 for(
size_t i=0;i<U.
M;i++) U.
Data[n-1][i] = v.
Data[0][i];
946 static_assert(U.
M == MM,
"Matrix Size Error");
948 for(
size_t i=0;i<U.
M;i++) U.
Data[n-1][i] = v.at(i);
976 for(
size_t i=m1;i<=m2;i++) U.
Data[n-1][i-1] = a;
989 for(
size_t i = 0; i < VM; ++i) U.
Data[n-1][m-1+i] = v.
Data[0][i];
1002 for(
size_t i = 0; i < VM; ++i) v.
Data[0][i] = U.
Data[n-1][m-1+i];
1011 template <
size_t VN>
1015 for(
size_t i = 0; i < VN; ++i) h.
Data[0][i] = U.
Data[n-1+i][m-1];
1025 template <
size_t SN,
size_t SM>
1027 static_assert(SN <= NN);
1028 static_assert(SM <= MM);
1032 for(
size_t i = 1; i <= SN; ++i){
1045 template <
size_t SN,
size_t SM>
1047 static_assert(SN <= NN);
1048 static_assert(SM <= MM);
1052 for(
size_t i = 1; i <= SN; ++i){
1063 static_assert(U.
M == v.
M,
"Matrix and Vector Size Error");
1065 for(
size_t i=0;i<U.
M;i++){
1076 static_assert(U.
M == v.
M,
"Matrix and Vector Size Error");
1079 for(
size_t i=1;i<=U.
M;i++){
1091 for(
size_t i = 2; i <= U.
M; ++i){
1103 for(
size_t i = 0; i < a; ++i){
1114 for(
size_t i = 2; i <= U.
M; ++i){
1126 for(
size_t i = 0; i < a; ++i){
1137 for(
size_t i = 2; i <= U.
M; ++i){
1149 for(
size_t i = 0; i < a; ++i){
1160 for(
size_t i = 2; i <= U.
M; ++i){
1172 for(
size_t i = 0; i < a; ++i){
1184 for(
size_t i = 0; i < MM; ++i){
1185 for(
size_t j = i + k; j < NN; ++j){
1211 if constexpr(std::is_same_v<TT,std::complex<double>>){
1213 if constexpr(NN == 1){
1216 }
else if constexpr(MM == 1){
1222 if constexpr(NN == 1){
1225 }
else if constexpr(MM == 1){
1233 return std::sqrt(ret[1]);
1243 static_assert(A.
N == A.
M,
"Matrix Size Error");
1245 size_t perm_count = 0;
1246 double max_buff = 0;
1250 for(
size_t i = 0; i < X.
N; ++i) v.
Data[0][i] = i + 1;
1253 for(
size_t j = 0; j < X.
N-1; ++j){
1256 max_buff = std::abs(X.
Data[j][j]);
1257 for(
size_t i = j + 1; i < X.
M; ++i){
1258 if(max_buff < std::abs(X.
Data[j][i])){
1260 max_buff = std::abs(X.
Data[j][i]);
1269 if( fabs(X.
Data[j][j]) < X.epsilon )
continue;
1273 for(
size_t i = j + 1; i < X.
M; ++i){
1275 for(
size_t l = j + 1; l < X.
N; ++l){
1282 for(
size_t j = 0; j < X.
N; ++j){
1283 for(
size_t i = j; i < X.
M; ++i){
1290 for(
size_t i = 0; i <= j; ++i) U.
Data[j][i] = X.
Data[j][i];
1293 if(perm_count % 2 == 0){
1306 static_assert(A.
N == A.
M,
"Matrix Size Error");
1310 for(
size_t i = 1; i < A.
N; ++i){
1311 for(
size_t j = 0; j <= i; ++j){
1312 TT lld = A.
Data[j][i];
1313 for(
size_t k = 0; k < j; ++k){
1338 constexpr size_t K = std::min(NN,MM);
1348 if constexpr(std::is_same_v<TT, std::complex<double>>){
1351 e[1] = std::complex(1.0, 0.0);
1352 for(
size_t k = 1; k <= K; ++k){
1357 if(k != 1) I.
SetElement(MM - (k - 2), MM - (k - 2), 0);
1358 if(std::abs(vHv[1]) < epsilon) vHv[1] = epscomp;
1359 H = I - 2.0*v*
Htp(v)/vHv[1];
1362 for(
size_t i = 1; i < k; ++i) H.
SetElement(i,i, 1);
1371 for(
size_t k = 1; k <= K; ++k){
1376 if(k != 1) I.
SetElement(MM - (k - 2), MM - (k - 2), 0);
1377 if( 0 <= vTv[1] && vTv[1] < epsilon) vTv[1] = epsilon;
1378 if(-epsilon <= vTv[1] && vTv[1] < 0 ) vTv[1] = -epsilon;
1379 H = I - 2.0*v*
tp(v)/vTv[1];
1382 for(
size_t i = 1; i < k; ++i) H.
SetElement(i,i, 1);
1396 constexpr friend void SVD(
const Matrix<NN,MM,TT>& A,
Matrix<MM,MM,TT>& U,
Matrix<NN,MM,TT>& S,
Matrix<NN,NN,TT>& V){
1397 constexpr size_t LoopMax = 100*std::max(NN,MM);
1403 double E = 0, F = 0;
1412 for(
size_t l = 0; l < LoopMax; ++l){
1413 if(Error < epsilon)
break;
1416 QR(
tp(Snm), Qn, Smn);
1421 if(-epsilon < F && F < epsilon) F = 1;
1429 for(
size_t k = 1; k <= std::min(NN,MM); ++k){
1442 constexpr friend std::tuple<Matrix<MM,MM,TT>,
Matrix<NN,MM,TT>,
Matrix<NN,NN,TT>>
SVD(
const Matrix<NN,MM,TT>& A){
1455 static_assert(A.
N == A.
M,
"Matrix Size Error");
1460 for(
size_t k = 0; k < ITERATION_MAX; ++k){
1464 if(std::abs(Tk.
GetElement(1,A.
M)) < A.epsilon)
break;
1475 static_assert(A.
N == A.
M,
"Matrix Size Error");
1476 static_assert(b.
M == A.
M,
"Matrix and Vector Size Error");
1477 static_assert(b.
N == 1,
"Input is NOT vector.");
1479 if constexpr(MM == 1){
1493 d.Data[0][0] = bb.Data[0][0];
1494 for(
size_t i = 1; i < A.
N; ++i){
1495 for(
size_t j = 0; j <= i - 1; ++j) buff += L.Data[j][i]*d.Data[0][j];
1496 d.Data[0][i] = (bb.Data[0][i] - buff);
1500 x.
Data[0][A.
N-1] = d.Data[0][A.
N-1]/U.Data[A.
N-1][A.
N-1];
1501 for(
int k = A.
N - 2; 0 <= k; --k){
1502 for(
size_t j = (
size_t)k + 1; j < A.
N; ++j){
1503 buff += U.Data[j][k]*x.
Data[0][j];
1505 x.
Data[0][k] = (d.Data[0][k] - buff)/U.Data[k][k];
1526 static_assert(U.
N == U.
M,
"Matrix Size Error");
1527 static_assert(b.
M == U.
M,
"Matrix and Vector Size Error");
1528 static_assert(b.
N == 1,
"Input is NOT vector.");
1530 if constexpr(MM == 1){
1540 for(
int k = U.
N - 2; 0 <= k; --k){
1541 for(
size_t j = (
size_t)k + 1; j < U.
N; ++j){
1554 static_assert(A.
N == A.
M,
"Matrix Size Error");
1565 return (TT)sign*
prod(U);
1572 static_assert(A.
N == A.
M,
"Matrix Size Error");
1576 for(
size_t n = 1; n <= A.
N; ++n){
1594 for(
size_t j = k + 1; j <= A.
N; ++j){
1601 for(
size_t n = 1; n <= k; ++n){
1613 static_assert(A.
N == A.
M,
"Matrix Size Error");
1622 static_assert(U.
N == U.
M,
"Matrix Size Error");
1623 static_assert(Uinv.
N == Uinv.
M,
"Matrix Size Error");
1624 static_assert(U.
N == Uinv.
N,
"Matrix Size Error");
1627 for(
size_t n = 1; n <= U.
N; ++n){
1640 static_assert(U.
N == U.
M,
"Matrix Size Error");
1641 static_assert(Uinv.
N == Uinv.
M,
"Matrix Size Error");
1642 static_assert(U.
N == Uinv.
N,
"Matrix Size Error");
1647 for(
size_t j = k + 1; j <= U.
N; ++j){
1653 for(
size_t n = 1; n <= k; ++n){
1665 static_assert(A.
N < A.
M,
"Matrix Size Error");
1676 return inv(A2, k)*At;
1683 static_assert(A.
M < A.
N,
"Matrix Size Error");
1694 return At*
inv(A2, k);
1702 static_assert(U.
N == U.
M,
"Matrix Size Error");
1717 Matrix<A.
N,A.N,TT> L = I, R = I, X = I, cX;
1718 for(
size_t i = 1; i <= Order; ++i){
1719 c = c*(TT)(Order - i + 1)/(TT)(i*(2*Order - i + 1));
1732 for(
size_t i = 0; i < (size_t)e + 1; ++i){
1745 static_assert(U.
N == U.
M,
"Matrix Size Error");
1746 const TT h = T/((TT)(2*DIV));
1750 for(
size_t i = 1; i <= DIV; ++i){
1751 t = h*(TT)(2*i - 1);
1754 for(
size_t i = 1; i <= DIV - 1; ++i){
1766 for(
size_t i = 0; i < U.
N; ++i){
1767 for(
size_t j = 0; j < U.
M; ++j) Y.
Data[i][j] = std::exp(U.
Data[i][j]);
1777 for(
size_t i = 0; i < U.
N; ++i){
1778 for(
size_t j = 0; j < U.
M; ++j) Y.
Data[i][j] = std::log(U.
Data[i][j]);
1788 for(
size_t i = 0; i < U.
N; ++i){
1789 for(
size_t j = 0; j < U.
M; ++j) Y.
Data[i][j] = std::abs(U.
Data[i][j]);
1799 for(
size_t i = 0; i < U.
N; ++i){
1800 for(
size_t j = 0; j < U.
M; ++j) Y.
Data[i][j] = std::sqrt(U.
Data[i][j]);
1809 for(
size_t i = 0; i < U.
N; ++i){
1810 for(
size_t j = 0; j < U.
M; ++j) Y.
Data[i][j] = std::sqrt(U.
Data[i][j]);
1819 for(
size_t i = 0; i < U.
N; ++i){
1820 for(
size_t j = 0; j < U.
M; ++j) Y.
Data[i][j] = std::tanh(U.
Data[i][j]);
1829 static_assert(std::is_same_v<TT, std::complex<double>>,
"Matrix Type Error");
1831 for(
size_t i = 0; i < U.
N; ++i){
1832 for(
size_t j = 0; j < U.
M; ++j) Y.
Data[i][j] = U.
Data[i][j].real();
1841 static_assert(
N == NN,
"Matrix Size Error");
1842 static_assert(
M == MM,
"Matrix Size Error");
1843 for(
size_t i = 0; i <
N; ++i){
1844 for(
size_t j = 0; j <
M; ++j)
Data[i][j] = std::complex(U.
Data[i][j], 0.0);
1852 static_assert(std::is_same_v<TT, std::complex<double>>,
"Matrix Type Error");
1854 for(
size_t i = 0; i < U.
N; ++i){
1855 for(
size_t j = 0; j < U.
M; ++j) Y.
Data[i][j] = U.
Data[i][j].imag();
1864 static_assert(std::is_same_v<TT, std::complex<double>>,
"Matrix Type Error");
1866 for(
size_t i = 0; i < U.
N; ++i){
1867 for(
size_t j = 0; j < U.
M; ++j) Y.
Data[i][j] = std::abs(U.
Data[i][j]);
1876 static_assert(std::is_same_v<TT, std::complex<double>>,
"Matrix Type Error");
1878 for(
size_t i = 0; i < U.
N; ++i){
1879 for(
size_t j = 0; j < U.
M; ++j) Y.
Data[i][j] = std::arg(U.
Data[i][j]);
1888 static_assert(std::is_same_v<TT, std::complex<double>>,
"Matrix Type Error");
1890 for(
size_t i = 0; i < U.
N; ++i){
1891 for(
size_t j = 0; j < U.
M; ++j) Y.
Data[i][j] = std::conj(U.
Data[i][j]);
1900 static_assert(std::is_same_v<TT, std::complex<double>>,
"Matrix Type Error");
1908 static_assert(NN == MM,
"Matrix Size Error");
1909 constexpr size_t LoopMax = 100*NN;
1912 std::complex<double> a, b, c, d, mu;
1914 if constexpr(std::is_same_v<TT, std::complex<double>>){
1923 for(
size_t k = 1; k < LoopMax; ++k){
1929 mu = ( (a + d) + std::sqrt((a + d)*(a + d) - 4.0*(a*d - b*c)) )/2.0;
1935 if(std::abs(std::abs(
tr(Q)) - (
double)NN) < epsilon)
break;
1945 static_assert(NN == MM,
"Matrix Size Error");
1946 constexpr size_t LoopMax = 100*std::max(NN,MM);
1949 if constexpr(std::is_same_v<TT, std::complex<double>>){
1960 for(
size_t k = 1; k < LoopMax; ++k){
1974 template<
size_t PP,
size_t QQ>
1980 for(
size_t j = 1; j <= MM; ++j){
1982 for(
size_t i = 1; i <= NN; ++i){
1999 for(
size_t i = 1; i <= NN; ++i){
2001 for(
size_t j = 1; j <= MM; ++j){
2015 template<
size_t PP,
size_t QQ>
2017 static_assert(NN == 1);
2018 static_assert(PP*QQ == MM);
2022 for(
size_t i = 1; i <= PP; ++i){
2024 for(
size_t j = 1; j <= QQ; ++j){
2036 template<
size_t PP,
size_t QQ>
2044 static constexpr double epsilon = 1e-12;
2045 static constexpr std::complex<double> epscomp = std::complex(1e-12, 1e-12);
2046 static constexpr size_t ITERATION_MAX = 10000;
2053 static constexpr TT sgn(TT u){
2055 if constexpr(std::is_same_v<TT, std::complex<double>>){
2057 if(u == std::complex(0.0, 0.0)){
2058 ret = std::complex(0.0, 0.0);
2060 ret = u/std::abs(u);
2074 static constexpr size_t N = NN;
2075 static constexpr size_t M = MM;
#define arcs_assert(a)
ARCS用assertマクロ a : assert条件
Definition ARCSassert.hh:17
行列/ベクトル計算クラス(テンプレート版)
Definition Matrix.hh:44
constexpr friend void Cholesky(const Matrix &A, Matrix &L, Matrix &D)
修正コレスキー分解(LDL^T版)
Definition Matrix.hh:1305
constexpr friend Matrix< 1, NN, std::complex< double > > eigen(const Matrix< NN, MM, TT > &U)
固有値を返す関数
Definition Matrix.hh:1907
constexpr auto operator+(const Matrix &right) const
行列加算演算子 (行列同士の加算の場合)
Definition Matrix.hh:152
constexpr friend void setrow(Matrix &U, const Matrix< NN, 1, TT > &v, size_t m)
指定した行を横ベクトルで上書きする関数
Definition Matrix.hh:874
constexpr friend void sqrte(const Matrix &U, Matrix &Y)
行列要素の平方根を参照で返す関数
Definition Matrix.hh:1808
constexpr void SetElem(size_t m, size_t n, TT val)
指定した要素番号に値を設定する関数 (並び順逆版)
Definition Matrix.hh:462
constexpr friend Matrix shiftright(const Matrix &U)
行列の各要素を右に1列分シフトする関数(最左段の列はゼロになる)
Definition Matrix.hh:1135
constexpr auto operator*(const TT &right) const
行列乗算演算子 (行列*スカラーの場合)
Definition Matrix.hh:215
constexpr friend Matrix< MM, NN, std::complex< double > > Htp(const Matrix< NN, MM, TT > &U)
エルミート転置行列を返す関数
Definition Matrix.hh:1899
constexpr friend void setrow(Matrix &U, const std::array< TT, NN > &v, size_t m)
指定した行を横ベクトル(std::array)で上書きする関数
Definition Matrix.hh:885
constexpr TT GetElement(size_t n, size_t m) const
指定した要素番号の値を返す関数
Definition Matrix.hh:489
constexpr friend std::tuple< Matrix< MM, MM, TT >, Matrix< NN, MM, TT >, Matrix< NN, NN, TT > > SVD(const Matrix< NN, MM, TT > &A)
SVD特異値分解(タプルで返す版) 補足:MATLABとはU,S,Vの符号関係が入れ替わっている場合があるが正常なSVDであることは確認済み
Definition Matrix.hh:1442
constexpr friend void setcolumn(Matrix &U, const Matrix< 1, MM, TT > &v, size_t n)
指定した列を縦ベクトルで上書きする関数
Definition Matrix.hh:934
constexpr friend void swaprow(Matrix &U, size_t m1, size_t m2)
指定した行と行を入れ替える関数
Definition Matrix.hh:895
constexpr friend Matrix< MM, NN, TT > lpinv(const Matrix &A)
左擬似逆行列を返す関数 (Aが縦長行列の場合)
Definition Matrix.hh:1664
constexpr friend Matrix< NN, MM, std::complex< double > > conje(const Matrix &U)
複素数行列要素の共役を返す関数
Definition Matrix.hh:1887
constexpr friend Matrix< 1, std::min(NN, MM), TT > diag(const Matrix &U)
行列の対角要素を縦ベクトルで返す関数
Definition Matrix.hh:725
constexpr friend void inv_upper_tri(const Matrix &U, size_t k, Matrix &Uinv)
上三角行列の逆行列を返す関数(左上小行列のサイズ指定版)
Definition Matrix.hh:1639
friend void PrintMatSize_Macro(const Matrix &u, const std::string &varname)
行列のサイズの表示 (この関数はマクロを介して呼ばれることを想定している)
Definition Matrix.hh:580
constexpr friend enum LUperm LU(const Matrix &A, Matrix &L, Matrix &U, Matrix< 1, MM, int > &v)
LU分解
Definition Matrix.hh:1242
constexpr friend Matrix integral_expm(const Matrix &U, const TT T, const size_t DIV, const size_t P)
指数行列の数値定積分[0,T]をする関数
Definition Matrix.hh:1744
constexpr Matrix< HN, 1, TT > GetHorizontalVec(size_t n, size_t m)
指定した先頭位置から横ベクトルを抜き出して返す関数
Definition Matrix.hh:513
static constexpr size_t N
行列の幅(列の数, 横)
Definition Matrix.hh:2074
constexpr friend double sumall(const Matrix &U)
行列の全要素を加算して出力する関数
Definition Matrix.hh:757
constexpr auto & operator+=(const Matrix &right)
行列加算代入演算子 (行列=行列+行列の場合)
Definition Matrix.hh:237
constexpr friend Matrix< 1, NN *MM, TT > vec(const Matrix< NN, MM, TT > &U)
vec作用素(行列→縦ベクトル)
Definition Matrix.hh:1994
constexpr TT operator()(size_t m, size_t n) const
行列括弧演算子(行列の(m,n)要素の値を返す。GetElem(m,n)と同じ意味。ただしサイズチェックは行わない。)
Definition Matrix.hh:337
constexpr friend Matrix operator-(const TT &left, const Matrix &right)
行列減算演算子 (スカラー-行列の場合)
Definition Matrix.hh:363
constexpr auto operator-(const Matrix &right) const
行列減算演算子 (行列同士の減算の場合)
Definition Matrix.hh:176
friend void PrintMat_Macro(const Matrix &u, const std::string &varname)
行列の要素を表示 (書式指定なし版,この関数はマクロを介して呼ばれることを想定している)
Definition Matrix.hh:619
constexpr auto operator*(const Matrix< Nright, Mright, Tright > &right) const
行列乗算演算子 (行列同士の乗算の場合)
Definition Matrix.hh:201
constexpr auto operator%(const Matrix &right) const
行列アダマール除算演算子 (行列の要素ごとの除算)
Definition Matrix.hh:307
constexpr Matrix< 1, VM, TT > GetVerticalVec(size_t n, size_t m)
指定した先頭位置から縦ベクトルを抜き出して返す関数
Definition Matrix.hh:499
constexpr friend size_t maxidx(const Matrix &u)
ベクトル要素の最大値の要素番号を返す関数
Definition Matrix.hh:805
constexpr friend void setcolumn(Matrix &U, const std::array< TT, MM > &v, size_t n)
指定した列を縦ベクトル(std::array)で上書きする関数
Definition Matrix.hh:945
constexpr friend void fillrow(Matrix &U, TT a, size_t m, size_t n1, size_t n2)
m行目のn1列目からm2列目を数値aで埋める関数 (n1 <= n2 であること)
Definition Matrix.hh:911
constexpr Matrix(const TT InitValue)
コンストラクタ(任意初期値版)
Definition Matrix.hh:63
constexpr friend Matrix shiftdown(const Matrix &U, const size_t a)
行列の各要素を下にa行分シフトする関数(最上段の行はゼロになる)
Definition Matrix.hh:1124
constexpr TT & operator()(size_t m, size_t n)
行列括弧演算子(行列の(m,n)要素に値を設定する。SetElem(m,n,val)と同じ意味。ただしサイズチェックは行わない。)
Definition Matrix.hh:345
constexpr Matrix(const Matrix &right)
コピーコンストラクタ
Definition Matrix.hh:104
constexpr void Set(const T1 &u1, const T2 &... u2)
行列要素に値を設定する関数
Definition Matrix.hh:385
constexpr friend Matrix shiftleft(const Matrix &U)
行列の各要素を左に1列分シフトする関数(最右段の列はゼロになる)
Definition Matrix.hh:1158
constexpr friend void swapcolumn(Matrix &U, size_t n1, size_t n2)
指定した列と列を入れ替える関数
Definition Matrix.hh:955
constexpr friend Matrix sqrte(const Matrix &U)
行列要素の平方根を返す関数
Definition Matrix.hh:1797
constexpr friend Matrix expm(const Matrix &U, size_t Order)
行列指数関数 e^(U)
Definition Matrix.hh:1701
constexpr void LoadArray(const std::array< std::array< TT, NN >, MM > &Array)
2次元std::array配列を読み込む関数
Definition Matrix.hh:440
constexpr friend Matrix loge(const Matrix &U)
行列要素の自然対数を返す関数
Definition Matrix.hh:1775
constexpr friend void setsubmatrix(Matrix< NN, MM, TT > &U, size_t n, size_t m, const Matrix< SN, SM, TT > &A)
小行列を行列の指定位置に上書きする関数
Definition Matrix.hh:1046
constexpr friend Matrix< MM, NN, TT > rpinv(const Matrix &A, size_t k)
右擬似逆行列を返す関数 (Aが横長行列の場合, 左上小行列のサイズ指定版)
Definition Matrix.hh:1691
constexpr TT GetElem(size_t m, size_t n) const
指定した要素番号の値を返す関数 (並び順逆版)
Definition Matrix.hh:471
constexpr auto operator-(const TT &right) const
行列減算演算子 (行列-スカラーの場合)
Definition Matrix.hh:189
constexpr friend Matrix< MM, NN, TT > tp(const Matrix< NN, MM, TT > &U)
転置行列を返す関数
Definition Matrix.hh:694
constexpr friend void setvvector(Matrix< NN, MM, TT > &U, const Matrix< 1, VM, TT > &v, size_t n, size_t m)
指定した列を縦ベクトルで指定位置に上書きする関数
Definition Matrix.hh:986
constexpr auto operator+(void) const
単項プラス演算子
Definition Matrix.hh:131
constexpr auto operator^(const size_t &right) const
行列べき乗演算子
Definition Matrix.hh:281
constexpr void LoadShortVector(const Matrix< 1, VM, TT > &v)
短い縦ベクトルを読み込み,且つ残りはゼロで埋める関数
Definition Matrix.hh:451
constexpr friend Matrix< 1, NN, std::complex< double > > eigenvec(const Matrix< NN, MM, TT > &U)
最大固有値の固有ベクトルを返す関数
Definition Matrix.hh:1944
constexpr friend Matrix< NN, MM, double > reale(const Matrix &U)
複素数行列要素の実数部を返す関数
Definition Matrix.hh:1828
constexpr friend TT prod(const Matrix &U)
行列の対角要素の総積を返す関数
Definition Matrix.hh:715
static constexpr Matrix ones(void)
m行n列の要素がすべて1の行列を返す関数
Definition Matrix.hh:655
constexpr friend Matrix shiftup(const Matrix &U)
行列の各要素を上に1行分シフトする関数(最下段の行はゼロになる)
Definition Matrix.hh:1089
constexpr auto & operator-=(const TT &right)
行列減算代入演算子 (行列=行列-スカラーの場合)
Definition Matrix.hh:271
static constexpr Matrix< PP, QQ, TT > vecinv(const Matrix< NN, MM, TT > &v)
vec作用素の逆(縦ベクトル→行列)
Definition Matrix.hh:2037
constexpr friend Matrix shiftright(const Matrix &U, const size_t a)
行列の各要素を右にa列分シフトする関数(最左段の列はゼロになる)
Definition Matrix.hh:1147
constexpr friend void SVD(const Matrix< NN, MM, TT > &A, Matrix< MM, MM, TT > &U, Matrix< NN, MM, TT > &S, Matrix< NN, NN, TT > &V)
SVD特異値分解(引数で返す版) 補足:MATLABとはU,S,Vの符号関係が入れ替わっている場合があるが正常なSVDであることは確認済み
Definition Matrix.hh:1396
constexpr friend Matrix tanhe(const Matrix &U)
行列要素のtanhを返す関数
Definition Matrix.hh:1817
constexpr friend Matrix shiftup(const Matrix &U, const size_t a)
行列の各要素を上にa行分シフトする関数(最下段の行はゼロになる)
Definition Matrix.hh:1101
constexpr auto operator&(const Matrix &right) const
行列アダマール積演算子 (行列の要素ごとの乗算)
Definition Matrix.hh:294
constexpr friend TT euclidnorm(const Matrix< NN, MM, TT > &v)
ベクトルのユークリッドノルムを返す関数
Definition Matrix.hh:1209
constexpr friend void inv_upper_tri(const Matrix &U, Matrix &Uinv)
上三角行列の逆行列を返す関数
Definition Matrix.hh:1621
constexpr friend size_t rank(const Matrix &A)
行列のランクを返す関数
Definition Matrix.hh:852
constexpr friend Matrix inv(const Matrix &A, size_t k)
逆行列を返す関数 (正則チェック無し, 左上小行列のサイズ指定版)
Definition Matrix.hh:1588
constexpr friend Matrix orderrow(const Matrix &U, const Matrix< 1, MM, int > &v)
並び替え記憶列ベクトルvの行番号に従って,入力行列Uの行を並び替える関数
Definition Matrix.hh:1062
constexpr TT operator[](size_t m) const
縦ベクトル添字演算子(縦ベクトルのm番目の要素の値を返す。GetElement(1,m)と同じ意味。ただしサイズチェックは行わない。)
Definition Matrix.hh:320
constexpr friend TT det(const Matrix &A)
行列式の値を返す関数
Definition Matrix.hh:1553
constexpr friend Matrix< MM, NN, TT > rpinv(const Matrix &A)
右擬似逆行列を返す関数 (Aが横長行列の場合)
Definition Matrix.hh:1682
constexpr friend Matrix< NN, 1, TT > sumcolumn(const Matrix &U)
列方向(縦方向)へ加算して横ベクトルを出力する関数
Definition Matrix.hh:746
constexpr void FillAll(TT u)
すべての要素を指定した値で埋める関数
Definition Matrix.hh:548
constexpr friend void getvvector(const Matrix< NN, MM, TT > &U, size_t n, size_t m, Matrix< 1, VM, TT > &v)
指定した列から縦ベクトルを指定位置から抽出する関数
Definition Matrix.hh:999
constexpr friend void fillcolumn(Matrix &U, TT a, size_t n, size_t m1, size_t m2)
n列目のm1行目からm2行目を数値aで埋める関数 (m1 <= m2 であること)
Definition Matrix.hh:971
constexpr TT & operator[](size_t m)
縦ベクトル添字演算子(縦ベクトルのm番目の要素に値を設定する。SetElement(1,n,val)と同じ意味。ただしサイズチェックは行わない。)
Definition Matrix.hh:328
constexpr friend TT tr(const Matrix &U)
行列のトレースを返す関数
Definition Matrix.hh:705
constexpr Matrix(std::initializer_list< TT > InitList)
コンストラクタ(初期化リスト版)
Definition Matrix.hh:73
constexpr friend TT absmax(const Matrix &u)
ベクトル要素の絶対値の最大値を返す関数
Definition Matrix.hh:785
constexpr friend Matrix operator*(const TT &left, const Matrix &right)
行列乗算演算子 (スカラー*行列の場合)
Definition Matrix.hh:374
constexpr auto operator+(const TT &right) const
行列加算演算子 (行列+スカラーの場合)
Definition Matrix.hh:165
constexpr void LoadArray(const std::array< TT, MM > &Array)
1次元std::array配列を縦ベクトルとして読み込む関数
Definition Matrix.hh:424
constexpr friend Matrix shiftdown(const Matrix &U)
行列の各要素を下に1行分シフトする関数(最上段の行はゼロになる)
Definition Matrix.hh:1112
LUperm
LU分解の際の並べ替えが偶数回/奇数回発生したことを返すための定義
Definition Matrix.hh:47
@ ODD
奇数
Definition Matrix.hh:48
@ EVEN
偶数
Definition Matrix.hh:49
constexpr friend Matrix< NN, MM, double > image(const Matrix &U)
複素数行列要素の虚数部を返す関数
Definition Matrix.hh:1851
constexpr friend Matrix operator+(const TT &left, const Matrix &right)
行列加算演算子 (スカラー+行列の場合)
Definition Matrix.hh:352
constexpr friend Matrix inv_with_check(const Matrix &A)
逆行列を返す関数 (正則チェック有り)
Definition Matrix.hh:1612
constexpr friend void QR(const Matrix< NN, MM, TT > &A, Matrix< MM, MM, TT > &Q, Matrix< NN, MM, TT > &R)
QR分解 補足:実数型のときMATLABとはQとRの符号関係が逆の場合があるが正常なQR分解であることは確認済み 補足:複素数型のときMATLABとは全く違う値が得られるが,正常なQR分解であることは確...
Definition Matrix.hh:1337
constexpr friend Matrix shiftleft(const Matrix &U, const size_t a)
行列の各要素を左にa列分シフトする関数(最右段の列はゼロになる)
Definition Matrix.hh:1170
constexpr friend Matrix< 1, MM, TT > sumrow(const Matrix &U)
行方向(横方向)へ加算して縦ベクトルを出力する関数
Definition Matrix.hh:735
constexpr void StoreArray(std::array< TT, MM > &Array) const
縦ベクトルを1次元std::array配列に書き込む関数
Definition Matrix.hh:432
constexpr friend Matrix gettriup(const Matrix &U, const size_t k)
行列のk番目より上の上三角部分を返す関数(下三角はゼロになる)
Definition Matrix.hh:1182
constexpr friend TT max(const Matrix &u)
ベクトル要素の最大値を返す関数
Definition Matrix.hh:765
constexpr friend Matrix< 1, MM, TT > solve(const Matrix &A, const Matrix< 1, MM, TT > &b)
Ax = bの形の線形連立1次方程式をxについて解く関数(戻り値として返す版)
Definition Matrix.hh:1515
constexpr friend void Schur(const Matrix< NN, MM, TT > &A, Matrix< NN, MM, TT > &Q, Matrix< NN, MM, TT > &U)
Schur分解
Definition Matrix.hh:1454
constexpr friend Matrix expe(const Matrix &U)
行列要素の指数関数を返す関数
Definition Matrix.hh:1764
static constexpr Matrix< NN, NN, TT > ident(void)
n行n列の単位行列を返す関数
Definition Matrix.hh:663
constexpr auto & operator+=(const TT &right)
行列加算代入演算子 (行列=行列+スカラーの場合)
Definition Matrix.hh:249
constexpr friend Matrix< MM, NN, TT > lpinv(const Matrix &A, size_t k)
左擬似逆行列を返す関数 (Aが縦長行列の場合, 左上小行列のサイズ指定版)
Definition Matrix.hh:1673
constexpr friend void Cholesky(const Matrix &A, Matrix &L)
修正コレスキー分解(LL^T版)
Definition Matrix.hh:1325
constexpr auto operator-(void) const
単項マイナス演算子
Definition Matrix.hh:141
static constexpr Matrix< NN, NN, TT > eye(void)
n行n列の単位行列を返す関数 (identのエイリアス)
Definition Matrix.hh:678
constexpr bool isEnabledSIMD(void)
MatrixクラスがSIMD命令が有効に設定されているかを返す関数
Definition Matrix.hh:573
constexpr auto & operator=(const Matrix &right)
行列代入演算子
Definition Matrix.hh:120
constexpr void SetHorizontalVec(Matrix< HN, 1, TT > h, size_t n, size_t m)
指定した先頭位置に横ベクトルを埋め込む関数
Definition Matrix.hh:539
constexpr friend TT infnorm(const Matrix &U)
行列の無限大ノルムを返す関数
Definition Matrix.hh:1202
static constexpr void vecinv(const Matrix< NN, MM, TT > &v, Matrix< PP, QQ, TT > &Y)
vec作用素の逆(縦ベクトル→行列)
Definition Matrix.hh:2016
constexpr void SetVerticalVec(Matrix< 1, VM, TT > v, size_t n, size_t m)
指定した先頭位置に縦ベクトルを埋め込む関数
Definition Matrix.hh:527
constexpr void real(const Matrix< NN, MM, double > &U)
複素数行列要素の実数部に値をセットする関数
Definition Matrix.hh:1840
constexpr friend Matrix< 1, MM, TT > getcolumn(const Matrix &U, size_t n)
指定した列から縦ベクトルとして抽出する関数
Definition Matrix.hh:923
static constexpr Matrix ramp(void)
単調増加の縦ベクトルを返す関数
Definition Matrix.hh:684
friend void PrintMatrix_Macro(const Matrix &u, const std::string &format, const std::string &varname)
行列の要素を表示 (書式指定あり版,この関数はマクロを介して呼ばれることを想定している)
Definition Matrix.hh:588
constexpr void SetElement(size_t n, size_t m, TT val)
指定した要素番号に値を設定する関数
Definition Matrix.hh:480
constexpr friend Matrix< NN *PP, MM *QQ, TT > Kronecker(const Matrix< NN, MM, TT > &Ul, const Matrix< PP, QQ, TT > &Ur)
クロネッカー積
Definition Matrix.hh:1975
constexpr friend Matrix< NN, 1, TT > getrow(const Matrix &U, size_t m)
指定した行から横ベクトルとして抽出する関数
Definition Matrix.hh:863
constexpr friend size_t nonzeroele(const Matrix &U)
行列の非ゼロ要素数を返す関数
Definition Matrix.hh:839
constexpr friend void gethvector(const Matrix< NN, MM, TT > &U, size_t m, size_t n, Matrix< VN, 1, TT > &h)
指定した行から横ベクトルを指定位置から抽出する関数
Definition Matrix.hh:1012
constexpr friend void getsubmatrix(const Matrix< NN, MM, TT > &U, size_t n, size_t m, Matrix< SN, SM, TT > &Y)
行列から指定位置の小行列を抽出する関数
Definition Matrix.hh:1026
constexpr auto operator/(const TT &right) const
行列スカラー除算演算子 (行列/スカラーの場合)
Definition Matrix.hh:226
constexpr void Get(T1 &u1, T2 &... u2)
行列要素から値を読み込む関数
Definition Matrix.hh:405
constexpr friend void solve_upper_tri(const Matrix &U, const Matrix< 1, MM, TT > &b, Matrix< 1, NN, TT > &x)
Uは上三角行列で,Ux = bの形の線形連立1次方程式をxについて解く関数(引数で返す版)
Definition Matrix.hh:1525
constexpr friend Matrix reorderrow(const Matrix &U, const Matrix< 1, MM, int > &v)
並び替え記憶列ベクトルvが昇順になるように,入力行列Uの行を並び替えて元に戻す関数
Definition Matrix.hh:1075
constexpr friend Matrix inv(const Matrix &A)
逆行列を返す関数 (正則チェック無し)
Definition Matrix.hh:1571
constexpr friend void solve(const Matrix &A, const Matrix< 1, MM, TT > &b, Matrix< 1, NN, TT > &x)
Ax = bの形の線形連立1次方程式をxについて解く関数(引数で返す版)
Definition Matrix.hh:1474
constexpr size_t GetHeightLength(void) const
行列の高さ(行数)を返す関数
Definition Matrix.hh:567
static constexpr Matrix zeros(void)
m行n列の零行列を返す関数
Definition Matrix.hh:648
constexpr auto & operator-=(const Matrix &right)
行列減算代入演算子 (行列=行列-行列の場合)
Definition Matrix.hh:259
std::array< std::array< TT, M >, N > Data
データ格納用変数 配列要素の順番は Data[N列(横)][M行(縦)] なので注意
Definition Matrix.hh:2076
constexpr friend Matrix gettriup(const Matrix &U)
行列の上三角部分を返す関数(下三角はゼロになる)
Definition Matrix.hh:1195
constexpr Matrix()
コンストラクタ
Definition Matrix.hh:53
constexpr friend size_t absmaxidx(const Matrix &u)
ベクトル要素の絶対値の最大値の要素番号を返す関数
Definition Matrix.hh:822
constexpr friend Matrix< NN, MM, double > mage(const Matrix &U)
複素数行列要素の大きさを返す関数
Definition Matrix.hh:1863
constexpr friend Matrix abse(const Matrix &U)
行列要素の絶対値を返す関数
Definition Matrix.hh:1786
constexpr size_t GetWidthLength(void) const
行列の幅(列数)を返す関数
Definition Matrix.hh:561
constexpr void FillAllZero(void)
すべての要素を指定したゼロで埋める関数
Definition Matrix.hh:555
constexpr friend Matrix< NN, MM, double > arge(const Matrix &U)
複素数行列要素の偏角を返す関数
Definition Matrix.hh:1875
static constexpr size_t M
行列の高さ(行の数, 縦)
Definition Matrix.hh:2075