ARCS6 AR6-REV.24062600
読み取り中…
検索中…
一致する文字列を見つけられません
ArcsMatrix.hh
[詳解]
1
8//
9// Copyright (C) 2011-2024 Yokokura, Yuki
10// MIT License. For details, see the LICENSE file.
11//
12// ・各関数における計算結果はMATLAB/Maximaと比較して合っていることを確認済み。
13// ・下記に関して、MATLABと異なる結果を出力する場合がある:
14//  - 行列分解の符号関係
15//  - 複素数のときの行列分解
16//  - 劣決定のときの線形方程式の解
17// ・動的メモリ版に比べてかなり高速の行列演算が可能。
18// ・旧来のMatrixクラスのバグ・不具合・不満を一掃。
19
20#ifndef ARCSMATRIX
21#define ARCSMATRIX
22
23#include <string>
24#include <tuple>
25#include <cmath>
26#include <cassert>
27#include <array>
28#include <complex>
29
30// ARCS組込み用マクロ
31#ifdef ARCS_IN
32 // ARCSに組み込まれる場合
33 #include "ARCSassert.hh"
34#else
35 // ARCSに組み込まれない場合
36 #define arcs_assert(a) (assert(a))
37#endif
38
39// 表示用マクロ
40#define dispsize(a) (ArcsMatrix::dispsize_macro((a),#a))
41#define dispf(a,b) (ArcsMatrix::dispf_macro((a),b,#a))
42#define disp(a) (ArcsMatrix::disp_macro((a),#a))
43
44// ARCS名前空間
45namespace ARCS {
46
47// ArcsMatrix設定定義
48namespace ArcsMatrix {
50 enum class NormType {
51 AMT_L2,
52 AMT_L1,
54 };
55
57 enum class MatStatus {
58 AMT_NA,
61 };
62}
63
64// ArcsMatrixメタ関数定義
65namespace ArcsMatrix {
66 // 整数・実数型チェック用メタ関数
67 template<typename TT> struct IsIntFloatV {
68 static constexpr bool value = std::is_integral<TT>::value | std::is_floating_point<TT>::value;
69 };
70 template<typename TT> inline constexpr bool IsIntFloat = IsIntFloatV<TT>::value;
71
72 // 複素数型チェック用メタ関数
73 template<typename TT> struct IsComplexV : std::false_type {};
74 template<> struct IsComplexV<std::complex<double>> : std::true_type {};
75 template<> struct IsComplexV<std::complex<float>> : std::true_type {};
76 template<> struct IsComplexV<std::complex<long>> : std::true_type {};
77 template<> struct IsComplexV<std::complex<int>> : std::true_type {};
78 template<typename TT> inline constexpr bool IsComplex = IsComplexV<TT>::value;
79
80 // 対応可能型チェック用メタ関数
81 template<typename TT> inline constexpr bool IsApplicable = IsIntFloatV<TT>::value | IsComplexV<TT>::value;
82}
83
88template <size_t M, size_t N, typename T = double>
89class ArcsMat {
90 public:
92 constexpr ArcsMat(void)
93 : Nindex(0), Mindex(0), Status(ArcsMatrix::MatStatus::AMT_NA), Data({0})
94 {
95 static_assert(N != 0, "ArcsMat: Size Zero Error"); // サイズゼロの行列は禁止
96 static_assert(M != 0, "ArcsMat: Size Zero Error"); // サイズゼロの行列は禁止
97 static_assert(ArcsMatrix::IsApplicable<T>, "ArcsMat: Type Error"); // 対応可能型チェック
98
99 FillAll(0); // すべての要素を零で初期化
100 }
101
105 template<typename R>
106 constexpr explicit ArcsMat(const R InitValue)
107 : Nindex(0), Mindex(0), Status(ArcsMatrix::MatStatus::AMT_NA), Data({0})
108 {
109 static_assert(N != 0, "ArcsMat: Size Zero Error"); // サイズゼロの行列は禁止
110 static_assert(M != 0, "ArcsMat: Size Zero Error"); // サイズゼロの行列は禁止
111 static_assert(ArcsMatrix::IsApplicable<T>, "ArcsMat: Type Error"); // 対応可能型チェック
112 static_assert(ArcsMatrix::IsApplicable<R>, "ArcsMat: Type Error"); // 対応可能型チェック
113
114 FillAll(static_cast<T>(InitValue)); // すべての要素を指定した値で初期化
115 }
116
120 template<typename R>
121 constexpr ArcsMat(const std::initializer_list<R> InitList)
122 : Nindex(0), Mindex(0), Status(ArcsMatrix::MatStatus::AMT_NA), Data({0})
123 {
124 static_assert(N != 0, "ArcsMat: Size Zero Error"); // サイズゼロの行列は禁止
125 static_assert(M != 0, "ArcsMat: Size Zero Error"); // サイズゼロの行列は禁止
126 static_assert(ArcsMatrix::IsApplicable<T>, "ArcsMat: Type Error"); // 対応可能型チェック
127 static_assert(ArcsMatrix::IsApplicable<R>, "ArcsMat: Type Error"); // 対応可能型チェック
128
129 const R* ListVal = InitList.begin(); // 初期化リストの最初のポインタ位置
130 size_t Ni = 0; // 横方向カウンタ
131 size_t Mi = 0; // 縦方向カウンタ
132 for(size_t i = 0; i < InitList.size(); ++i){
133 // 初期化リストを順番に読み込んでいく
134 arcs_assert(Ni < N); // 横方向カウンタが行の長さ以内かチェック
135 arcs_assert(Mi < M); // 縦方向カウンタが列の高さ以内かチェック
136 Data[Ni][Mi] = static_cast<T>(ListVal[i]); // キャストしてから行列の要素を埋める
137 Ni++; // 横方向カウンタをカウントアップ
138 if(Ni == N){ // 横方向カウンタが最後まで行き着いたら,
139 Ni = 0; // 横方向カウンタを零に戻して,
140 Mi++; // その代わりに,縦方向カウンタをカウントアップ
141 }
142 }
143 }
144
147 constexpr ArcsMat(const ArcsMat<M,N,T>& right)
148 : Nindex(0), Mindex(0), Status(right.GetStatus()), Data(right.GetData())
149 {
150 static_assert(ArcsMatrix::IsApplicable<T>, "ArcsMat: Type Error"); // 対応可能型チェック
151 // メンバを取り込む以外の処理は無し
152 }
153
157 template<size_t P, size_t Q, typename R = double>
158 constexpr ArcsMat(const ArcsMat<P,Q,R>& right)
159 : Nindex(0), Mindex(0), Status(right.GetStatus()), Data()
160 {
161 static_assert(M == P, "ArcsMat: Size Error"); // 行列のサイズチェック
162 static_assert(N == Q, "ArcsMat: Size Error"); // 行列のサイズチェック
163 static_assert(ArcsMatrix::IsApplicable<R>, "ArcsMat: Type Error"); // 対応可能型チェック
164
165 // 型の種類によってキャスト処理を変更
166 if constexpr(ArcsMatrix::IsIntFloat<R> && ArcsMatrix::IsIntFloat<T>){
167 // 「整数・浮動小数点型 → 整数・浮動小数点型」のキャスト処理
168 Data = static_cast<T>(right.GetData());
169 }else if constexpr(ArcsMatrix::IsIntFloat<R> && ArcsMatrix::IsComplex<T>){
170 // 「整数・浮動小数点型 → 複素数型」のキャスト処理
171 const std::array<std::array<R, M>, N>& RightData = right.ReadOnlyRef();
172 for(size_t i = 0; i < N; ++i){
173 for(size_t j = 0; j < M; ++j) Data[i][j].real(RightData[i][j]);
174 }
175 }else if constexpr(ArcsMatrix::IsComplex<R> && ArcsMatrix::IsComplex<T>){
176 // 「複素数型 → 複素数型」のキャスト処理
177 Data = static_cast<T>(right.GetData());
178 }else{
179 // キャスト不能の場合の処理
180 arcs_assert(false); // 変換不能、もしここに来たら問答無用でAssertion Failed
181 }
182 }
183
186 constexpr ArcsMat(ArcsMat<M,N,T>&& right)
187 : Nindex(0), Mindex(0), Status(right.GetStatus()), Data(right.GetData())
188 {
189 // メンバを取り込む以外の処理は無し
190 }
191
195 template<size_t P, size_t Q, typename R = double>
196 constexpr ArcsMat(ArcsMat<M,N,T>&& right)
197 : Nindex(0), Mindex(0), Status(right.GetStatus()), Data(right.GetData())
198 {
199 static_assert(M == P, "ArcsMat: Size Error"); // 行列のサイズチェック
200 static_assert(N == Q, "ArcsMat: Size Error"); // 行列のサイズチェック
201 static_assert(ArcsMatrix::IsApplicable<R>, "ArcsMat: Type Error"); // 対応可能型チェック
202 arcs_assert(false); // もしここに来たら問答無用でAssertion Failed
203 }
204
209 constexpr T operator[](const size_t m) const{
210 static_assert(N == 1, "ArcsMat: Vector Error"); // 縦ベクトルチェック
211 return Data[0][m - 1];
212 }
213
218 constexpr T& operator[](const size_t m){
219 static_assert(N == 1, "ArcsMat: Vector Error"); // 縦ベクトルチェック
220 return Data[0][m - 1];
221 }
222
227 constexpr T operator()(const size_t m, const size_t n) const{
228 return Data[n - 1][m - 1];
229 }
230
235 constexpr T& operator()(const size_t m, const size_t n){
236 return Data[n - 1][m - 1];
237 }
238
244 constexpr T operator()(const size_t m, const size_t n, const bool chk) const{
245 if(chk == true){
246 arcs_assert(0 < m && m <= M);
247 arcs_assert(0 < n && n <= N);
248 }
249 return Data[n - 1][m - 1];
250 }
251
257 constexpr T& operator()(const size_t m, const size_t n, const bool chk){
258 if(chk == true){
259 arcs_assert(0 < m && m <= M);
260 arcs_assert(0 < n && n <= N);
261 }
262 return Data[n - 1][m - 1];
263 }
264
268 constexpr ArcsMat<M,N,T>& operator=(const ArcsMat<M,N,T>& right){
269 for(size_t i = 1; i <= N; ++i){
270 for(size_t j = 1; j <= M; ++j) (*this)(j,i) = right(j,i);
271 // 上記は次とほぼ同等→ this->Data[i][j] = right.Data[i][j];
272 }
273 return (*this);
274 }
275
280 template<size_t P, size_t Q, typename R = double>
281 constexpr ArcsMat<M,N,T>& operator=(const ArcsMat<P,Q,R>& right){
282 static_assert(M == P, "ArcsMat: Size Error"); // 行列のサイズチェック
283 static_assert(N == Q, "ArcsMat: Size Error"); // 行列のサイズチェック
284 static_assert(ArcsMatrix::IsApplicable<R>, "ArcsMat: Type Error"); // 対応可能型チェック
285 arcs_assert(false); // もしここに来たら問答無用でAssertion Failed
286 return (*this);
287 }
288
291 constexpr ArcsMat<M,N,T> operator+(void) const{
292 ArcsMat<M,N,T> ret;
293 for(size_t i = 1; i <= N; ++i){
294 for(size_t j = 1; j <= M; ++j) ret(j,i) = (*this)(j,i);
295 // 上記は次とほぼ同等→ ret.Data[i][j] = Data[i][j];
296 }
297 return ret;
298 }
299
302 constexpr ArcsMat<M,N,T> operator-(void) const{
303 ArcsMat<M,N,T> ret;
304 for(size_t i = 1; i <= N; ++i){
305 for(size_t j = 1; j <= M; ++j) ret(j,i) = -(*this)(j,i);
306 // 上記は次とほぼ同等→ ret.Data[i][j] = -Data[i][j];
307 }
308 return ret;
309 }
310
315 template<size_t P, size_t Q, typename R = double>
316 constexpr ArcsMat<M,N,T> operator+(const ArcsMat<P,Q,R>& right) const{
317 static_assert(M == P, "ArcsMat: Size Error"); // 行列のサイズチェック
318 static_assert(N == Q, "ArcsMat: Size Error"); // 行列のサイズチェック
319 static_assert(ArcsMatrix::IsApplicable<R>, "ArcsMat: Type Error"); // 対応可能型チェック
320 ArcsMat<M,N,T> ret;
321 for(size_t i = 1; i <= N; ++i){
322 for(size_t j = 1; j <= M; ++j) ret(j,i) = (*this)(j,i) + static_cast<T>( right(j,i) );
323 // 上記は次とほぼ同等→ ret.Data[i][j] = Data[i][j] + static_cast<T>(right.Data[i][j]);
324 }
325 return ret;
326 }
327
332 template<typename R>
333 constexpr ArcsMat<M,N,T> operator+(const R& right) const{
334 static_assert(ArcsMatrix::IsApplicable<R>, "ArcsMat: Type Error"); // 対応可能型チェック
335 ArcsMat<M,N,T> ret;
336 for(size_t i = 1; i <= N; ++i){
337 for(size_t j = 1; j <= M; ++j) ret(j,i) = (*this)(j,i) + static_cast<T>(right);
338 // 上記は次とほぼ同等→ ret.Data[i][j] = Data[i][j] + right;
339 }
340 return ret;
341 }
342
347 template<size_t P, size_t Q, typename R = double>
348 constexpr ArcsMat<M,N,T> operator-(const ArcsMat<P,Q,R>& right) const{
349 static_assert(M == P, "ArcsMat: Size Error"); // 行列のサイズチェック
350 static_assert(N == Q, "ArcsMat: Size Error"); // 行列のサイズチェック
351 static_assert(ArcsMatrix::IsApplicable<R>, "ArcsMat: Type Error"); // 対応可能型チェック
352 ArcsMat<M,N,T> ret;
353 for(size_t i = 1; i <= N; ++i){
354 for(size_t j = 1; j <= M; ++j) ret(j,i) = (*this)(j,i) - static_cast<T>( right(j,i) );
355 // 上記は次とほぼ同等→ ret.Data[i][j] = Data[i][j] - right.Data[i][j];
356 }
357 return ret;
358 }
359
364 template<typename R>
365 constexpr ArcsMat<M,N,T> operator-(const R& right) const{
366 static_assert(ArcsMatrix::IsApplicable<R>, "ArcsMat: Type Error"); // 対応可能型チェック
367 ArcsMat<M,N,T> ret;
368 for(size_t i = 1; i <= N; ++i){
369 for(size_t j = 1; j <= M; ++j) ret(j,i) = (*this)(j,i) - static_cast<T>(right);
370 // 上記は次とほぼ同等→ ret.Data[i][j] = Data[i][j] - right;
371 }
372 return ret;
373 }
374
379 template<size_t P, size_t Q, typename R = double>
380 constexpr ArcsMat<M,Q,T> operator*(const ArcsMat<P,Q,R>& right) const{
381 static_assert(N == P, "ArcsMat: Size Error"); // 行列のサイズチェック
382 static_assert(ArcsMatrix::IsApplicable<R>, "ArcsMat: Type Error"); // 対応可能型チェック
383 ArcsMat<M,Q,T> ret;
384 for(size_t k = 1; k <= Q; ++k){
385 for(size_t i = 1; i <= N; ++i){
386 for(size_t j = 1; j <= M; ++j) ret(j,k) += (*this)(j,i)*static_cast<T>( right(i,k) );
387 // 上記は次とほぼ同等→ ret.Data[k][j] += Data[i][j]*right.Data[k][i];
388 }
389 }
390 return ret;
391 }
392
397 template<typename R>
398 constexpr ArcsMat<M,N,T> operator*(const R& right) const{
399 static_assert(ArcsMatrix::IsApplicable<R>, "ArcsMat: Type Error"); // 対応可能型チェック
400 ArcsMat<M,N,T> ret;
401 for(size_t i = 1; i <= N; ++i){
402 for(size_t j = 1; j <= M; ++j) ret(j,i) = (*this)(j,i)*static_cast<T>(right);
403 // 上記は次とほぼ同等→ ret.Data[i][j] = Data[i][j]*right;
404 }
405 return ret;
406 }
407
412 template<size_t P, size_t Q, typename R = double>
413 constexpr void operator/(const ArcsMat<P,Q,R>& right) const{
414 arcs_assert(false); // この演算子は使用禁止
415 }
416
421 template<typename R>
422 constexpr ArcsMat<M,N,T> operator/(const R& right) const{
423 static_assert(ArcsMatrix::IsApplicable<R>, "ArcsMat: Type Error"); // 対応可能型チェック
424 ArcsMat<M,N,T> ret;
425 for(size_t i = 1; i <= N; ++i){
426 for(size_t j = 1; j <= M; ++j) ret(j,i) = (*this)(j,i)/static_cast<T>(right);
427 // 上記は次とほぼ同等→ ret.Data[i][j] = Data[i][j]/right;
428 }
429 return ret;
430 }
431
436 template<typename R>
437 constexpr ArcsMat<M,N,T>& operator+=(const R& right){
438 (*this) = (*this) + right; // 既に定義済みの加算演算子を利用
439 return (*this);
440 }
441
446 template<typename R>
447 constexpr ArcsMat<M,N,T>& operator-=(const R& right){
448 (*this) = (*this) - right; // 既に定義済みの減算演算子を利用
449 return (*this);
450 }
451
456 template<typename R>
457 constexpr ArcsMat<M,N,T>& operator*=(const R& right){
458 (*this) = (*this)*right; // 既に定義済みの乗算演算子を利用
459 return (*this);
460 }
461
466 template<typename R>
467 constexpr ArcsMat<M,N,T>& operator/=(const R& right){
468 (*this) = (*this)/right; // 既に定義済みの除算演算子を利用
469 return (*this);
470 }
471
475 constexpr ArcsMat<M,N,T> operator^(const int& right) const{
476 static_assert(M == N, "ArcsMat: Size Error"); // 正方行列チェック
478 if(0 <= right){
479 // 非負のときはべき乗を計算
480 for(size_t k = 1; k <= static_cast<size_t>(right); ++k) ret *= (*this);
481 }else if(right == -1){
482 // -1乗のときは逆行列を返す
483 ret = ArcsMat<M,N,T>::inv((*this));
484 }else{
485 // -1より下の負数は未対応
486 arcs_assert(false);
487 }
488 return ret;
489 }
490
495 template<size_t P, size_t Q, typename R = double>
496 constexpr ArcsMat<M,N,T> operator&(const ArcsMat<P,Q,R>& right) const{
497 static_assert(M == P, "ArcsMat: Size Error"); // 行列のサイズチェック
498 static_assert(N == Q, "ArcsMat: Size Error"); // 行列のサイズチェック
499 static_assert(ArcsMatrix::IsApplicable<R>, "ArcsMat: Type Error"); // 対応可能型チェック
500 ArcsMat<M,N,T> ret;
501 for(size_t i = 1; i <= N; ++i){
502 for(size_t j = 1; j <= M; ++j) ret(j,i) = (*this)(j,i)*static_cast<T>( right(j,i) );
503 // 上記は次とほぼ同等→ ret.Data[i][j] = Data[i][j]*right.Data[i][j];
504 }
505 return ret;
506 }
507
512 template<size_t P, size_t Q, typename R = double>
513 constexpr ArcsMat<M,N,T> operator%(const ArcsMat<P,Q,R>& right) const{
514 static_assert(M == P, "ArcsMat: Size Error"); // 行列のサイズチェック
515 static_assert(N == Q, "ArcsMat: Size Error"); // 行列のサイズチェック
516 static_assert(ArcsMatrix::IsApplicable<R>, "ArcsMat: Type Error"); // 対応可能型チェック
517 ArcsMat<M,N,T> ret;
518 for(size_t i = 1; i <= N; ++i){
519 for(size_t j = 1; j <= M; ++j) ret(j,i) = (*this)(j,i)/static_cast<T>( right(j,i) );
520 // 上記は次とほぼ同等→ ret.Data[i][j] = Data[i][j]/right.Data[i][j];
521 }
522 return ret;
523 }
524
528 constexpr friend ArcsMat<M,N,T> operator+(const T& left, const ArcsMat<M,N,T>& right){
529 return right + left; // 既に定義済みの加算演算子を利用
530 }
531
535 constexpr friend ArcsMat<M,N,T> operator-(const T& left, const ArcsMat<M,N,T>& right){
536 return -right + left; // 既に定義済みの単項マイナスと加算演算子を利用
537 }
538
542 constexpr friend ArcsMat<M,N,T> operator*(const T& left, const ArcsMat<M,N,T>& right){
543 return right*left; // 既に定義済みの乗算演算子を利用
544 }
545
549 constexpr friend void operator/(const T& left, const ArcsMat<M,N,T>& right){
550 arcs_assert(false); // この演算子は使用禁止
551 }
552
554 constexpr void DispAddress(void) const{
555 if(__builtin_constant_p(Data) == true) return; // コンパイル時には処理を行わない
556
557 printf("Mem addr of matrix:\n");
558 for(size_t j = 0; j < M; ++j){
559 printf("[ ");
560 for(size_t i = 0; i < N; ++i){
561 printf("%p ", &(Data[i][j]));
562 }
563 printf("]\n");
564 }
565 printf("\n");
566 }
567
571 constexpr void Disp(const std::string& format) const{
572 if(__builtin_constant_p(Data) == true) return; // コンパイル時には処理を行わない
573
574 for(size_t j = 0; j < M; ++j){
575 printf("[ ");
576 for(size_t i = 0; i < N; ++i){
577 // データ型によって表示方法を変える
578 if constexpr(ArcsMatrix::IsComplex<T>){
579 // 複素数型の場合
580 // 実数部の表示
581 printf(format.c_str(), Data[i][j].real());
582 // 虚数部の表示
583 if(0.0 <= Data[i][j].imag()){
584 printf(" +");
585 }else{
586 printf(" -");
587 }
588 printf( format.c_str(), std::abs(Data[i][j].imag()) );
589 printf("%c", CMPLX_UNIT);
590 }else{
591 // それ以外の場合
592 printf(format.c_str(), Data[i][j]);
593 }
594 printf(" ");
595 }
596 printf("]\n");
597 }
598 printf("\n");
599 }
600
602 constexpr void Disp(void) const{
603 Disp("%g");
604 }
605
607 constexpr void DispSize(void) const{
608 if(__builtin_constant_p(Data) == true) return; // コンパイル時には処理を行わない
609
610 printf("[ Height: %zu x Width: %zu ]\n\n", M, N);
611 }
612
615 constexpr size_t GetHeight(void) const{
616 return M;
617 }
618
621 constexpr size_t GetWidth(void) const{
622 return N;
623 }
624
628 constexpr size_t GetNumOfNonZero(const T eps = ArcsMat<M,N,T>::EPSILON) const{
629 size_t ret = 0;
630 for(size_t i = 1; i <= N; ++i){
631 for(size_t j = 1; j <= M; ++j){
632 if( std::abs(eps) < std::abs( (*this)(j,i) )) ++ret;
633 }
634 }
635 return ret;
636 }
637
642 template<typename T1, typename... T2> // 可変長引数テンプレート
643 constexpr void Set(const T1& u1, const T2&... u2){ // 再帰で順番に可変長引数を読み込んでいく
644 static_assert(ArcsMatrix::IsApplicable<T1>, "ArcsMat: Type Error"); // 対応可能型チェック
645 arcs_assert(Mindex < M); // 縦方向カウンタが高さ以内かチェック
646 arcs_assert(Nindex < N); // 横方向カウンタが幅以内かチェック
647 Data[Nindex][Mindex] = static_cast<T>(u1); // キャストしてから行列の要素を埋める
648 Nindex++; // 横方向カウンタをインクリメント
649 if(Nindex == N){ // 横方向カウンタが最後まで行き着いたら,
650 Nindex = 0; // 横方向カウンタを零に戻して,
651 Mindex++; // その代わりに,縦方向カウンタをインクリメント
652 }
653 Set(u2...); // 自分自身を呼び出す(再帰)
654 }
655 constexpr void Set(){
656 // 再帰の最後に呼ばれる関数
657 Nindex = 0; // すべての作業が終わったので,
658 Mindex = 0; // 横方向と縦方向カウンタを零に戻しておく
659 }
660
665 template<typename T1, typename... T2> // 可変長引数テンプレート
666 constexpr void Get(T1& u1, T2&... u2){ // 再帰で順番に可変長引数を読み込んでいく
667 static_assert(ArcsMatrix::IsApplicable<T1>, "ArcsMat: Type Error"); // 対応可能型チェック
668 arcs_assert(Mindex < M); // 縦方向カウンタが高さ以内かチェック
669 arcs_assert(Nindex < N); // 横方向カウンタが幅以内かチェック
670 u1 = static_cast<T1>(Data[Nindex][Mindex]); // 行列の要素からキャストして読み込み
671 Nindex++; // 横方向カウンタをインクリメント
672 if(Nindex == N){ // 横方向カウンタが最後まで行き着いたら,
673 Nindex = 0; // 横方向カウンタを零に戻して,
674 Mindex++; // その代わりに,縦方向カウンタをインクリメント
675 }
676 Get(u2...); // 自分自身を呼び出す(再帰)
677 }
678 constexpr void Get(){
679 // 再帰の最後に呼ばれる関数
680 Nindex = 0; // すべての作業が終わったので,
681 Mindex = 0; // 横方向と縦方向カウンタを零に戻しておく
682 }
683
687 template<typename R>
688 constexpr void FillAll(const R& u){
689 static_assert(ArcsMatrix::IsApplicable<R>, "ArcsMat: Type Error"); // 対応可能型チェック
690 for(size_t i = 0; i < N; ++i){
691 for(size_t j = 0; j < M; ++j){
692 // 型の種類によって値埋め処理を変更
693 if constexpr(ArcsMatrix::IsIntFloat<R> && ArcsMatrix::IsIntFloat<T>){
694 // 「整数・浮動小数点型 → 整数・浮動小数点型」の値埋め処理
695 Data[i][j] = static_cast<T>(u);
696 }else if constexpr(ArcsMatrix::IsIntFloat<R> && ArcsMatrix::IsComplex<T>){
697 // 「整数・浮動小数点型 → 複素数型」の値埋め処理
698 Data[i][j].real(u);
699 Data[i][j].imag(0);
700 }else if constexpr(ArcsMatrix::IsComplex<R> && ArcsMatrix::IsComplex<T>){
701 // 「複素数型 → 複素数型」の値埋め処理
702 Data[i][j] = static_cast<T>(u);
703 }else{
704 // 値埋め不能の場合の処理
705 arcs_assert(false); // 変換不能、もしここに来たら問答無用でAssertion Failed
706 }
707 }
708 }
709 }
710
712 constexpr void FillAllZero(void){
713 FillAll(0);
714 }
715
719 template<size_t P, typename R = double>
720 constexpr void LoadArray(const std::array<R, P>& Array){
721 static_assert(N == 1, "ArcsMat: Vector Error"); // 縦ベクトルチェック
722 static_assert(M == P, "ArcsMat: Size Error"); // 行列のサイズチェック
723 static_assert(ArcsMatrix::IsApplicable<R>, "ArcsMat: Type Error"); // 対応可能型チェック
724 for(size_t j = 0; j < M; ++j) Data[0][j] = Array[j];
725 }
726
730 template<size_t P, typename R = double>
731 constexpr void StoreArray(std::array<R, P>& Array) const{
732 static_assert(N == 1, "ArcsMat: Vector Error"); // 縦ベクトルチェック
733 static_assert(M == P, "ArcsMat: Size Error"); // 行列のサイズチェック
734 static_assert(ArcsMatrix::IsApplicable<R>, "ArcsMat: Type Error"); // 対応可能型チェック
735 for(size_t j = 0; j < M; ++j) Array[j] = Data[0][j];
736 }
737
741 template<size_t P, size_t Q, typename R = double>
742 constexpr void LoadArray(const std::array<std::array<R, P>, Q>& Array){
743 static_assert(M == P, "ArcsMat: Size Error"); // 行列のサイズチェック
744 static_assert(N == Q, "ArcsMat: Size Error"); // 行列のサイズチェック
745 static_assert(ArcsMatrix::IsApplicable<R>, "ArcsMat: Type Error"); // 対応可能型チェック
746 Data = Array;
747 }
748
752 template<size_t P, size_t Q, typename R = double>
753 constexpr void StoreArray(std::array<std::array<R, P>, Q>& Array) const{
754 static_assert(M == P, "ArcsMat: Size Error"); // 行列のサイズチェック
755 static_assert(N == Q, "ArcsMat: Size Error"); // 行列のサイズチェック
756 static_assert(ArcsMatrix::IsApplicable<R>, "ArcsMat: Type Error"); // 対応可能型チェック
757 Array = Data;
758 }
759
762 constexpr ArcsMatrix::MatStatus GetStatus(void) const{
763 return Status;
764 }
765
768 constexpr std::array<std::array<T, M>, N> GetData(void) const{
769 return Data;
770 }
771
774 constexpr const std::array<std::array<T, M>, N>& ReadOnlyRef(void) const{
775 return Data;
776 }
777
783 template<size_t P, size_t Q, typename R = double>
784 constexpr void GetVerticalVec(ArcsMat<P,Q,R>& v, const size_t m, const size_t n) const{
785 static_assert(Q == 1, "ArcsMat: Vector Error"); // 縦ベクトルチェック
786 static_assert(P <= M, "ArcsMat: Vector Size Error"); // ベクトルサイズチェック
787 static_assert(ArcsMatrix::IsApplicable<R>, "ArcsMat: Type Error"); // 対応可能型チェック
788 arcs_assert(0 < m && P + m - 1 <= M); // はみ出しチェック
789 arcs_assert(0 < n && n <= N); // サイズチェック
790 for(size_t j = 1; j <= P; ++j) v(j,1) = (*this)(m + j - 1, n);
791 }
792
798 template<size_t P>
799 constexpr ArcsMat<P,1,T> GetVerticalVec(const size_t m, const size_t n) const{
800 ArcsMat<P,1,T> ret;
801 GetVerticalVec(ret, m, n);
802 return ret;
803 }
804
810 template<size_t P, size_t Q, typename R = double>
811 constexpr void GetHorizontalVec(ArcsMat<P,Q,R>& w, const size_t m, const size_t n) const{
812 static_assert(P == 1, "ArcsMat: Vector Error"); // 横ベクトルチェック
813 static_assert(Q <= N, "ArcsMat: Vector Size Error"); // ベクトルサイズチェック
814 static_assert(ArcsMatrix::IsApplicable<R>, "ArcsMat: Type Error"); // 対応可能型チェック
815 arcs_assert(0 < m && m <= M); // サイズチェック
816 arcs_assert(0 < n && Q + n - 1 <= N); // はみ出しチェック
817 for(size_t i = 1; i <= Q; ++i) w(1,i) = (*this)(m, n + i - 1);
818 }
819
825 template<size_t Q>
826 constexpr ArcsMat<1,Q,T> GetHorizontalVec(const size_t m, const size_t n) const{
827 ArcsMat<1,Q,T> ret;
828 GetHorizontalVec(ret, m, n);
829 return ret;
830 }
831
837 template<size_t P, size_t Q, typename R = double>
838 constexpr void SetVerticalVec(const ArcsMat<P,Q,R>& v, const size_t m, const size_t n){
839 static_assert(Q == 1, "ArcsMat: Vector Error"); // 縦ベクトルチェック
840 static_assert(P <= M, "ArcsMat: Vector Size Error"); // ベクトルサイズチェック
841 static_assert(ArcsMatrix::IsApplicable<R>, "ArcsMat: Type Error"); // 対応可能型チェック
842 arcs_assert(0 < m && P + m - 1 <= M); // はみ出しチェック
843 arcs_assert(0 < n && n <= N); // サイズチェック
844 for(size_t j = 1; j <= P; ++j) (*this)(m + j - 1, n) = v(j,1);
845 }
846
852 template<size_t P, size_t Q, typename R = double>
853 constexpr void SetHorizontalVec(const ArcsMat<P,Q,R>& w, size_t m, size_t n){
854 static_assert(P == 1, "ArcsMat: Vector Error"); // 横ベクトルチェック
855 static_assert(Q <= N, "ArcsMat: Vector Size Error"); // ベクトルサイズチェック
856 static_assert(ArcsMatrix::IsApplicable<R>, "ArcsMat: Type Error"); // 対応可能型チェック
857 arcs_assert(0 < m && m <= M); // サイズチェック
858 arcs_assert(0 < n && Q + n - 1 <= N); // はみ出しチェック
859 for(size_t i = 1; i <= Q; ++i) (*this)(m, n + i - 1) = w(1,i);
860 }
861
865 constexpr void Zeroing(const T eps = ArcsMat<M,N,T>::EPSILON){
866 for(size_t i = 1; i <= N; ++i){
867 for(size_t j = 1; j <= M; ++j){
868 if(std::abs( (*this)(j,i) ) < std::real(eps)) (*this)(j,i) = 0;
869 }
870 }
871 }
872
876 constexpr void ZeroingTriLo(const T eps = ArcsMat<M,N,T>::EPSILON){
877 for(size_t i = 1; i <= N; ++i){
878 for(size_t j = i + 1; j <= M; ++j){
879 if constexpr(ArcsMatrix::IsComplex<T>){
880 //if(std::abs( std::real((*this)(j,i)) ) < std::real(eps)) ((*this)(j,i)).real(0);
881 //if(std::abs( std::imag((*this)(j,i)) ) < std::real(eps)) ((*this)(j,i)).imag(0);
882 if(std::abs( (*this)(j,i) ) < std::real(eps)) (*this)(j,i) = 0;
883 }else{
884 if(std::abs( (*this)(j,i) ) < eps) (*this)(j,i) = 0;
885 }
886 }
887 }
888 }
889
890 public:
891 // ここから下は静的メンバ関数
892
895 static constexpr ArcsMat<M,N,T> zeros(void){
896 ArcsMat<M,N,T> ret;
897 return ret;
898 }
899
902 static constexpr ArcsMat<M,N,T> ones(void){
903 ArcsMat<M,N,T> ret;
904 ret.FillAll(1);
905 return ret;
906 }
907
910 static constexpr ArcsMat<M,N,T> eye(void){
911 static_assert(M == N, "ArcsMat: Size Error"); // 正方行列チェック
912 ArcsMat<M,N,T> ret;
913 if constexpr(ArcsMatrix::IsComplex<T>){
914 // 複素数型の場合
915 for(size_t i = 1; i <= N; ++i) ret(i,i) = std::complex(1.0, 0.0); // 対角成分を 1 + j0 で埋める
916 }else{
917 // それ以外の場合
918 for(size_t i = 1; i <= N; ++i) ret(i,i) = static_cast<T>(1); // 対角成分を 1 で埋める
919 }
920 return ret;
921 }
922
925 static constexpr ArcsMat<M,N,T> ramp(void){
926 static_assert(N == 1, "ArcsMat: Vector Error");// 行列のサイズチェック
927 ArcsMat<M,N,T> ret;
928 for(size_t j = 1; j <= M; ++j) ret[j] = j; // 単調増加を書き込む
929 return ret;
930 }
931
937 template<size_t P, size_t Q, typename R = double>
938 static constexpr void getcolumn(const ArcsMat<M,N,T>& U, ArcsMat<P,Q,R>& y, const size_t n){
939 static_assert(M == P, "ArcsMat: Size Error"); // 行列のサイズチェック
940 y.SetVerticalVec(U.GetVerticalVec<M>(1,n) ,1, 1);
941 }
942
947 static constexpr ArcsMat<M,1,T> getcolumn(const ArcsMat<M,N,T>& U, const size_t n){
948 return U.GetVerticalVec<M>(1, n);
949 }
950
956 template<size_t P, size_t Q, typename R = double>
957 static constexpr void setcolumn(ArcsMat<M,N,T>& UY, const ArcsMat<P,Q,R>& u, const size_t n){
958 static_assert(M == P, "ArcsMat: Size Error"); // 行列のサイズチェック
959 UY.SetVerticalVec(u, 1, n);
960 }
961
968 template<size_t P, size_t Q, typename R = double>
969 static constexpr ArcsMat<M,N,T> setcolumn(const ArcsMat<P,Q,R>& u, const size_t n, const ArcsMat<M,N,T>& U){
970 ArcsMat<M,N,T> Y = U;
971 setcolumn(Y, u, n);
972 return Y;
973 }
974
979 static constexpr void swapcolumn(ArcsMat<M,N,T>& UY, const size_t n1, const size_t n2){
980 ArcsMat<M,1,T> p, q; // バッファ用ベクトル
981 p = getcolumn(UY, n1); // n1列目を抽出
982 q = getcolumn(UY, n2); // n2列目を抽出
983 setcolumn(UY, p, n2); // m2列目に書き込み
984 setcolumn(UY, q, n1); // m1列目に書き込み
985 }
986
992 static constexpr ArcsMat<M,N,T> swapcolumn(const size_t n1, const size_t n2, const ArcsMat<M,N,T>& U){
993 ArcsMat<M,N,T> Y = U;
994 swapcolumn(Y, n1, n2);
995 return Y;
996 }
997
1005 template<typename R = double>
1006 static constexpr void fillcolumn(ArcsMat<M,N,T>& UY, const R a, const size_t n, const size_t m1, const size_t m2){
1007 static_assert(ArcsMatrix::IsApplicable<R>, "ArcsMat: Type Error"); // 対応可能型チェック
1008 arcs_assert(0 < n && n <= N); // 列が幅以内かチェック
1009 arcs_assert(0 < m1 && m1 <= M); // 行が高さ以内かチェック
1010 arcs_assert(0 < m2 && m2 <= M); // 行が高さ以内かチェック
1011 arcs_assert(m1 <= m2); // 開始行と終了行が入れ替わらないかチェック
1012 for(size_t j = m1; j <= m2; ++j) UY(j, n) = (T)a;
1013 }
1014
1023 template<typename R = double>
1024 static constexpr ArcsMat<M,N,T> fillcolumn(const R a, const size_t n, const size_t m1, const size_t m2, const ArcsMat<M,N,T>& U){
1025 ArcsMat<M,N,T> Y = U;
1026 fillcolumn(Y, a, n, m1, m2);
1027 return Y;
1028 }
1029
1035 template<size_t P, size_t Q, typename R = size_t>
1036 static constexpr ArcsMat<M,N,T> ordercolumn(const ArcsMat<M,N,T>& U, const ArcsMat<P,Q,R>& u){
1037 static_assert(P == 1, "ArcsMat: Vector Error"); // 横ベクトルチェック
1038 static_assert(N == Q, "ArcsMat: Size Error"); // 行列のサイズチェック
1039 static_assert(std::is_integral_v<R>, "ArcsMat: Input u should be integer type."); // 整数型チェック
1041 for(size_t i = 1; i <= N; ++i){
1042 setcolumn(Y, getcolumn(U, static_cast<size_t>( u(1,i) )), i);
1043 }
1044 return Y;
1045 }
1046
1051 template<size_t P, size_t Q, typename R = size_t>
1052 static constexpr void ordercolumn_and_vec(ArcsMat<M,N,T>& UY, ArcsMat<P,Q,R>& uy){
1053 static_assert(P == 1, "ArcsMat: Vector Error"); // 横ベクトルチェック
1054 static_assert(N == Q, "ArcsMat: Size Error"); // 行列のサイズチェック
1055 static_assert(std::is_integral_v<R>, "ArcsMat: Input u should be integer type."); // 整数型チェック
1056 for(size_t i = 1; i <= N; ++i){
1057 swapcolumn(UY, i, uy(1,i));
1058 ArcsMat<P,Q,R>::swapcolumn(uy, i, static_cast<size_t>( uy(1,i) ));
1059 }
1060 }
1061
1066 template<size_t P, size_t Q, typename R = double>
1067 static constexpr void sumcolumn(const ArcsMat<M,N,T>& U, ArcsMat<P,Q,R>& y){
1068 static_assert(P == 1, "ArcsMat: Vector Error"); // 横ベクトルチェック
1069 static_assert(N == Q, "ArcsMat: Size Error"); // 行列のサイズチェック
1070 static_assert(ArcsMatrix::IsApplicable<R>, "ArcsMat: Type Error"); // 対応可能型チェック
1071 y.FillAllZero();
1072 for(size_t i = 1; i <= N; ++i){
1073 for(size_t j = 1; j <= M; ++j) y(1,i) += static_cast<R>( U(j,i) );
1074 }
1075 }
1076
1080 static constexpr ArcsMat<1,N,T> sumcolumn(const ArcsMat<M,N,T>& U){
1082 sumcolumn(U, y);
1083 return y;
1084 }
1085
1091 template<size_t P, size_t Q, typename R = double>
1092 static constexpr void getrow(const ArcsMat<M,N,T>& U, ArcsMat<P,Q,R>& y, const size_t m){
1093 static_assert(N == Q, "ArcsMat: Size Error"); // 行列のサイズチェック
1094 y.SetHorizontalVec(U.GetHorizontalVec<N>(m,1) ,1, 1);
1095 }
1096
1101 static constexpr ArcsMat<1,N,T> getrow(const ArcsMat<M,N,T>& U, const size_t m){
1102 return U.GetHorizontalVec<N>(m, 1);
1103 }
1104
1110 template<size_t P, size_t Q, typename R = double>
1111 static constexpr void setrow(ArcsMat<M,N,T>& UY, const ArcsMat<P,Q,R>& u, const size_t m){
1112 static_assert(N == Q, "ArcsMat: Size Error"); // 行列のサイズチェック
1113 UY.SetHorizontalVec(u, m, 1);
1114 }
1115
1122 template<size_t P, size_t Q, typename R = double>
1123 static constexpr ArcsMat<M,N,T> setrow(const ArcsMat<P,Q,R>& u, const size_t m, const ArcsMat<M,N,T>& U){
1124 ArcsMat<M,N,T> Y = U;
1125 setrow(Y, u, m);
1126 return Y;
1127 }
1128
1133 static constexpr void swaprow(ArcsMat<M,N,T>& UY, const size_t m1, const size_t m2){
1134 ArcsMat<1,N,T> p, q; // バッファ用ベクトル
1135 p = getrow(UY, m1); // m1行目を抽出
1136 q = getrow(UY, m2); // m2行目を抽出
1137 setrow(UY, p, m2); // m2行目に書き込み
1138 setrow(UY, q, m1); // m1行目に書き込み
1139 }
1140
1146 static constexpr ArcsMat<M,N,T> swaprow(const size_t m1, const size_t m2, const ArcsMat<M,N,T>& U){
1147 ArcsMat<M,N,T> Y = U;
1148 swaprow(Y, m1, m2);
1149 return Y;
1150 }
1151
1159 template<typename R = double>
1160 static constexpr void fillrow(ArcsMat<M,N,T>& UY, const R a, const size_t m, const size_t n1, const size_t n2){
1161 static_assert(ArcsMatrix::IsApplicable<R>, "ArcsMat: Type Error"); // 対応可能型チェック
1162 arcs_assert(0 < m && m <= M); // 行が高さ以内かチェック
1163 arcs_assert(0 < n1 && n1 <= N); // 列が幅以内かチェック
1164 arcs_assert(0 < n2 && n2 <= N); // 列が幅以内かチェック
1165 arcs_assert(n1 <= n2); // 開始列と終了列が入れ替わらないかチェック
1166 for(size_t i = n1; i <= n2; ++i) UY(m, i) = static_cast<T>(a);
1167 }
1168
1177 template<typename R = double>
1178 static constexpr ArcsMat<M,N,T> fillrow(const R a, const size_t m, const size_t n1, const size_t n2, const ArcsMat<M,N,T>& U){
1179 ArcsMat<M,N,T> Y = U;
1180 fillrow(Y, a, m, n1, n2);
1181 return Y;
1182 }
1183
1189 template<size_t P, size_t Q, typename R = size_t>
1190 static constexpr ArcsMat<M,N,T> orderrow(const ArcsMat<M,N,T>& U, const ArcsMat<P,Q,R>& u){
1191 static_assert(Q == 1, "ArcsMat: Vector Error"); // 縦ベクトルチェック
1192 static_assert(M == P, "ArcsMat: Size Error"); // 行列のサイズチェック
1193 static_assert(std::is_integral_v<R>, "ArcsMat: Input u should be integer type."); // 整数型チェック
1195 for(size_t j = 1; j <= M; ++j){
1196 setrow(Y, getrow(U, static_cast<size_t>( u(j,1) )), j);
1197 }
1198 return Y;
1199 }
1200
1205 template<size_t P, size_t Q, typename R = size_t>
1206 static constexpr void orderrow_and_vec(ArcsMat<M,N,T>& UY, ArcsMat<P,Q,R>& uy){
1207 static_assert(Q == 1, "ArcsMat: Vector Error"); // 縦ベクトルチェック
1208 static_assert(M == P, "ArcsMat: Size Error"); // 行列のサイズチェック
1209 static_assert(std::is_integral_v<R>, "ArcsMat: Input u should be integer type."); // 整数型チェック
1210 for(size_t j = 1; j <= M; ++j){
1211 swaprow(UY, j, uy(j,1));
1212 ArcsMat<P,Q,R>::swaprow(uy, j, static_cast<size_t>( uy(j,1) ));
1213 }
1214 }
1215
1220 template<size_t P, size_t Q, typename R = double>
1221 static constexpr void sumrow(const ArcsMat<M,N,T>& U, ArcsMat<P,Q,R>& y){
1222 static_assert(Q == 1, "ArcsMat: Vector Error"); // 縦ベクトルチェック
1223 static_assert(M == P, "ArcsMat: Size Error"); // 行列のサイズチェック
1224 static_assert(ArcsMatrix::IsApplicable<R>, "ArcsMat: Type Error"); // 対応可能型チェック
1225 y.FillAllZero();
1226 for(size_t j = 1; j <= M; ++j){
1227 for(size_t i = 1; i <= N; ++i) y(j,1) += static_cast<R>( U(j,i) );
1228 }
1229 }
1230
1234 static constexpr ArcsMat<M,1,T> sumrow(const ArcsMat<M,N,T>& U){
1236 sumrow(U, y);
1237 return y;
1238 }
1239
1246 template<size_t P, size_t Q, typename R = double>
1247 static constexpr void getvvector(const ArcsMat<M,N,T>& U, ArcsMat<P,Q,R>& y, const size_t m, const size_t n){
1248 U.GetVerticalVec(y, m, n);
1249 }
1250
1257 template<size_t P = M>
1258 static constexpr ArcsMat<P,1,T> getvvector(const ArcsMat<M,N,T>& U, const size_t m, const size_t n){
1259 return U.GetVerticalVec<P>(m, n);
1260 }
1261
1268 template<size_t P, size_t Q, typename R = double>
1269 static constexpr void setvvector(ArcsMat<M,N,T>& UY, const ArcsMat<P,Q,R>& u, const size_t m, const size_t n){
1270 UY.SetVerticalVec(u, m, n);
1271 }
1272
1280 template<size_t P, size_t Q, typename R = double>
1281 static constexpr ArcsMat<M,N,T> setvvector(const ArcsMat<P,Q,R>& u, const size_t m, const size_t n, const ArcsMat<M,N,T>& U){
1282 ArcsMat<M,N,T> Y = U;
1283 Y.SetVerticalVec(u, m, n);
1284 return Y;
1285 }
1286
1293 template<size_t P, size_t Q, typename R = double>
1294 static constexpr void gethvector(const ArcsMat<M,N,T>& U, ArcsMat<P,Q,R>& y, const size_t m, const size_t n){
1295 U.GetHorizontalVec(y, m, n);
1296 }
1297
1304 template<size_t Q>
1305 static constexpr ArcsMat<1,Q,T> gethvector(const ArcsMat<M,N,T>& U, const size_t m, const size_t n){
1306 return U.GetHorizontalVec<Q>(m, n);
1307 }
1308
1315 template<size_t P, size_t Q, typename R = double>
1316 static constexpr void sethvector(ArcsMat<M,N,T>& UY, const ArcsMat<P,Q,R>& u, const size_t m, const size_t n){
1317 UY.SetHorizontalVec(u, m, n);
1318 }
1319
1327 template<size_t P, size_t Q, typename R = double>
1328 static constexpr ArcsMat<M,N,T> sethvector(const ArcsMat<P,Q,R>& u, const size_t m, const size_t n, const ArcsMat<M,N,T>& U){
1329 ArcsMat<M,N,T> Y = U;
1330 Y.SetHorizontalVec(u, m, n);
1331 return Y;
1332 }
1333
1340 template<size_t P, size_t Q, typename R = double>
1341 static constexpr void getsubmatrix(const ArcsMat<M,N,T>& U, ArcsMat<P,Q,R>& Y, const size_t m, const size_t n){
1342 static_assert(P <= M, "ArcsMat: Size Error"); // 小行列の方が高さが小さいかチェック
1343 static_assert(Q <= N, "ArcsMat: Size Error"); // 小行列の方が幅が小さいかチェック
1344 static_assert(ArcsMatrix::IsApplicable<R>, "ArcsMat: Type Error"); // 対応可能型チェック
1345 arcs_assert(P + m - 1 <= M); // 下側がハミ出ないかチェック
1346 arcs_assert(Q + n - 1 <= N); // 右側がハミ出ないかチェック
1347 for(size_t i = 1; i <= Q; ++i) ArcsMat<P,Q,R>::setcolumn(Y, getvvector<P>(U, m, n + i - 1), i);
1348 }
1349
1356 template<size_t P, size_t Q>
1357 static constexpr ArcsMat<P,Q,T> getsubmatrix(const ArcsMat<M,N,T>& U, const size_t m, const size_t n){
1359 getsubmatrix(U, Y, m, n);
1360 return Y;
1361 }
1362
1369 template<size_t P, size_t Q, typename R = double>
1370 static constexpr void setsubmatrix(ArcsMat<M,N,T>& UY, const ArcsMat<P,Q,R>& U, const size_t m, const size_t n){
1371 static_assert(P <= M, "ArcsMat: Size Error"); // 小行列の方が高さが小さいかチェック
1372 static_assert(Q <= N, "ArcsMat: Size Error"); // 小行列の方が幅が小さいかチェック
1373 static_assert(ArcsMatrix::IsApplicable<R>, "ArcsMat: Type Error"); // 対応可能型チェック
1374 arcs_assert(P + m - 1 <= M); // 下側がハミ出ないかチェック
1375 arcs_assert(Q + n - 1 <= N); // 右側がハミ出ないかチェック
1376 for(size_t i = 1; i <= Q; ++i) setvvector(UY, ArcsMat<P,Q,R>::getcolumn(U, i), m, i + n - 1);
1377 }
1378
1386 template<size_t P, size_t Q, typename R = double>
1387 static constexpr ArcsMat<M,N,T> setsubmatrix(const ArcsMat<P,Q,R>& Us, const size_t m, const size_t n, const ArcsMat<M,N,T>& U){
1388 ArcsMat<M,N,T> Y = U;
1389 setsubmatrix(Y, Us, m, n);
1390 return Y;
1391 }
1392
1404 template<size_t P, size_t Q, typename R = double>
1405 static constexpr void copymatrix(
1406 const ArcsMat<M,N,T>& U, const size_t m1, const size_t m2, const size_t n1, const size_t n2,
1407 ArcsMat<P,Q,R>& Y, const size_t my, const size_t ny
1408 ){
1409 static_assert(ArcsMatrix::IsApplicable<T>, "ArcsMat: Type Error"); // 対応可能型チェック
1410 static_assert(ArcsMatrix::IsApplicable<R>, "ArcsMat: Type Error"); // 対応可能型チェック
1411 arcs_assert(m1 < m2); // サイズチェック
1412 arcs_assert(n1 < n2); // サイズチェック
1413 arcs_assert(m2 <= M); // サイズチェック
1414 arcs_assert(n2 <= N); // サイズチェック
1415 arcs_assert(my+(m2-m1) <= P); // サイズチェック
1416 arcs_assert(ny+(n2-n1) <= Q); // サイズチェック
1417
1418 for(size_t i = 0; i <= (n2 - n1); ++i){
1419 for(size_t j = 0; j <= (m2 - m1); ++j){
1420 Y(my + j, ny + i) = U(m1 + j, n1 + i);
1421 }
1422 }
1423 }
1424
1430 template<size_t P, size_t Q, typename R = double>
1431 static constexpr void shiftup(const ArcsMat<M,N,T>& U, ArcsMat<P,Q,R>& Y, const size_t m = 1){
1432 static_assert(M == P, "ArcsMat: Size Error"); // 行列のサイズチェック
1433 static_assert(N == Q, "ArcsMat: Size Error"); // 行列のサイズチェック
1434 static_assert(ArcsMatrix::IsApplicable<R>, "ArcsMat: Type Error"); // 対応可能型チェック
1435
1436 // 行を上にシフトする
1437 for(size_t j = 1; j <= P - m; ++j){
1438 setrow(Y, getrow(U, j + m), j); // 横ベクトルを抽出して行に書き込み
1439 }
1440
1441 // 残りの行をゼロにする
1442 for(size_t i = 1; i <= Q; ++i){
1443 for(size_t j = P - m + 1; j <= P; ++j){
1444 Y(j,i) = (R)0;
1445 }
1446 }
1447 }
1448
1453 static constexpr ArcsMat<M,N,T> shiftup(const ArcsMat<M,N,T>& U, const size_t m = 1){
1455 shiftup(U, Y, m);
1456 return Y;
1457 }
1458
1464 template<size_t P, size_t Q, typename R = double>
1465 static constexpr void shiftdown(const ArcsMat<M,N,T>& U, ArcsMat<P,Q,R>& Y, const size_t m = 1){
1466 static_assert(M == P, "ArcsMat: Size Error"); // 行列のサイズチェック
1467 static_assert(N == Q, "ArcsMat: Size Error"); // 行列のサイズチェック
1468 static_assert(ArcsMatrix::IsApplicable<R>, "ArcsMat: Type Error"); // 対応可能型チェック
1469
1470 // 行を下にシフトする
1471 for(size_t j = m + 1; j <= P; ++j){
1472 setrow(Y, getrow(U, j - m), j); // 横ベクトルを抽出して行に書き込み
1473 }
1474
1475 // 残りの行をゼロにする
1476 for(size_t i = 1; i <= Q; ++i){
1477 for(size_t j = 1; j <= m; ++j){
1478 Y(j,i) = (R)0;
1479 }
1480 }
1481 }
1482
1487 static constexpr ArcsMat<M,N,T> shiftdown(const ArcsMat<M,N,T>& U, const size_t m = 1){
1489 shiftdown(U, Y, m);
1490 return Y;
1491 }
1492
1498 template<size_t P, size_t Q, typename R = double>
1499 static constexpr void shiftleft(const ArcsMat<M,N,T>& U, ArcsMat<P,Q,R>& Y, const size_t n = 1){
1500 static_assert(M == P, "ArcsMat: Size Error"); // 行列のサイズチェック
1501 static_assert(N == Q, "ArcsMat: Size Error"); // 行列のサイズチェック
1502 static_assert(ArcsMatrix::IsApplicable<R>, "ArcsMat: Type Error"); // 対応可能型チェック
1503
1504 // 列を左にシフトする
1505 for(size_t i = 1; i <= Q - n; ++i){
1506 setcolumn(Y, getcolumn(U, i + n), i); // 縦ベクトルを抽出して列に書き込み
1507 }
1508
1509 // 残りの列をゼロにする
1510 for(size_t i = Q - n + 1; i <= Q; ++i){
1511 for(size_t j = 1; j <= P; ++j){
1512 Y(j,i) = (R)0;
1513 }
1514 }
1515 }
1516
1521 static constexpr ArcsMat<M,N,T> shiftleft(const ArcsMat<M,N,T>& U, const size_t n = 1){
1523 shiftleft(U, Y, n);
1524 return Y;
1525 }
1526
1532 template<size_t P, size_t Q, typename R = double>
1533 static constexpr void shiftright(const ArcsMat<M,N,T>& U, ArcsMat<P,Q,R>& Y, const size_t n = 1){
1534 static_assert(M == P, "ArcsMat: Size Error"); // 行列のサイズチェック
1535 static_assert(N == Q, "ArcsMat: Size Error"); // 行列のサイズチェック
1536 static_assert(ArcsMatrix::IsApplicable<R>, "ArcsMat: Type Error"); // 対応可能型チェック
1537
1538 // 列を右にシフトする
1539 for(size_t i = n + 1; i <= Q; ++i){
1540 setcolumn(Y, getcolumn(U, i - n), i); // 縦ベクトルを抽出して列に書き込み
1541 }
1542
1543 // 残りの列をゼロにする
1544 for(size_t i = 1; i <= n; ++i){
1545 for(size_t j = 1; j <= P; ++j){
1546 Y(j,i) = (R)0;
1547 }
1548 }
1549 }
1550
1555 static constexpr ArcsMat<M,N,T> shiftright(const ArcsMat<M,N,T>& U, const size_t n = 1){
1557 shiftright(U, Y, n);
1558 return Y;
1559 }
1560
1566 template<size_t P, size_t Q, typename R = double, size_t D, size_t E, typename F = double>
1567 static constexpr void concatv(const ArcsMat<M,N,T>& U1, const ArcsMat<P,Q,R>& U2, ArcsMat<D,E,F>& Y){
1568 static_assert(N == Q, "ArcsMat: Size Error"); // 行列のサイズチェック
1569 static_assert(M + P == D, "ArcsMat: Output Size Error"); // 出力行列のサイズチェック
1570 static_assert(N == E, "ArcsMat: Output Size Error"); // 出力行列のサイズチェック
1571 static_assert(ArcsMatrix::IsApplicable<R>, "ArcsMat: Type Error"); // 対応可能型チェック
1572 static_assert(ArcsMatrix::IsApplicable<F>, "ArcsMat: Type Error"); // 対応可能型チェック
1573 ArcsMat<D,E,F>::setsubmatrix(Y, U1, 1, 1);
1574 ArcsMat<D,E,F>::setsubmatrix(Y, U2, M + 1, 1);
1575 }
1576
1582 template<size_t P, size_t Q, typename R = double>
1583 static constexpr ArcsMat<M+P,N,T> concatv(const ArcsMat<M,N,T>& U1, const ArcsMat<P,Q,R>& U2){
1585 concatv(U1, U2, Y);
1586 return Y;
1587 }
1588
1594 template<size_t P, size_t Q, typename R = double, size_t D, size_t E, typename F = double>
1595 static constexpr void concath(const ArcsMat<M,N,T>& U1, const ArcsMat<P,Q,R>& U2, ArcsMat<D,E,F>& Y){
1596 static_assert(M == P, "ArcsMat: Size Error"); // 行列のサイズチェック
1597 static_assert(N + Q == E, "ArcsMat: Output Size Error"); // 出力行列のサイズチェック
1598 static_assert(M == D, "ArcsMat: Output Size Error"); // 出力行列のサイズチェック
1599 static_assert(ArcsMatrix::IsApplicable<R>, "ArcsMat: Type Error"); // 対応可能型チェック
1600 static_assert(ArcsMatrix::IsApplicable<F>, "ArcsMat: Type Error"); // 対応可能型チェック
1601 ArcsMat<D,E,F>::setsubmatrix(Y, U1, 1, 1);
1602 ArcsMat<D,E,F>::setsubmatrix(Y, U2, 1, N + 1);
1603 }
1604
1610 template<size_t P, size_t Q, typename R = double>
1611 static constexpr ArcsMat<M,N+Q,T> concath(const ArcsMat<M,N,T>& U1, const ArcsMat<P,Q,R>& U2){
1613 concath(U1, U2, Y);
1614 return Y;
1615 }
1616
1624 template<size_t P, size_t Q, typename R = double, size_t D, size_t E, typename F = double, size_t G, size_t H, typename L = double, size_t V, size_t W, typename X = double>
1625 static constexpr void concat4(const ArcsMat<M,N,T>& U11, const ArcsMat<P,Q,R>& U12, const ArcsMat<D,E,F>& U21, const ArcsMat<G,H,L>& U22, ArcsMat<V,W,X>& Y){
1626 static_assert(M + D == P + G, "ArcsMat: Size Error"); // 行列のサイズチェック
1627 static_assert(N + Q == E + H, "ArcsMat: Size Error"); // 行列のサイズチェック
1628 static_assert(M + D == V, "ArcsMat: Output Size Error"); // 出力行列のサイズチェック
1629 static_assert(E + H == W, "ArcsMat: Output Size Error"); // 出力行列のサイズチェック
1630 static_assert(P + G == V, "ArcsMat: Output Size Error"); // 出力行列のサイズチェック
1631 static_assert(N + Q == W, "ArcsMat: Output Size Error"); // 出力行列のサイズチェック
1632 static_assert(ArcsMatrix::IsApplicable<R>, "ArcsMat: Type Error"); // 対応可能型チェック
1633 static_assert(ArcsMatrix::IsApplicable<F>, "ArcsMat: Type Error"); // 対応可能型チェック
1634 static_assert(ArcsMatrix::IsApplicable<L>, "ArcsMat: Type Error"); // 対応可能型チェック
1635 static_assert(ArcsMatrix::IsApplicable<X>, "ArcsMat: Type Error"); // 対応可能型チェック
1636 if constexpr(N == E){
1637 // 縦長行列ベースで連結する場合
1638 static_assert(Q == H, "ArcsMat: Size Error"); // 行列のサイズチェック
1639 const ArcsMat<M+D,N> Ul = ArcsMat<M,N,T>::concatv(U11, U21);
1640 const ArcsMat<P+G,Q> Ur = ArcsMat<P,Q,R>::concatv(U12, U22);
1641 ArcsMat<M+D,N>::concath(Ul, Ur, Y);
1642 }else{
1643 // 横長行列ベースで連結する場合
1644 static_assert(M == P, "ArcsMat: Size Error"); // 行列のサイズチェック
1645 static_assert(D == G, "ArcsMat: Size Error"); // 行列のサイズチェック
1646 const ArcsMat<M,N+Q> Ut = ArcsMat<M,N,T>::concath(U11, U12);
1647 const ArcsMat<D,E+H> Ub = ArcsMat<D,E,F>::concath(U21, U22);
1648 ArcsMat<M,N+Q>::concatv(Ut, Ub, Y);
1649 }
1650 }
1651
1659 template<size_t P, size_t Q, typename R = double, size_t D, size_t E, typename F = double, size_t G, size_t H, typename L = double>
1660 static constexpr ArcsMat<M+D,N+Q,T> concat4(const ArcsMat<M,N,T>& U11, const ArcsMat<P,Q,R>& U12, const ArcsMat<D,E,F>& U21, const ArcsMat<G,H,L>& U22){
1662 concat4(U11, U12, U21, U22, Y);
1663 return Y;
1664 }
1665
1671 template<size_t P, size_t Q, typename R = double>
1672 static constexpr void diag(const ArcsMat<M,N,T>& u, ArcsMat<P,Q,R>& Y){
1673 static_assert(N == 1, "ArcsMat: Vector Error"); // 縦ベクトルチェック
1674 static_assert(M == P, "ArcsMat: Size Error"); // 行列のサイズチェック
1675 static_assert(P == Q, "ArcsMat: Size Error"); // 行列のサイズチェック
1676 static_assert(ArcsMatrix::IsApplicable<R>, "ArcsMat: Type Error"); // 対応可能型チェック
1677 for(size_t j = 1; j <= M; ++j) Y(j,j) = static_cast<R>( u(j,1) );
1678 }
1679
1683 static constexpr ArcsMat<M,M,T> diag(const ArcsMat<M,N,T>& u){
1685 diag(u, Y);
1686 return Y;
1687 }
1688
1694 template<size_t P, size_t Q, typename R = double, size_t L = std::min(M,N)>
1695 static constexpr void getdiag(const ArcsMat<M,N,T>& U, ArcsMat<P,Q,R>& y, const ssize_t k = 0){
1696 static_assert(Q == 1, "ArcsMat: Vector Error"); // 縦ベクトルチェック
1697 static_assert(P == L, "ArcsMat: Size Error"); // 行列のサイズチェック
1698 static_assert(ArcsMatrix::IsApplicable<R>, "ArcsMat: Type Error"); // 対応可能型チェック
1699
1700 // オフセット条件設定
1701 size_t m = 1, j = 0, i = 0;
1702 if(0 <= k){
1703 // 主対角 or 主対角より上を取る場合
1704 j = 1;
1705 i = static_cast<size_t>( 1 + k );
1706 }else if(k < 0){
1707 // 主対角より下の対角を取る場合
1708 j = static_cast<size_t>( 1 - k );
1709 i = 1;
1710 }else{
1711 arcs_assert(false); // ここには来ない
1712 }
1713
1714 // 対角要素を抽出
1715 while((j <= M) && (i <= N)){
1716 y(m,1) = static_cast<R>( U(j,i) );
1717 ++m;
1718 ++j;
1719 ++i;
1720 }
1721 }
1722
1728 template<size_t L = std::min(M,N)>
1729 static constexpr ArcsMat<L,1,T> getdiag(const ArcsMat<M,N,T>& U, const ssize_t k = 0){
1731 getdiag(U, y, k);
1732 return y;
1733 }
1734
1738 static constexpr T trace(const ArcsMat<M,N,T>& U){
1740 return y[1];
1741 }
1742
1747 template<size_t L = std::min(M,N)>
1748 static constexpr T multdiag(const ArcsMat<M,N,T>& U){
1749 T y = 1;
1750 for(size_t j = 1; j <= L; ++j) y *= U(j,j);
1751 return y;
1752 }
1753
1757 static constexpr std::tuple<size_t,size_t> maxidx(const ArcsMat<M,N,T>& U){
1758 size_t k = 1, l = 1;
1759 for(size_t i = 1; i <= N; ++i){ // 横方向探索
1760 for(size_t j = 1; j <= M; ++j){ // 縦方向探索
1761 if constexpr(ArcsMatrix::IsComplex<T>){
1762 // 複素数版のとき
1763 if( std::abs(U(k,l)) < std::abs(U(j,i)) ){
1764 k = j;
1765 l = i;
1766 }
1767 }else{
1768 // 実数版のとき
1769 if( U(k,l) < U(j,i) ){
1770 k = j;
1771 l = i;
1772 }
1773 }
1774 }
1775 }
1776 return {k, l};
1777 }
1778
1782 static constexpr T max(const ArcsMat<M,N,T>& U){
1783 const auto ji = maxidx(U);
1784 return U(std::get<0>(ji), std::get<1>(ji));
1785 }
1786
1790 static constexpr std::tuple<size_t,size_t> minidx(const ArcsMat<M,N,T>& U){
1791 size_t k = 1, l = 1;
1792 for(size_t i = 1; i <= N; ++i){ // 横方向探索
1793 for(size_t j = 1; j <= M; ++j){ // 縦方向探索
1794 if constexpr(ArcsMatrix::IsComplex<T>){
1795 // 複素数版のとき
1796 if( std::abs(U(k,l)) > std::abs(U(j,i)) ){
1797 k = j;
1798 l = i;
1799 }
1800 }else{
1801 // 実数版のとき
1802 if( U(k,l) > U(j,i) ){
1803 k = j;
1804 l = i;
1805 }
1806 }
1807 }
1808 }
1809 return {k, l};
1810 }
1811
1815 static constexpr T min(const ArcsMat<M,N,T>& U){
1816 const auto ji = minidx(U);
1817 return U(std::get<0>(ji), std::get<1>(ji));
1818 }
1819
1823 static constexpr T sum(const ArcsMat<M,N,T>& U){
1825 return y[1];
1826 }
1827
1832 template<size_t P, size_t Q, typename R = double>
1833 static constexpr void exp(const ArcsMat<M,N,T>& U, ArcsMat<P,Q,R>& Y){
1834 static_assert(M == P, "ArcsMat: Size Error"); // 行列のサイズチェック
1835 static_assert(N == Q, "ArcsMat: Size Error"); // 行列のサイズチェック
1836 static_assert(std::is_floating_point_v<T>, "ArcsMat: Type Error (Floating Point)"); // 型チェック
1837 static_assert(std::is_floating_point_v<R>, "ArcsMat: Type Error (Floating Point)"); // 型チェック
1838 for(size_t i = 1; i <= N; ++i){
1839 for(size_t j = 1; j <= M; ++j) Y(j,i) = static_cast<R>( std::exp( U(j,i) ) );
1840 }
1841 }
1842
1846 static constexpr ArcsMat<M,N,T> exp(const ArcsMat<M,N,T>& U){
1848 ArcsMat<M,N,T>::exp(U, Y);
1849 return Y;
1850 }
1851
1856 template<size_t P, size_t Q, typename R = double>
1857 static constexpr void log(const ArcsMat<M,N,T>& U, ArcsMat<P,Q,R>& Y){
1858 static_assert(M == P, "ArcsMat: Size Error"); // 行列のサイズチェック
1859 static_assert(N == Q, "ArcsMat: Size Error"); // 行列のサイズチェック
1860 static_assert(std::is_floating_point_v<T>, "ArcsMat: Type Error (Floating Point)"); // 型チェック
1861 static_assert(std::is_floating_point_v<R>, "ArcsMat: Type Error (Floating Point)"); // 型チェック
1862 for(size_t i = 1; i <= N; ++i){
1863 for(size_t j = 1; j <= M; ++j) Y(j,i) = static_cast<R>( std::log( U(j,i) ) );
1864 }
1865 }
1866
1870 static constexpr ArcsMat<M,N,T> log(const ArcsMat<M,N,T>& U){
1872 ArcsMat<M,N,T>::log(U, Y);
1873 return Y;
1874 }
1875
1880 template<size_t P, size_t Q, typename R = double>
1881 static constexpr void log10(const ArcsMat<M,N,T>& U, ArcsMat<P,Q,R>& Y){
1882 static_assert(M == P, "ArcsMat: Size Error"); // 行列のサイズチェック
1883 static_assert(N == Q, "ArcsMat: Size Error"); // 行列のサイズチェック
1884 static_assert(std::is_floating_point_v<T>, "ArcsMat: Type Error (Floating Point)"); // 型チェック
1885 static_assert(std::is_floating_point_v<R>, "ArcsMat: Type Error (Floating Point)"); // 型チェック
1886 for(size_t i = 1; i <= N; ++i){
1887 for(size_t j = 1; j <= M; ++j) Y(j,i) = static_cast<R>( std::log10( U(j,i) ) );
1888 }
1889 }
1890
1894 static constexpr ArcsMat<M,N,T> log10(const ArcsMat<M,N,T>& U){
1897 return Y;
1898 }
1899
1904 template<size_t P, size_t Q, typename R = double>
1905 static constexpr void sin(const ArcsMat<M,N,T>& U, ArcsMat<P,Q,R>& Y){
1906 static_assert(M == P, "ArcsMat: Size Error"); // 行列のサイズチェック
1907 static_assert(N == Q, "ArcsMat: Size Error"); // 行列のサイズチェック
1908 static_assert(std::is_floating_point_v<T>, "ArcsMat: Type Error (Floating Point)"); // 型チェック
1909 static_assert(std::is_floating_point_v<R>, "ArcsMat: Type Error (Floating Point)"); // 型チェック
1910 for(size_t i = 1; i <= N; ++i){
1911 for(size_t j = 1; j <= M; ++j) Y(j,i) = static_cast<R>( std::sin( U(j,i) ) );
1912 }
1913 }
1914
1918 static constexpr ArcsMat<M,N,T> sin(const ArcsMat<M,N,T>& U){
1920 ArcsMat<M,N,T>::sin(U, Y);
1921 return Y;
1922 }
1923
1928 template<size_t P, size_t Q, typename R = double>
1929 static constexpr void cos(const ArcsMat<M,N,T>& U, ArcsMat<P,Q,R>& Y){
1930 static_assert(M == P, "ArcsMat: Size Error"); // 行列のサイズチェック
1931 static_assert(N == Q, "ArcsMat: Size Error"); // 行列のサイズチェック
1932 static_assert(std::is_floating_point_v<T>, "ArcsMat: Type Error (Floating Point)"); // 型チェック
1933 static_assert(std::is_floating_point_v<R>, "ArcsMat: Type Error (Floating Point)"); // 型チェック
1934 for(size_t i = 1; i <= N; ++i){
1935 for(size_t j = 1; j <= M; ++j) Y(j,i) = static_cast<R>( std::cos( U(j,i) ) );
1936 }
1937 }
1938
1942 static constexpr ArcsMat<M,N,T> cos(const ArcsMat<M,N,T>& U){
1944 ArcsMat<M,N,T>::cos(U, Y);
1945 return Y;
1946 }
1947
1952 template<size_t P, size_t Q, typename R = double>
1953 static constexpr void tan(const ArcsMat<M,N,T>& U, ArcsMat<P,Q,R>& Y){
1954 static_assert(M == P, "ArcsMat: Size Error"); // 行列のサイズチェック
1955 static_assert(N == Q, "ArcsMat: Size Error"); // 行列のサイズチェック
1956 static_assert(std::is_floating_point_v<T>, "ArcsMat: Type Error (Floating Point)"); // 型チェック
1957 static_assert(std::is_floating_point_v<R>, "ArcsMat: Type Error (Floating Point)"); // 型チェック
1958 for(size_t i = 1; i <= N; ++i){
1959 for(size_t j = 1; j <= M; ++j) Y(j,i) = static_cast<R>( std::tan( U(j,i) ) );
1960 }
1961 }
1962
1966 static constexpr ArcsMat<M,N,T> tan(const ArcsMat<M,N,T>& U){
1968 ArcsMat<M,N,T>::tan(U, Y);
1969 return Y;
1970 }
1971
1976 template<size_t P, size_t Q, typename R = double>
1977 static constexpr void tanh(const ArcsMat<M,N,T>& U, ArcsMat<P,Q,R>& Y){
1978 static_assert(M == P, "ArcsMat: Size Error"); // 行列のサイズチェック
1979 static_assert(N == Q, "ArcsMat: Size Error"); // 行列のサイズチェック
1980 static_assert(std::is_floating_point_v<T>, "ArcsMat: Type Error (Floating Point)"); // 型チェック
1981 static_assert(std::is_floating_point_v<R>, "ArcsMat: Type Error (Floating Point)"); // 型チェック
1982 for(size_t i = 1; i <= N; ++i){
1983 for(size_t j = 1; j <= M; ++j) Y(j,i) = static_cast<R>( std::tanh( U(j,i) ) );
1984 }
1985 }
1986
1990 static constexpr ArcsMat<M,N,T> tanh(const ArcsMat<M,N,T>& U){
1993 return Y;
1994 }
1995
2000 template<size_t P, size_t Q, typename R = double>
2001 static constexpr void sqrt(const ArcsMat<M,N,T>& U, ArcsMat<P,Q,R>& Y){
2002 static_assert(M == P, "ArcsMat: Size Error"); // 行列のサイズチェック
2003 static_assert(N == Q, "ArcsMat: Size Error"); // 行列のサイズチェック
2004 for(size_t i = 1; i <= N; ++i){
2005 for(size_t j = 1; j <= M; ++j) Y(j,i) = static_cast<R>( std::sqrt( U(j,i) ) );
2006 }
2007 }
2008
2012 static constexpr ArcsMat<M,N,T> sqrt(const ArcsMat<M,N,T>& U){
2015 return Y;
2016 }
2017
2022 template<size_t P, size_t Q, typename R = double>
2023 static constexpr void sign(const ArcsMat<M,N,T>& U, ArcsMat<P,Q,R>& Y){
2024 static_assert(M == P, "ArcsMat: Size Error"); // 行列のサイズチェック
2025 static_assert(N == Q, "ArcsMat: Size Error"); // 行列のサイズチェック
2026 for(size_t i = 1; i <= N; ++i){
2027 for(size_t j = 1; j <= M; ++j) Y(j,i) = static_cast<R>( ArcsMat<M,N,T>::sgn( U(j,i) ) );
2028 }
2029 }
2030
2034 static constexpr ArcsMat<M,N,T> sign(const ArcsMat<M,N,T>& U){
2037 return Y;
2038 }
2039
2044 template<size_t P, size_t Q, typename R = double>
2045 static constexpr void abs(const ArcsMat<M,N,T>& U, ArcsMat<P,Q,R>& Y){
2046 static_assert(M == P, "ArcsMat: Size Error"); // 行列のサイズチェック
2047 static_assert(N == Q, "ArcsMat: Size Error"); // 行列のサイズチェック
2048 for(size_t i = 1; i <= N; ++i){
2049 for(size_t j = 1; j <= M; ++j) Y(j,i) = static_cast<R>( std::abs( U(j,i) ) );
2050 }
2051 }
2052
2057 template<typename R = double>
2058 static constexpr ArcsMat<M,N,R> abs(const ArcsMat<M,N,T>& U){
2060 ArcsMat<M,N,T>::abs(U, Y);
2061 return Y;
2062 }
2063
2068 template<size_t P, size_t Q, typename R = double>
2069 static constexpr void arg(const ArcsMat<M,N,T>& U, ArcsMat<P,Q,R>& Y){
2070 static_assert(M == P, "ArcsMat: Size Error"); // 行列のサイズチェック
2071 static_assert(N == Q, "ArcsMat: Size Error"); // 行列のサイズチェック
2072 static_assert(ArcsMatrix::IsComplex<T>, "ArcsMat: Type Error (Need Complex)");
2073 static_assert(ArcsMatrix::IsIntFloat<R>, "ArcsMat: Type Error (Need Integer or Float)");
2074 for(size_t i = 1; i <= N; ++i){
2075 for(size_t j = 1; j <= M; ++j) Y(j,i) = static_cast<R>( std::arg( U(j,i) ) );
2076 }
2077 }
2078
2083 template<size_t P, size_t Q, typename R = double>
2084 static constexpr void real(const ArcsMat<M,N,T>& U, ArcsMat<P,Q,R>& Y){
2085 static_assert(M == P, "ArcsMat: Size Error"); // 行列のサイズチェック
2086 static_assert(N == Q, "ArcsMat: Size Error"); // 行列のサイズチェック
2087 static_assert(ArcsMatrix::IsComplex<T>, "ArcsMat: Type Error (Need Complex)");
2088 static_assert(ArcsMatrix::IsIntFloat<R>, "ArcsMat: Type Error (Need Integer or Float)");
2089 for(size_t i = 1; i <= N; ++i){
2090 for(size_t j = 1; j <= M; ++j) Y(j,i) = static_cast<R>( std::real( U(j,i) ) );
2091 }
2092 }
2093
2098 template<size_t P, size_t Q, typename R = double>
2099 static constexpr void imag(const ArcsMat<M,N,T>& U, ArcsMat<P,Q,R>& Y){
2100 static_assert(M == P, "ArcsMat: Size Error"); // 行列のサイズチェック
2101 static_assert(N == Q, "ArcsMat: Size Error"); // 行列のサイズチェック
2102 static_assert(ArcsMatrix::IsComplex<T>, "ArcsMat: Type Error (Need Complex)");
2103 static_assert(ArcsMatrix::IsIntFloat<R>, "ArcsMat: Type Error (Need Integer or Float)");
2104 for(size_t i = 1; i <= N; ++i){
2105 for(size_t j = 1; j <= M; ++j) Y(j,i) = static_cast<R>( std::imag( U(j,i) ) );
2106 }
2107 }
2108
2113 template<size_t P, size_t Q, typename R = std::complex<double>>
2114 static constexpr void conj(const ArcsMat<M,N,T>& U, ArcsMat<P,Q,R>& Y){
2115 static_assert(M == P, "ArcsMat: Size Error"); // 行列のサイズチェック
2116 static_assert(N == Q, "ArcsMat: Size Error"); // 行列のサイズチェック
2117 static_assert(ArcsMatrix::IsComplex<T>, "ArcsMat: Type Error (Need Complex)");
2118 static_assert(ArcsMatrix::IsComplex<R>, "ArcsMat: Type Error (Need Complex)");
2119 for(size_t i = 1; i <= N; ++i){
2120 for(size_t j = 1; j <= M; ++j) Y(j,i) = static_cast<R>( std::conj( U(j,i) ) );
2121 }
2122 }
2123
2127 static constexpr ArcsMat<M,N,T> conj(const ArcsMat<M,N,T>& U){
2128 ArcsMat<M,N,T> ret;
2129 ArcsMat<M,N,T>::conj(U, ret);
2130 return ret;
2131 }
2132
2137 template<size_t P, size_t Q, typename R = double>
2138 static constexpr void tp(const ArcsMat<M,N,T>& U, ArcsMat<P,Q,R>& Y){
2139 static_assert(M == Q, "ArcsMat: Transpose Size Error"); // 転置サイズチェック
2140 static_assert(N == P, "ArcsMat: Transpose Size Error"); // 転置サイズチェック
2141 static_assert(ArcsMatrix::IsApplicable<R>, "ArcsMat: Type Error"); // 対応可能型チェック
2142 for(size_t i = 1; i <= N; ++i){
2143 for(size_t j = 1; j <= M; ++j) Y(i,j) = static_cast<R>( U(j,i) );
2144 }
2145 }
2146
2150 static constexpr ArcsMat<N,M,T> tp(const ArcsMat<M,N,T>& U){
2151 ArcsMat<N,M,T> ret;
2152 ArcsMat<M,N,T>::tp(U, ret);
2153 return ret;
2154 }
2155
2160 template<size_t P, size_t Q, typename R = std::complex<double>>
2161 static constexpr void Htp(const ArcsMat<M,N,T>& U, ArcsMat<P,Q,R>& Y){
2162 static_assert(ArcsMatrix::IsComplex<T>, "ArcsMat: Type Error (Need Complex)");
2163 static_assert(ArcsMatrix::IsComplex<R>, "ArcsMat: Type Error (Need Complex)");
2164 ArcsMat<M,N,T>::tp(ArcsMat<M,N,T>::conj(U), Y); // 複素共役して転置
2165 }
2166
2170 static constexpr ArcsMat<N,M,T> Htp(const ArcsMat<M,N,T>& U){
2171 ArcsMat<N,M,T> ret;
2172 ArcsMat<M,N,T>::Htp(U, ret);
2173 return ret;
2174 }
2175
2178 constexpr ArcsMat<N,M,T> operator~(void) const{
2179 ArcsMat<N,M,T> ret;
2180 if constexpr(ArcsMatrix::IsComplex<T>){
2181 // 複素数型の場合
2182 ret = Htp(*this); // エルミート転置して返す
2183 }else{
2184 // それ以外の型の場合
2185 ret = tp(*this); // 普通に転置して返す
2186 }
2187 return ret;
2188 }
2189
2194 template<ArcsMatrix::NormType NRM = ArcsMatrix::NormType::AMT_L2, typename R = double>
2195 static constexpr R norm(const ArcsMat<M,N,T>& U){
2196 R ret = 0;
2197 if constexpr(NRM == ArcsMatrix::NormType::AMT_L2){
2198 // ユークリッドノルム(2-ノルム)が指定されたとき
2199 if constexpr(M == 1 || N == 1){
2200 // ベクトル版
2202 ret = std::sqrt( ArcsMat<M,N,R>::sum( v & v ) );
2203 }else{
2204 // 行列版
2205 const auto [W, S, V] = ArcsMat<M,N,T>::SVD(U);
2206 ret = std::abs( ArcsMat<M,N,T>::max(S) );
2207 }
2208 }else if constexpr(NRM == ArcsMatrix::NormType::AMT_L1){
2209 // 絶対値ノルム(1-ノルム)が指定されたとき
2210 if constexpr(M == 1 || N == 1){
2211 // ベクトル版
2213 }else{
2214 // 行列版
2216 }
2217 }else if constexpr(NRM == ArcsMatrix::NormType::AMT_LINF){
2218 // 無限大ノルム(最大値ノルム)が指定されたとき
2219 if constexpr(M == 1 || N == 1){
2220 // ベクトル版
2222 }else{
2223 // 行列版
2225 }
2226 }else{
2227 arcs_assert(false); // ここには来ない
2228 }
2229 return ret;
2230 }
2231
2237 template<size_t P, size_t Q, typename R = double>
2238 static constexpr void gettriup(const ArcsMat<M,N,T>& U, ArcsMat<P,Q,R>& Y, const size_t n = 1){
2239 static_assert(M == P, "ArcsMat: Size Error"); // 行列のサイズチェック
2240 static_assert(N == Q, "ArcsMat: Size Error"); // 行列のサイズチェック
2241 static_assert(ArcsMatrix::IsApplicable<R>, "ArcsMat: Type Error"); // 対応可能型チェック
2242
2243 for(size_t j = 1; j <= M; ++j){
2244 for(size_t i = j + n - 1; i <= N; ++i){
2245 Y(j,i) = static_cast<R>( U(j,i) );
2246 }
2247 }
2248 }
2249
2254 static constexpr ArcsMat<M,N,T> gettriup(const ArcsMat<M,N,T>& U, const size_t n = 1){
2256 gettriup(U, Y, n);
2257 return Y;
2258 }
2259
2265 template<size_t P, size_t Q, typename R = double>
2266 static constexpr void gettrilo(const ArcsMat<M,N,T>& U, ArcsMat<P,Q,R>& Y, const size_t m = 1){
2267 static_assert(M == P, "ArcsMat: Size Error"); // 行列のサイズチェック
2268 static_assert(N == Q, "ArcsMat: Size Error"); // 行列のサイズチェック
2269 static_assert(ArcsMatrix::IsApplicable<R>, "ArcsMat: Type Error"); // 対応可能型チェック
2270
2271 for(size_t i = 1; i <= N; ++i){
2272 for(size_t j = i + m - 1; j <= M; ++j){
2273 Y(j,i) = static_cast<R>( U(j,i) );
2274 }
2275 }
2276 }
2277
2282 static constexpr ArcsMat<M,N,T> gettrilo(const ArcsMat<M,N,T>& U, const size_t m = 1){
2284 gettrilo(U, Y, m);
2285 return Y;
2286 }
2287
2294 template<size_t ML, size_t NL, typename TL = double, size_t MU, size_t NU, typename TU = double, size_t MP, size_t NP, typename TP = double>
2295 static constexpr void LUP(const ArcsMat<M,N,T>& A, ArcsMat<ML,NL,TL>& L, ArcsMat<MU,NU,TU>& U, ArcsMat<MP,NP,TP>& P){
2296 static_assert(M == N, "ArcsMat: Size Error"); // 正方行列チェック
2297 static_assert(ML == NL, "ArcsMat: Size Error"); // 正方行列チェック
2298 static_assert(MU == NU, "ArcsMat: Size Error"); // 正方行列チェック
2299 static_assert(MP == NP, "ArcsMat: Size Error"); // 正方行列チェック
2300 static_assert(M == ML, "ArcsMat: Size Error"); // 行列のサイズチェック
2301 static_assert(N == NL, "ArcsMat: Size Error"); // 行列のサイズチェック
2302 static_assert(M == MU, "ArcsMat: Size Error"); // 行列のサイズチェック
2303 static_assert(N == NU, "ArcsMat: Size Error"); // 行列のサイズチェック
2304 static_assert(M == MP, "ArcsMat: Size Error"); // 行列のサイズチェック
2305 static_assert(N == NP, "ArcsMat: Size Error"); // 行列のサイズチェック
2306 static_assert(ArcsMatrix::IsApplicable<TL>, "ArcsMat: Type Error"); // 対応可能型チェック
2307 static_assert(ArcsMatrix::IsApplicable<TU>, "ArcsMat: Type Error"); // 対応可能型チェック
2308 static_assert(ArcsMatrix::IsApplicable<TP>, "ArcsMat: Type Error"); // 対応可能型チェック
2309
2310 // 中間変数
2311 ArcsMat<M,N,T> X = A; // 行列操作用にコピー
2312 size_t perm_count = 0; // 入れ替えカウンタ
2313 double max_buff = 0; // 最大値バッファ
2314 P = ArcsMat<M,N,T>::eye(); // 置換行列の準備
2315
2316 // 列ごとに処理を実施
2317 size_t k = 0;
2318 for(size_t i = 1; i <= N; ++i){
2319 // i列目の中での最大値を探す
2320 k = i; // 対角要素の縦位置で初期化
2321 max_buff = static_cast<double>( std::abs(X(i,i)) ); // 対角要素の値で初期化
2322 for(size_t j = i + 1; j <= M; ++j){
2323 if(max_buff < static_cast<double>( std::abs(X(j,i)) )){ // スキャン中における最大値か判定
2324 k = j; // 最大値の候補の縦位置
2325 max_buff = static_cast<double>( std::abs(X(j,i)) ); // 最大値の候補であればその値を記憶
2326 }
2327 }
2328
2329 // 対角要素が最大値でなければ、対角要素が最大となるように行丸ごと入れ替え
2330 if(k != i){
2331 ArcsMat<M,N,T>::swaprow(X, i, k); // 対角要素の行と最大値の行を入れ替え
2332 ArcsMat<M,N,T>::swaprow(P, i, k); // 置換行列も同じ様に入れ替え
2333 perm_count++; // 入れ替えカウンタ
2334 }
2335
2336 // LU分解のコア部分
2337 if( std::abs( X(i,i) ) < EPSILON ){
2338 // 対角要素が零なら,i列目においてはLU分解は完了
2339 }else{
2340 for(size_t j = i + 1; j <= M; ++j){
2341 X(j,i) /= X(i,i); // 対角要素で除算
2342 for(size_t l = i + 1; l <= N; ++l){
2343 X(j,l) -= X(j,i)*X(i,l);
2344 }
2345 }
2346 }
2347 }
2348
2349 // 下三角行列と上三角行列に分離する
2350 ArcsMat<M,N,T>::gettrilo(X, L); // 下三角のみを抽出
2351 ArcsMat<M,N,T>::gettriup(X, U); // 上三角のみを抽出
2352 for(size_t j = 1; j <= M; ++j) L(j,j) = 1; // 下三角行列の対角要素はすべて1
2353
2354 // 入れ替え回数の判定と判定結果の保持
2355 if(perm_count % 2 == 0){
2356 P.Status = ArcsMatrix::MatStatus::AMT_LU_EVEN; // 偶数のとき
2357 }else{
2358 P.Status = ArcsMatrix::MatStatus::AMT_LU_ODD; // 奇数のとき
2359 }
2360 }
2361
2365 static constexpr std::tuple<ArcsMat<M,N,T>, ArcsMat<M,N,T>, ArcsMat<M,N,T>> LUP(const ArcsMat<M,N,T>& A){
2366 ArcsMat<M,N,T> L, U, P;
2367 ArcsMat<M,N,T>::LUP(A, L, U, P);
2368 return {L, U, P};
2369 }
2370
2376 template<size_t ML, size_t NL, typename TL = double, size_t MU, size_t NU, typename TU = double>
2377 static constexpr void LU(const ArcsMat<M,N,T>& A, ArcsMat<ML,NL,TL>& L, ArcsMat<MU,NU,TU>& U){
2379 ArcsMat<M,N,T>::LUP(A, L, U, P);
2380 L = tp(P)*L;
2381 }
2382
2386 static constexpr std::tuple<ArcsMat<M,N,T>, ArcsMat<M,N,T>> LU(const ArcsMat<M,N,T>& A){
2387 ArcsMat<M,N,T> L, U;
2388 ArcsMat<M,N,T>::LU(A, L, U);
2389 return {L, U};
2390 }
2391
2395 static constexpr T det(const ArcsMat<M,N,T>& A){
2396 static_assert(M == N, "ArcsMat: Size Error"); // 正方行列チェック
2397
2398 // |A| = |L||U| でしかも |L|と|U|は対角要素の総積に等しく,さらにLの対角要素は1なので|L|は省略可。
2399 // LU分解の際に内部で並べ替える毎に符号が変わるので、並べ替え回数によって符号反転をする。
2400 const auto [L, U, P] = LUP(A); // LU分解
2401 if(P.Status == ArcsMatrix::MatStatus::AMT_LU_ODD){ // LU分解の符号判定
2402 return -ArcsMat<M,N,T>::multdiag(U); // 奇数のとき
2403 }else if(P.Status == ArcsMatrix::MatStatus::AMT_LU_EVEN){
2404 return ArcsMat<M,N,T>::multdiag(U); // 偶数のとき
2405 }else{
2406 arcs_assert(false); // ここには来ない
2407 }
2408 }
2409
2415 template<size_t MH, size_t NH, typename TH = double>
2416 static constexpr void Householder(const ArcsMat<M,N,T>& v, ArcsMat<MH,NH,TH>& H, const size_t k = 1){
2417 static_assert(N == 1, "ArcsMat: Vector Error"); // 縦ベクトルチェック
2418 static_assert(M == MH, "ArcsMat: Size Error"); // 行列のサイズチェック
2419 static_assert(MH == NH, "ArcsMat: Size Error"); // 行列のサイズチェック
2420 static_assert(ArcsMatrix::IsApplicable<T>, "ArcsMat: Type Error"); // 対応可能型チェック
2421 static_assert(ArcsMatrix::IsApplicable<TH>, "ArcsMat: Type Error"); // 対応可能型チェック
2422 arcs_assert(k <= M); // 次元チェック
2423
2424 const auto I = ArcsMat<MH,NH,TH>::eye(); // [C++20移行時にconstexprに改修]
2425 auto vHv = ~v*v;
2426 if( std::abs(vHv[1]) != 0 ){
2427 H = I - 2.0*v*~v/vHv[1];
2428 }else{
2429 H = I - 2.0*v*~v;
2430 }
2431 H = ArcsMat<M,M,T>::shiftdown(H, k);
2433 for(size_t i = 1; i <= k; ++i) H(i,i) = 1;
2434 }
2435
2440 static constexpr ArcsMat<M,M,T> Householder(const ArcsMat<M,N,T>& v, const size_t k = 1){
2443 return H;
2444 }
2445
2452 template<size_t MQ, size_t NQ, typename TQ = double, size_t MR, size_t NR, typename TR = double>
2453 static constexpr void QR(const ArcsMat<M,N,T>& A, ArcsMat<MQ,NQ,TQ>& Q, ArcsMat<MR,NR,TR>& R){
2454 static_assert(MQ == NQ, "ArcsMat: Size Error"); // 正方行列チェック
2455 static_assert(M == MQ, "ArcsMat: Size Error"); // 行列のサイズチェック
2456 static_assert(M == MR, "ArcsMat: Size Error"); // 行列のサイズチェック
2457 static_assert(N == NR, "ArcsMat: Size Error"); // 行列のサイズチェック
2458 static_assert(ArcsMatrix::IsApplicable<TQ>, "ArcsMat: Type Error"); // 対応可能型チェック
2459 static_assert(ArcsMatrix::IsApplicable<TR>, "ArcsMat: Type Error"); // 対応可能型チェック
2460
2461 // 事前準備
2462 constexpr size_t K = std::min(M,N); // 縦長か横長か、短い方をKとする
2463 constexpr ArcsMat<M,1,T> e = {1}; // 単位ベクトルを生成
2464 ArcsMat<M,1,T> a, v; // "Householder Reflections"のベクトル
2465 ArcsMat<M,M,T> H; // Householder行列
2467 R = A;
2468
2469 // "Householder Reflections"を使ったQR分解アルゴリズム(複素数・実数両対応版)
2470 for(size_t k = 1; k <= K; ++k){
2471 a = ArcsMat<M,N,T>::getcolumn(R, k);
2472 a = ArcsMat<M,1,T>::shiftup(a, k - 1);
2473
2474 // 単位行列部分の生成を実数と複素数で変える
2475 if constexpr(ArcsMatrix::IsComplex<T>){
2476 // 複素数の場合
2477 v = a + std::exp( std::complex( 0.0, std::arg(a[1])) )*std::sqrt( (~a*a)[1] )*e;
2478 }else{
2479 // 実数の場合
2480 v = a + ArcsMat<M,N,T>::sgn(a[1])*std::sqrt( (~a*a)[1] )*e;
2481 }
2482
2483 ArcsMat<M,1,T>::Householder(v, H, k - 1); // ハウスホルダー行列を生成
2484 R = H*R;
2485 Q = Q*~H;
2486 }
2487
2488 // Aが縦長を除き、且つ複素数の場合にはRの対角項を実数に変換
2489 /* (複素Schur分解で不具合が出たのでPending)
2490 if constexpr( (M <= N) && ArcsMatrix::IsComplex<T>){
2491 const auto l = ArcsMat<K,1,T>::ones(); // [C++20移行時にconstexprに改修]
2492 const auto d = ArcsMat<K,1,T>::sign( ArcsMat<MR,NR,T>::getdiag(R) );
2493 const auto di = l % d;
2494 const auto D = ArcsMat<K,1,T>::diag(d);
2495 const auto Di = ArcsMat<K,1,T>::diag(di);
2496 Q = Q*D;
2497 R = Di*R;
2498 }
2499 */
2500 R.ZeroingTriLo(); // 主対角より下の下三角のゼロイング
2501 }
2502
2506 static constexpr std::tuple<ArcsMat<M,M,T>, ArcsMat<M,N,T>> QR(const ArcsMat<M,N,T>& A){
2509 ArcsMat<M,N,T>::QR(A, Q, R);
2510 return {Q, R};
2511 }
2512
2521 template<
2522 size_t LoopMax = 100*std::max(M,N),
2523 size_t MU, size_t NU, typename TU = double, size_t MS, size_t NS, typename TS = double,
2524 size_t MV, size_t NV, typename TV = double
2525 >
2526 static constexpr void SVD(const ArcsMat<M,N,T>& A, ArcsMat<MU,NU,TU>& U, ArcsMat<MS,NS,TS>& S, ArcsMat<MV,NV,TV>& V){
2527 static_assert(MU == NU, "ArcsMat: Size Error"); // 正方行列チェック
2528 static_assert(MV == NV, "ArcsMat: Size Error"); // 正方行列チェック
2529 static_assert(M == MU, "ArcsMat: Size Error"); // 行列のサイズチェック
2530 static_assert(M == MS, "ArcsMat: Size Error"); // 行列のサイズチェック
2531 static_assert(N == NS, "ArcsMat: Size Error"); // 行列のサイズチェック
2532 static_assert(N == NV, "ArcsMat: Size Error"); // 行列のサイズチェック
2533 static_assert(ArcsMatrix::IsApplicable<TU>, "ArcsMat: Type Error"); // 対応可能型チェック
2534 static_assert(ArcsMatrix::IsApplicable<TS>, "ArcsMat: Type Error"); // 対応可能型チェック
2535 static_assert(ArcsMatrix::IsApplicable<TV>, "ArcsMat: Type Error"); // 対応可能型チェック
2536
2537 // 初期化
2538 ArcsMat<N,M,T> Snm;
2539 ArcsMat<M,M,T> Qm;
2540 ArcsMat<N,N,T> Qn;
2541 U = ArcsMat<M,M,T>::eye();
2542 V = ArcsMat<N,N,T>::eye();
2543 S = A;
2544 T E = 0, F = 0;
2545
2546 // ループ打ち切り最大回数に達するまでループ
2547 for(size_t i = 0; i < LoopMax; ++i){
2548 // MATLABに準拠するために縦長か横長かで漸化式の順序を変える
2549 if constexpr( N <= M ){
2550 // 正方および縦長の場合
2551 ArcsMat<M,N,T>::QR(S, Qm, S);
2552 ArcsMat<N,M,T>::QR(~S, Qn, Snm);
2553 S = ~Snm;
2554 }else{
2555 // 横長の場合
2556 ArcsMat<N,M,T>::QR(~S, Qn, Snm);
2557 S = ~Snm;
2558 ArcsMat<M,N,T>::QR(S, Qm, S);
2559 }
2560 U = U*Qm;
2561 V = V*Qn;
2563 F = ArcsMat<std::min(M,N),1,T>::template norm<ArcsMatrix::NormType::AMT_LINF>( ArcsMat<N,M,T>::getdiag(Snm) );
2564 if(std::abs(E - F) < EPSILON) break; // 誤差がイプシロンを下回ったらループ打ち切り
2565 //printf("%zu: %f\n", i, std::abs(E - F)); // 誤差確認用コード
2566 }
2567
2568 // 符号修正
2569 for(size_t k = 1; k <= std::min(M,N); ++k){
2570 if( std::real(sgn( S(k,k) )) < 0){
2571 S(k,k) = -S(k,k);
2573 }
2574 }
2575
2576 // Aが正方で且つ複素数の場合には、MATLABに準拠させるための等価変換を実行
2577 if constexpr((M == N) && ArcsMatrix::IsComplex<T>){
2578 const auto l = ArcsMat<1,NV,T>::ones(); // [C++20移行時にconstexprに改修]
2579 const ArcsMat<1,NV,TV> d = l % ArcsMat<1,NV,TV>::sign( ArcsMat<MV,NV,TV>::getrow(V, 1) ); // V行列の一番上の横ベクトルの符号の逆数を計算
2580 for(size_t i = 1; i <= NV; ++i){
2581 ArcsMat<MU,NU,TU>::setcolumn(U, d(1,i)*ArcsMat<MU,NU,TU>::getcolumn(U, i), i); // U行列の等価変換
2582 ArcsMat<MV,NV,TV>::setcolumn(V, d(1,i)*ArcsMat<MV,NV,TV>::getcolumn(V, i), i); // V行列の等価変換
2583 }
2584 }
2585 }
2586
2590 static constexpr std::tuple<ArcsMat<M,M,T>, ArcsMat<M,N,T>, ArcsMat<N,N,T>> SVD(const ArcsMat<M,N,T>& A){
2594 SVD(A, U, S, V);
2595 return {U, S, V};
2596 }
2597
2602 static constexpr size_t rank(const ArcsMat<M,N,T>& A, const T eps = ArcsMat<M,N,T>::EPSILON){
2603 static_assert(ArcsMatrix::IsApplicable<T>, "ArcsMat: Type Error"); // 対応可能型チェック
2604 const auto [U, S, V] = ArcsMat<M,N,T>::SVD(A); // まず、特異値分解して,
2605 const auto s = ArcsMat<M,N,T>::getdiag(S); // 次に、S行列の対角要素を抜き出して、
2606 return s.GetNumOfNonZero(eps); // 最後に、非ゼロ要素の数をカウントするとそれが階数と等価
2607 }
2608
2614 template<size_t ML, size_t NL, typename TL = double, size_t MD, size_t ND, typename TD = double>
2615 static constexpr void LDL(const ArcsMat<M,N,T>& A, ArcsMat<ML,NL,TL>& L, ArcsMat<MD,ND,TD>& D){
2616 static_assert(M == N, "ArcsMat: Size Error"); // 正方行列チェック
2617 static_assert(ML == M, "ArcsMat: Size Error"); // 正方行列チェック
2618 static_assert(NL == N, "ArcsMat: Size Error"); // 行列のサイズチェック
2619 static_assert(MD == M, "ArcsMat: Size Error"); // 行列のサイズチェック
2620 static_assert(ND == N, "ArcsMat: Size Error"); // 行列のサイズチェック
2621 static_assert(ArcsMatrix::IsApplicable<T>, "ArcsMat: Type Error"); // 対応可能型チェック
2622 static_assert(ArcsMatrix::IsApplicable<TL>, "ArcsMat: Type Error"); // 対応可能型チェック
2623 static_assert(ArcsMatrix::IsApplicable<TD>, "ArcsMat: Type Error"); // 対応可能型チェック
2624 L(1,1) = A(1,1);
2625 D(1,1) = static_cast<T>(1)/L(1,1);
2626
2627 for(size_t i = 2; i <= N; ++i){
2628 for(size_t j = 1; j <= i; ++j){
2629 T lld = A(i,j);
2630 for(size_t k = 1; k < j; ++k){
2631 lld -= L(i,k)*L(j,k)*D(k,k);
2632 }
2633 L(i,j) = lld;
2634 }
2635 D(i,i) = static_cast<T>(1)/L(i,i);
2636 }
2637
2638 // MATLABに準拠させるための等価変換を実行
2639 const auto l = ArcsMat<M,1,T>::ones(); // [C++20移行時にconstexprに改修]
2640 const ArcsMat<M,1,T> d = l % ArcsMat<M,N,T>::getdiag(D); // 対角要素の逆数を抽出
2641 L = L*D;
2642 D = ArcsMat<M,1,T>::diag(d);
2643 }
2644
2648 static constexpr std::tuple<ArcsMat<M,N,T>, ArcsMat<M,N,T>> LDL(const ArcsMat<M,N,T>& A){
2649 ArcsMat<M,N,T> L, D;
2650 ArcsMat<M,N,T>::LDL(A, L, D);
2651 return {L, D};
2652 }
2653
2658 template<size_t ML, size_t NL, typename TL = double>
2659 static constexpr void Cholesky(const ArcsMat<M,N,T>& A, ArcsMat<ML,NL,TL>& R){
2660 static_assert(M == N, "ArcsMat: Size Error"); // 正方行列チェック
2661 static_assert(ML == M, "ArcsMat: Size Error"); // 正方行列チェック
2662 static_assert(NL == N, "ArcsMat: Size Error"); // 行列のサイズチェック
2663 static_assert(ArcsMatrix::IsApplicable<T>, "ArcsMat: Type Error"); // 対応可能型チェック
2664 static_assert(ArcsMatrix::IsApplicable<TL>, "ArcsMat: Type Error"); // 対応可能型チェック
2665 ArcsMat<M,N,T> L, D;
2666 ArcsMat<M,N,T>::LDL(A, L, D); // まず、LDL分解してから、
2667 L = L*ArcsMat<M,N,T>::sqrt(D); // 次に、対角行列の平方根を取って、下三角行列に掛けたものを出力
2668 R = ArcsMat<M,N,T>::tp(L); // MATLABに準拠させるための等価変換を実行
2669 }
2670
2674 static constexpr ArcsMat<M,N,T> Cholesky(const ArcsMat<M,N,T>& A){
2677 return R;
2678 }
2679
2685 template<size_t MB, size_t NB, typename TB = double, size_t MX, size_t NX, typename TX = double>
2686 static constexpr void linsolve_vec(const ArcsMat<M,N,T>& A, const ArcsMat<MB,NB,TB>& b, ArcsMat<MX,NX,TX>& x){
2687 static_assert(M == N, "ArcsMat: Size Error"); // 正方行列チェック
2688 static_assert(MB == M, "ArcsMat: Size Error"); // 行列のサイズチェック
2689 static_assert(MX == N, "ArcsMat: Size Error"); // 行列のサイズチェック
2690 static_assert(NB == 1, "ArcsMat: Vector Error"); // 縦ベクトルチェック
2691 static_assert(NX == 1, "ArcsMat: Vector Error"); // 縦ベクトルチェック
2692 static_assert(ArcsMatrix::IsApplicable<T>, "ArcsMat: Type Error"); // 対応可能型チェック
2693 static_assert(ArcsMatrix::IsApplicable<TB>, "ArcsMat: Type Error"); // 対応可能型チェック
2694 static_assert(ArcsMatrix::IsApplicable<TX>, "ArcsMat: Type Error"); // 対応可能型チェック
2695
2696 // まず、Ax = b の A をLUP分解すると、
2697 //  Ax = b → P'LUx = b → PP'LUx = Pb → LUx = Pb
2698 // となり、Ux = d、Pb = c と置き換えると、
2699 //  Ld = c
2700 // と書けるので、そこまでの計算をすると下記のコードとなる。
2701 const auto [L, U, P] = ArcsMat<M,N,T>::LUP(A);
2702 const auto c = P*b;
2704
2705 // 次に、Ld = c の d について解く。Lは下三角行列で対角が1なので、下記の前進代入法で求まる。
2706 T buff = 0; // 行方向加算用のバッファ
2707 d[1] = c[1]; // 1行目は答えがそのまま現れる
2708 for(size_t i = 2; i <= M; ++i){
2709 for(size_t j = 1; j < i; ++j) buff += L(i,j)*d[j];
2710 d[i] = c[i] - buff; // i行目の答え
2711 buff = 0;
2712 }
2713
2714 // さらに、Ux = d の x について解く。Uは上三角行列なので、下記の後退代入法で求まる。
2715 x[M] = d[M]/U(M,M); // 最後のM行目はUの対角項で割るだけ
2716 for(ssize_t i = M - 1; 0 < i; --i){
2717 for(size_t j = static_cast<size_t>(i) + 1; j <= N; ++j){
2718 buff += U(i,j)*x[j];
2719 }
2720 x[i] = (d[i] - buff)/U(i,i);
2721 buff = 0;
2722 }
2723 }
2724
2730 template<size_t MB, size_t NB, typename TB = double, size_t MX, size_t NX, typename TX = double>
2731 static constexpr void linsolve_mat(const ArcsMat<M,N,T>& A, const ArcsMat<MB,NB,TB>& B, ArcsMat<MX,NX,TX>& X){
2732 static_assert(M == N, "ArcsMat: Size Error"); // 正方行列チェック
2733 static_assert(MB == M, "ArcsMat: Size Error"); // 行列のサイズチェック
2734 static_assert(MX == N, "ArcsMat: Size Error"); // 行列のサイズチェック
2735 static_assert(NX == NB, "ArcsMat: Size Error"); // 行列のサイズチェック
2736 static_assert(ArcsMatrix::IsApplicable<T>, "ArcsMat: Type Error"); // 対応可能型チェック
2737 static_assert(ArcsMatrix::IsApplicable<TB>, "ArcsMat: Type Error"); // 対応可能型チェック
2738 static_assert(ArcsMatrix::IsApplicable<TX>, "ArcsMat: Type Error"); // 対応可能型チェック
2739
2740 // 列ごとに線形方程式を解く
2742 for(size_t i = 1; i <= NB; ++i){
2745 }
2746 }
2747
2753 template<size_t MB, size_t NB, typename TB = double, size_t MX, size_t NX, typename TX = double>
2754 static constexpr void linsolve_vec_nsqv(const ArcsMat<M,N,T>& A, const ArcsMat<MB,NB,TB>& b, ArcsMat<MX,NX,TX>& x){
2755 static_assert(N < M, "ArcsMat: Size Error"); // 非正方縦長行列チェック
2756 static_assert(MB == M, "ArcsMat: Size Error"); // 行列のサイズチェック
2757 static_assert(MX == N, "ArcsMat: Size Error"); // 行列のサイズチェック
2758 static_assert(NB == 1, "ArcsMat: Vector Error"); // 縦ベクトルチェック
2759 static_assert(NX == 1, "ArcsMat: Vector Error"); // 縦ベクトルチェック
2760 static_assert(ArcsMatrix::IsApplicable<T>, "ArcsMat: Type Error"); // 対応可能型チェック
2761 static_assert(ArcsMatrix::IsApplicable<TB>, "ArcsMat: Type Error"); // 対応可能型チェック
2762 static_assert(ArcsMatrix::IsApplicable<TX>, "ArcsMat: Type Error"); // 対応可能型チェック
2763
2764 // まず、Ax = b の A をQR分解すると、
2765 //  Ax = b → QRx = b
2766 // となり、Rx = d と置き換えると、
2767 //  Qd = b
2768 //  Q'Qd = Q'b (← Qは直交行列なので Q'Q = I)
2769 //  d = Q'b
2770 // と書けるので、そこまでの計算をすると下記のコードとなる。
2771 const auto [Q, R] = ArcsMat<M,N>::QR(A);
2772 const auto d = ~Q*b;
2773
2774 // 次に、Rx = d の x について解く。Rは縦長上三角行列なので、下記の後退代入法で求まる。
2775 T buff = 0; // 行方向加算用のバッファ
2776 x[N] = d[N]/R(N,N); // xの最後のN行目は対角項で割るだけ。
2777 for(ssize_t i = N - 1; 0 < i; --i){
2778 for(size_t j = static_cast<size_t>(i) + 1; j <= N; ++j){
2779 buff += R(i,j)*x[j];
2780 }
2781 x[i] = (d[i] - buff)/R(i,i);
2782 buff = 0;
2783 }
2784 }
2785
2791 template<size_t MB, size_t NB, typename TB = double, size_t MX, size_t NX, typename TX = double>
2792 static constexpr void linsolve_mat_nsqv(const ArcsMat<M,N,T>& A, const ArcsMat<MB,NB,TB>& B, ArcsMat<MX,NX,TX>& X){
2793 static_assert(N < M, "ArcsMat: Size Error"); // 非正方縦長行列チェック
2794 static_assert(MB == M, "ArcsMat: Size Error"); // 行列のサイズチェック
2795 static_assert(MX == N, "ArcsMat: Size Error"); // 行列のサイズチェック
2796 static_assert(NX == NB, "ArcsMat: Size Error"); // 行列のサイズチェック
2797 static_assert(ArcsMatrix::IsApplicable<T>, "ArcsMat: Type Error"); // 対応可能型チェック
2798 static_assert(ArcsMatrix::IsApplicable<TB>, "ArcsMat: Type Error"); // 対応可能型チェック
2799 static_assert(ArcsMatrix::IsApplicable<TX>, "ArcsMat: Type Error"); // 対応可能型チェック
2800
2801 // 列ごとに線形方程式を解く
2803 for(size_t i = 1; i <= NB; ++i){
2806 }
2807 }
2808
2815 template<size_t MB, size_t NB, typename TB = double, size_t MX, size_t NX, typename TX = double>
2816 static constexpr void linsolve_vec_nsqh(const ArcsMat<M,N,T>& A, const ArcsMat<MB,NB,TB>& b, ArcsMat<MX,NX,TX>& x){
2817 static_assert(M < N, "ArcsMat: Size Error"); // 非正方横長行列チェック
2818 static_assert(MB == M, "ArcsMat: Size Error"); // 行列のサイズチェック
2819 static_assert(MX == N, "ArcsMat: Size Error"); // 行列のサイズチェック
2820 static_assert(NB == 1, "ArcsMat: Vector Error"); // 縦ベクトルチェック
2821 static_assert(NX == 1, "ArcsMat: Vector Error"); // 縦ベクトルチェック
2822 static_assert(ArcsMatrix::IsApplicable<T>, "ArcsMat: Type Error"); // 対応可能型チェック
2823 static_assert(ArcsMatrix::IsApplicable<TB>, "ArcsMat: Type Error"); // 対応可能型チェック
2824 static_assert(ArcsMatrix::IsApplicable<TX>, "ArcsMat: Type Error"); // 対応可能型チェック
2825
2826 // まず、Ax = b の両辺を転置すると、
2827 //  (Ax)' = b' → x'A' = b'
2828 // となり、A'をQR分解すると、
2829 //  x'QR = b'
2830 // のように表せて、x'Q = d と置き換えると、
2831 //  dR = b'
2832 // と書けるので、dについて解く。Rは縦長上三角行列なので、下記の前進代入法で求まる。
2833 const auto [Q, R] = ArcsMat<N,M>::QR(~A);
2834 ArcsMat<1,4> d;
2835 T buff = 0; // 行方向加算用のバッファ
2836 d(1,1) = b[1]/R(1,1); // 1列目は1列目の対角項で割るだけ
2837 for(size_t i = 2; i <= M; ++i){
2838 for(size_t j = 1; j < i; ++j) buff += R(j,i)*d(1,j);
2839 d(1,i) = (b[i] - buff)/R(i,i); // i列目の答え
2840 buff = 0;
2841 }
2842
2843 // 次に、
2844 //  x'Q = d → (x'Q)' = d' → Q'x = d' → QQ'x = Qd' → x = Qd'
2845 // となるので、下記でxが求まる。
2846 x = Q*~d;
2847 }
2848
2855 template<size_t MB, size_t NB, typename TB = double, size_t MX, size_t NX, typename TX = double>
2856 static constexpr void linsolve_mat_nsqh(const ArcsMat<M,N,T>& A, const ArcsMat<MB,NB,TB>& B, ArcsMat<MX,NX,TX>& X){
2857 static_assert(M < N, "ArcsMat: Size Error"); // 非正方横長行列チェック
2858 static_assert(MB == M, "ArcsMat: Size Error"); // 行列のサイズチェック
2859 static_assert(MX == N, "ArcsMat: Size Error"); // 行列のサイズチェック
2860 static_assert(NX == NB, "ArcsMat: Size Error"); // 行列のサイズチェック
2861 static_assert(ArcsMatrix::IsApplicable<T>, "ArcsMat: Type Error"); // 対応可能型チェック
2862 static_assert(ArcsMatrix::IsApplicable<TB>, "ArcsMat: Type Error"); // 対応可能型チェック
2863 static_assert(ArcsMatrix::IsApplicable<TX>, "ArcsMat: Type Error"); // 対応可能型チェック
2864
2865 // 列ごとに線形方程式を解く
2867 for(size_t i = 1; i <= NB; ++i){
2870 }
2871 }
2872
2878 template<size_t MB, size_t NB, typename TB = double, size_t MX, size_t NX, typename TX = double>
2879 static constexpr void linsolve(const ArcsMat<M,N,T>& A, const ArcsMat<MB,NB,TB>& B, ArcsMat<MX,NX,TX>& X){
2880 // 行列のサイズでアルゴリズムを変える
2881 if constexpr(M == 1 && N == 1){
2882 // スカラーの場合
2883 X[1] = B[1]/A(1,1); // スカラーのときはそのまま単純に除算
2884 }else if constexpr((M == N) && (NB == 1)){
2885 // Aが正方行列で、Bが縦ベクトルの場合
2886 ArcsMat<M,N,T>::linsolve_vec(A, B, X); // LU分解を使った線形方程式のベクトル版の解法を使用
2887 }else if constexpr((M == N) && (NB != 1)){
2888 // Aが正方行列で、Bも行列の場合
2889 ArcsMat<M,N,T>::linsolve_mat(A, B, X); // LU分解を使った線形方程式の行列版の解法を使用
2890 }else if constexpr((N < M) && (NB == 1)){
2891 // Aが縦長行列で、Bが縦ベクトルの場合
2892 ArcsMat<M,N,T>::linsolve_vec_nsqv(A, B ,X); // QR分解を使った線形方程式のベクトル版の解法を使用
2893 }else if constexpr((N < M) && (NB != 1)){
2894 // Aが縦長行列で、Bが行列の場合
2895 ArcsMat<M,N,T>::linsolve_mat_nsqv(A, B ,X); // QR分解を使った線形方程式の行列版の解法を使用
2896 }else if constexpr((M < N) && (NB == 1)){
2897 // Aが横長行列で、Bが縦ベクトルの場合
2898 ArcsMat<M,N,T>::linsolve_vec_nsqh(A, B ,X); // QR分解を使った線形方程式のベクトル版の解法を使用(この場合はMATLABとは異なる解を出力する、ただしもちろん、Ax = b は成立)
2899 }else if constexpr((M < N) && (NB != 1)){
2900 // Aが横長行列で、Bが行列の場合
2901 ArcsMat<M,N,T>::linsolve_mat_nsqh(A, B ,X); // QR分解を使った線形方程式の行列版の解法を使用(この場合はMATLABとは異なる解を出力する、ただしもちろん、AX = B は成立)
2902 }else{
2903 arcs_assert(false); // ここには来ない
2904 }
2905 }
2906
2912 template<size_t MB, size_t NB, typename TB = double>
2913 static constexpr ArcsMat<N,NB,T> linsolve(const ArcsMat<M,N,T>& A, const ArcsMat<MB,NB,TB>& B){
2915 ArcsMat<M,N,T>::linsolve(A, B, X);
2916 return X;
2917 }
2918
2923 template<size_t P, size_t Q, typename R = double>
2924 static constexpr void inv(const ArcsMat<M,N,T>& A, ArcsMat<P,Q,R>& Y){
2925 static_assert(M == N, "ArcsMat: Size Error"); // 正方行列チェック
2926 static_assert(M == P, "ArcsMat: Size Error"); // 行列のサイズチェック
2927 static_assert(N == Q, "ArcsMat: Size Error"); // 行列のサイズチェック
2928 static_assert(ArcsMatrix::IsApplicable<T>, "ArcsMat: Type Error"); // 対応可能型チェック
2929 static_assert(ArcsMatrix::IsApplicable<R>, "ArcsMat: Type Error"); // 対応可能型チェック
2930 const auto I = ArcsMat<M,N,T>::eye(); // 単位行列の生成 [C++20移行時にconstexprに改修]
2931 Y = ArcsMat<M,N,T>::linsolve(A, I); // AX = I となる行列Xを linsolve で見つける
2932 }
2933
2937 static constexpr ArcsMat<M,N,T> inv(const ArcsMat<M,N,T>& A){
2939 ArcsMat<M,N,T>::inv(A, Y);
2940 return Y;
2941 }
2942
2947 template<size_t P, size_t Q, typename R = double>
2948 static constexpr void pinv(const ArcsMat<M,N,T>& A, ArcsMat<P,Q,R>& Y){
2949 static_assert(M != N, "ArcsMat: Size Error"); // 非正方行列チェック
2950 static_assert(M == Q, "ArcsMat: Size Error"); // 行列のサイズチェック
2951 static_assert(N == P, "ArcsMat: Size Error"); // 行列のサイズチェック
2952 static_assert(ArcsMatrix::IsApplicable<T>, "ArcsMat: Type Error"); // 対応可能型チェック
2953 static_assert(ArcsMatrix::IsApplicable<R>, "ArcsMat: Type Error"); // 対応可能型チェック
2954 if constexpr(N < M){
2955 // 縦長行列の場合
2956 Y = ArcsMat<N,N,T>::inv(~A*A)*~A;
2957 }else if constexpr(M < N){
2958 // 横長行列の場合
2959 Y = ~A*ArcsMat<M,M,T>::inv(A*~A);
2960 }
2961 }
2962
2966 static constexpr ArcsMat<N,M,T> pinv(const ArcsMat<M,N,T>& A){
2969 return Y;
2970 }
2971
2978 template<size_t MP, size_t NP, typename TP = double, size_t MH, size_t NH, typename TH = double>
2979 static constexpr void Hessenberg(const ArcsMat<M,N,T>& A, ArcsMat<MP,NP,TP>& P, ArcsMat<MH,NH,TH>& H){
2980 static_assert(M == N, "ArcsMat: Size Error"); // 正方行列チェック
2981 static_assert(MP == M, "ArcsMat: Size Error"); // 行列のサイズチェック
2982 static_assert(NP == N, "ArcsMat: Size Error"); // 行列のサイズチェック
2983 static_assert(MH == M, "ArcsMat: Size Error"); // 行列のサイズチェック
2984 static_assert(NH == N, "ArcsMat: Size Error"); // 行列のサイズチェック
2985 static_assert(ArcsMatrix::IsApplicable<T>, "ArcsMat: Type Error"); // 対応可能型チェック
2986 static_assert(ArcsMatrix::IsApplicable<TP>, "ArcsMat: Type Error"); // 対応可能型チェック
2987 static_assert(ArcsMatrix::IsApplicable<TH>, "ArcsMat: Type Error"); // 対応可能型チェック
2988
2990 ArcsMat<M,1,T> h, u, v;
2991 P = ArcsMat<M,N,T>::eye();
2992 H = A;
2993 for(size_t k = 1; k <= M - 2; ++k){
2995 if constexpr(ArcsMatrix::IsComplex<T>){
2996 u[1] = -std::exp( std::complex( 0.0, std::arg(h[1])) )*std::sqrt( (~h*h)[1] );
2997 }else{
2998 if(std::abs(h[1]) < EPSILON){
2999 u[1] = -std::sqrt( (~h*h)[1] );
3000 }else{
3001 u[1] = -ArcsMat<M,N,T>::sgn(h[1])*std::sqrt( (~h*h)[1] );
3002 }
3003 }
3004 v = h - u;
3006 H = W*H*~W;
3007 P = P*~W;
3008 }
3009 }
3010
3015 static constexpr std::tuple<ArcsMat<M,N,T>, ArcsMat<M,N,T>> Hessenberg(const ArcsMat<M,N,T>& A){
3016 ArcsMat<M,N,T> P, H;
3018 return {P, H};
3019 }
3020
3027 template<size_t MU, size_t NU, typename TU = double, size_t MS, size_t NS, typename TS = double>
3028 static constexpr void Schur(const ArcsMat<M,N,T>& A, ArcsMat<MU,NU,TU>& U, ArcsMat<MS,NS,TS>& S){
3029 static_assert(M == N, "ArcsMat: Size Error"); // 正方行列チェック
3030 static_assert(MU == M, "ArcsMat: Size Error"); // 行列のサイズチェック
3031 static_assert(NU == N, "ArcsMat: Size Error"); // 行列のサイズチェック
3032 static_assert(MS == M, "ArcsMat: Size Error"); // 行列のサイズチェック
3033 static_assert(NS == N, "ArcsMat: Size Error"); // 行列のサイズチェック
3034 static_assert(ArcsMatrix::IsApplicable<T>, "ArcsMat: Type Error"); // 対応可能型チェック
3035 static_assert(ArcsMatrix::IsApplicable<TU>, "ArcsMat: Type Error"); // 対応可能型チェック
3036 static_assert(ArcsMatrix::IsApplicable<TS>, "ArcsMat: Type Error"); // 対応可能型チェック
3037
3038 // ヘッセンベルグ分解を用いた複素シュール分解
3039 const auto I = ArcsMat<M,N,T>::eye(); // [C++20移行時にconstexprに改修]
3040 auto [P, H] = ArcsMat<M,N,T>::Hessenberg(A);
3041 size_t k = M;
3042 U = P;
3043 S = H;
3044 T a = 0;
3045 ArcsMat<M,N,T> W, Q, R, V;
3046 while(1 < k){
3047 k = (ArcsMat<M,N,T>::getdiag(S, -1)).GetNumOfNonZero() + 1;
3048 if(1 < k){
3049 a = ( S(k-1,k-1) + S(k,k) + std::sqrt( std::pow(S(k-1,k-1) + S(k,k), 2) - 4.0*(S(k-1,k-1)*S(k,k) - (S(k-1,k)*S(k,k-1))) ) )/2.0;
3050 W.FillAllZero();
3051 ArcsMat<M,N,T>::copymatrix(S - a*I,1,k,1,k, W,1,1);
3052 ArcsMat<M,N,T>::QR(W, Q, R);
3053 V = I;
3054 ArcsMat<M,N,T>::copymatrix(Q,1,k,1,k, V,1,1);
3055 U = U*V;
3056 S = ~V*S*V;
3057 S.ZeroingTriLo();
3058 }
3059 }
3060 }
3061
3066 static constexpr std::tuple<ArcsMat<M,N,T>, ArcsMat<M,N,T>> Schur(const ArcsMat<M,N,T>& A){
3067 ArcsMat<M,N,T> U, S;
3068 ArcsMat<M,N,T>::Schur(A, U, S);
3069 return {U, S};
3070 }
3071
3076 template<size_t MV, size_t NV, typename TV = std::complex<double>>
3077 static constexpr void eig(const ArcsMat<M,N,T>& A, ArcsMat<MV,NV,TV>& v){
3078 static_assert(M == N, "ArcsMat: Size Error"); // 正方行列チェック
3079 static_assert(MV == M, "ArcsMat: Size Error"); // 行列のサイズチェック
3080 static_assert(NV == 1, "ArcsMat: Vector Error");// 行列のサイズチェック
3081 static_assert(ArcsMatrix::IsApplicable<T>, "ArcsMat: Type Error"); // 対応可能型チェック
3082 static_assert(ArcsMatrix::IsComplex<TV>, "ArcsMat: Type Error (Not Complex)"); // 出力は複素数型のみ対応
3083
3084 const ArcsMat<M,M,TV> U = A;
3085 const auto [W, S] = ArcsMat<M,N,TV>::Schur(U); // シュール分解を実行
3086 v = ArcsMat<M,M,TV>::getdiag(S); // シュール分解の対角要素が固有値
3087 }
3088
3093 template<typename TV = std::complex<double>>
3094 static constexpr ArcsMat<M,1,TV> eig(const ArcsMat<M,N,T>& A){
3096 ArcsMat<M,N,T>::eig(A, v);
3097 return v;
3098 }
3099
3105 template<size_t MV, size_t NV, typename TV = std::complex<double>, size_t MD, size_t ND, typename TD = std::complex<double>>
3106 static constexpr void eigvec(const ArcsMat<M,N,T>& A, ArcsMat<MV,NV,TV>& V, ArcsMat<MD,ND,TD>& D){
3107 static_assert(M == N, "ArcsMat: Size Error"); // 正方行列チェック
3108 static_assert(MV == NV, "ArcsMat: Size Error"); // 正方行列チェック
3109 static_assert(MD == ND, "ArcsMat: Size Error"); // 正方行列チェック
3110 static_assert(MV == M, "ArcsMat: Size Error"); // 行列のサイズチェック
3111 static_assert(MD == M, "ArcsMat: Vector Error");// 行列のサイズチェック
3112 static_assert(ArcsMatrix::IsApplicable<T>, "ArcsMat: Type Error"); // 対応可能型チェック
3113 static_assert(ArcsMatrix::IsComplex<TV>, "ArcsMat: Type Error (Not Complex)"); // 出力は複素数型のみ対応
3114 static_assert(ArcsMatrix::IsComplex<TD>, "ArcsMat: Type Error (Not Complex)"); // 出力は複素数型のみ対応
3115
3116 // シュール分解による固有値と固有ベクトルの計算
3117 const ArcsMat<M,M,TV> Ax = A; // 予め複素行列として読み込み
3118 const auto l = ArcsMat<M,M,TV>::eig(A); // シュール分解で固有値を先に求める
3119 ArcsMat<M,1,TV>::diag(l, D); // 固有値を対角に持つ対角行列を生成
3120 const auto I = ArcsMat<M,M,TV>::eye(); // [C++20移行時にconstexprに改修]
3121 ArcsMat<M,M,TV> Q, R;
3122 for(size_t k = 1; k <= M; ++k){
3123 //(~(Ax - l[k]*I)).Disp("% 8.4f");
3124 ArcsMat<M,M,TV>::QR( ~(Ax - l[k]*I), Q, R );
3125 //Q.Disp("% 8.4f");
3127 }
3128 }
3129
3134 template<typename TV = std::complex<double>>
3135 static constexpr std::tuple< ArcsMat<M,N,TV>, ArcsMat<M,N,TV> > eigvec(const ArcsMat<M,N,T>& A){
3136 ArcsMat<M,N,TV> V, D;
3137 ArcsMat<M,N,T>::eigvec(A, V, D);
3138 return {V, D};
3139 }
3140
3146 template<size_t MR, size_t NR, typename TR = double, size_t MY, size_t NY, typename TY = double>
3147 static constexpr void Kron(const ArcsMat<M,N,T>& L, const ArcsMat<MR,NR,TR>& R, ArcsMat<MY,NY,TY>& Y){
3148 static_assert(MY == M*MR, "ArcsMat: Size Error"); // 行列のサイズチェック
3149 static_assert(NY == N*NR, "ArcsMat: Size Error"); // 行列のサイズチェック
3150 static_assert(ArcsMatrix::IsApplicable<T>, "ArcsMat: Type Error"); // 対応可能型チェック
3151 static_assert(ArcsMatrix::IsApplicable<TR>, "ArcsMat: Type Error"); // 対応可能型チェック
3152 static_assert(ArcsMatrix::IsApplicable<TY>, "ArcsMat: Type Error"); // 対応可能型チェック
3154
3155 // 横方向に小行列で埋めていく
3156 for(size_t i = 1; i <= N; ++i){
3157 // 縦方向に小行列で埋めていく
3158 for(size_t j = 1; j <= M; ++j){
3159 A = L(j,i)*R;
3160 ArcsMat<MY,NY,TY>::setsubmatrix(Y, A, (j - 1)*MR + 1, (i - 1)*NR + 1);
3161 }
3162 }
3163 }
3164
3170 template<size_t MR, size_t NR, typename TR = double>
3171 static constexpr ArcsMat<M*MR,N*NR,T> Kron(const ArcsMat<M,N,T>& L, const ArcsMat<MR,NR,TR>& R){
3173 ArcsMat<M,N,T>::Kron(L, R, Y);
3174 return Y;
3175 }
3176
3182 template<size_t MR, size_t NR, typename TR = double, size_t MY, size_t NY, typename TY = double>
3183 static constexpr void cross_vec(const ArcsMat<M,N,T>& l, const ArcsMat<MR,NR,TR>& r, ArcsMat<MY,NY,TY>& y){
3184 static_assert(M == 3, "ArcsMat: Size Error"); // 行列のサイズチェック(3次元のみ)
3185 static_assert(MR == 3, "ArcsMat: Size Error"); // 行列のサイズチェック(3次元のみ)
3186 static_assert(MY == 3, "ArcsMat: Size Error"); // 行列のサイズチェック(3次元のみ)
3187 static_assert(N == 1, "ArcsMat: Vector Error"); // 行列のサイズチェック
3188 static_assert(NR == 1, "ArcsMat: Vector Error"); // 行列のサイズチェック
3189 static_assert(NY == 1, "ArcsMat: Vector Error"); // 行列のサイズチェック
3190 static_assert(ArcsMatrix::IsApplicable<T>, "ArcsMat: Type Error"); // 対応可能型チェック
3191 static_assert(ArcsMatrix::IsApplicable<TR>, "ArcsMat: Type Error"); // 対応可能型チェック
3192 static_assert(ArcsMatrix::IsApplicable<TY>, "ArcsMat: Type Error"); // 対応可能型チェック
3193
3194 y[1] = l[2]*r[3] - l[3]*r[2];
3195 y[2] = l[3]*r[1] - l[1]*r[3];
3196 y[3] = l[1]*r[2] - l[2]*r[1];
3197 }
3198
3204 template<size_t MR, size_t NR, typename TR = double, size_t MY, size_t NY, typename TY = double>
3205 static constexpr void cross_mat(const ArcsMat<M,N,T>& L, const ArcsMat<MR,NR,TR>& R, ArcsMat<MY,NY,TY>& Y){
3206 static_assert(M == 3, "ArcsMat: Size Error"); // 行列のサイズチェック(3次元のみ)
3207 static_assert(MR == 3, "ArcsMat: Size Error"); // 行列のサイズチェック(3次元のみ)
3208 static_assert(MY == 3, "ArcsMat: Size Error"); // 行列のサイズチェック(3次元のみ)
3209 static_assert(NR == N, "ArcsMat: Vector Error"); // 行列のサイズチェック
3210 static_assert(NY == N, "ArcsMat: Vector Error"); // 行列のサイズチェック
3211 static_assert(ArcsMatrix::IsApplicable<T>, "ArcsMat: Type Error"); // 対応可能型チェック
3212 static_assert(ArcsMatrix::IsApplicable<TR>, "ArcsMat: Type Error"); // 対応可能型チェック
3213 static_assert(ArcsMatrix::IsApplicable<TY>, "ArcsMat: Type Error"); // 対応可能型チェック
3214
3215 // 列ごとにクロス積を計算
3217 for(size_t i = 1; i <= N; ++i){
3220 }
3221 }
3222
3228 template<size_t MR, size_t NR, typename TR = double, size_t MY, size_t NY, typename TY = double>
3229 static constexpr void cross(const ArcsMat<M,N,T>& L, const ArcsMat<MR,NR,TR>& R, ArcsMat<MY,NY,TY>& Y){
3230 // ベクトル入力か行列入力かによってアルゴリズムを変える
3231 if constexpr(N == 1){
3232 // ベクトルの場合
3233 ArcsMat<M,N,T>::cross_vec(L, R, Y); // ベクトル版を使用
3234 }else{
3235 // 行列の場合
3236 ArcsMat<M,N,T>::cross_mat(L, R, Y); // 行列版を使用
3237 }
3238 }
3239
3245 template<size_t MR, size_t NR, typename TR = double>
3246 static constexpr ArcsMat<M,N,T> cross(const ArcsMat<M,N,T>& L, const ArcsMat<MR,NR,TR>& R){
3248 ArcsMat<M,N,T>::cross(L, R, Y);
3249 return Y;
3250 }
3251
3256 template<size_t MY, size_t NY, typename TY = double>
3257 static constexpr void vec(const ArcsMat<M,N,T>& U, ArcsMat<MY,NY,TY>& y){
3258 static_assert(MY == M*N, "ArcsMat: Size Error"); // 行列のサイズチェック
3259 static_assert(NY == 1, "ArcsMat: Vector Error"); // 行列のサイズチェック
3260 static_assert(ArcsMatrix::IsApplicable<T>, "ArcsMat: Type Error"); // 対応可能型チェック
3261 static_assert(ArcsMatrix::IsApplicable<TY>, "ArcsMat: Type Error"); // 対応可能型チェック
3262
3263 // 横方向に走査
3264 size_t k = 0;
3265 for(size_t i = 1; i <= N; ++i){
3266 // 縦方向に走査
3267 for(size_t j = 1; j <= M; ++j){
3268 k++;
3269 y[k] = U(j,i);
3270 }
3271 }
3272 }
3273
3277 static constexpr ArcsMat<M*N,1,T> vec(const ArcsMat<M,N,T>& U){
3279 ArcsMat<M,N,T>::vec(U, y);
3280 return y;
3281 }
3282
3287 template<size_t MY, size_t NY, typename TY = double>
3288 static constexpr void vecinv(const ArcsMat<M,N,T>& u, ArcsMat<MY,NY,TY>& Y){
3289 static_assert(M == MY*NY, "ArcsMat: Size Error"); // 行列のサイズチェック
3290 static_assert(N == 1, "ArcsMat: Vector Error"); // 行列のサイズチェック
3291 static_assert(ArcsMatrix::IsApplicable<T>, "ArcsMat: Type Error"); // 対応可能型チェック
3292 static_assert(ArcsMatrix::IsApplicable<TY>, "ArcsMat: Type Error"); // 対応可能型チェック
3293
3294 // 横方向に走査
3295 size_t k = 0;
3296 for(size_t i = 1; i <= NY; ++i){
3297 // 縦方向に走査
3298 for(size_t j = 1; j <= MY; ++j){
3299 k++;
3300 Y(j,i) = u[k];
3301 }
3302 }
3303 }
3304
3309 template<size_t MY, size_t NY>
3310 static constexpr ArcsMat<MY,NY,T> vecinv(const ArcsMat<M,N,T>& u){
3313 return Y;
3314 }
3315
3321 template<size_t MY, size_t NY, typename TY = double>
3322 static constexpr void expm(const ArcsMat<M,N,T>& U, ArcsMat<MY,NY,TY>& Y, const size_t k = 13){
3323 static_assert(M == N, "ArcsMat: Size Error"); // 行列のサイズチェック
3324 static_assert(MY == M, "ArcsMat: Size Error"); // 行列のサイズチェック
3325 static_assert(NY == N, "ArcsMat: Size Error"); // 行列のサイズチェック
3326 static_assert(ArcsMatrix::IsApplicable<T>, "ArcsMat: Type Error"); // 対応可能型チェック
3327 static_assert(ArcsMatrix::IsApplicable<TY>, "ArcsMat: Type Error"); // 対応可能型チェック
3328
3329 // L∞ノルムでスケーリング
3330 int e = 0;
3333 if(0 < e){
3334 A = std::pow(0.5, e + 1)*U;
3335 }else{
3336 e = 0;
3337 A = 0.5*U;
3338 }
3339
3340 // 指数行列のパデ近似の計算
3341 const auto I = ArcsMat<M,N,T>::eye(); // 単位行列の生成
3342 ArcsMat<M,N,T> L = I, R = I, X = I, cX;
3343 T c = 1;
3344 bool signflag = false; // 係数の符号生成用フラグ
3345 int coefsign = -1; // 係数の符号
3346 for(size_t i = 1; i <= k; ++i){
3347 c = c*static_cast<T>(k - i + 1) / static_cast<T>(i*(2*k - i + 1)); // 指数行列のパデ近似係数の計算
3348 X = A*X; // A^Mの計算
3349 cX = c*X; // cM*A^Mの計算
3350 R += cX; // R = I + c1*A + c2*A*A + c3*A*A*A + ... + cM*A^M ←パデ近似の分子
3351 coefsign = 2*static_cast<int>(signflag) - 1;// 係数の符号
3352 L += static_cast<T>(coefsign)*cX; // L = I + c1*A + c2*A*A + c3*A*A*A + ... + cM*A^M ←パデ近似の分母
3353 signflag = !signflag; // 係数の符号生成用フラグ
3354 }
3355 ArcsMat<M,N,T>::linsolve(L, R, Y); // パデ近似 Y = L/R → 行列パデ近似 Y = inv(L)*R → 線形方程式表示 LY = R
3356
3357 // スケールを元に戻す
3358 for(size_t i = 0; i < static_cast<size_t>(e) + 1; ++i) Y *= Y;
3359 }
3360
3365 static constexpr ArcsMat<M,N,T> expm(const ArcsMat<M,N,T>& U, const size_t k = 13){
3367 ArcsMat<M,N,T>::expm(U, Y, k);
3368 return Y;
3369 }
3370
3371 public:
3372 // 公開版基本定数
3373 static constexpr double EPSILON = 1e-14;
3374 static constexpr std::complex<double> EPSLCOMP = std::complex(1e-14, 1e-14);
3375
3376 private:
3377 // 非公開版基本定数
3378 static constexpr size_t ITERATION_MAX = 10000;
3379 static constexpr char CMPLX_UNIT = 'i';
3380
3381 // 内部処理用
3382 size_t Nindex;
3383 size_t Mindex;
3384 ArcsMatrix::MatStatus Status = ArcsMatrix::MatStatus::AMT_NA; // 行列の状態
3385
3386 // 行列データの実体
3387 // ArcsMatは行列の縦方向にメモリアドレスが連続しているので、縦ベクトル優先。
3388 std::array<std::array<T, M>, N> Data;
3389
3393 static constexpr T sgn(T u){
3394 T ret = 1;
3395 if constexpr(ArcsMatrix::IsComplex<T>){
3396 // 複素数型の場合
3397 if(std::abs(u) < EPSILON){
3398 ret = std::complex(0.0, 0.0); // ゼロ割回避
3399 }else{
3400 ret = u/std::abs(u); // 複素数に拡張された符号関数
3401 }
3402 }else{
3403 // 実数型の場合
3404 ret = std::copysign(1, u);
3405 }
3406 return ret;
3407 }
3408
3409};
3410
3411namespace ArcsMatrix {
3412 // グローバル版関数の定義 (ADL問題に当たる可能性があるが便利さ優先)
3413
3418 template <size_t M, size_t N, typename T = double>
3419 static void dispsize_macro(const ArcsMat<M,N,T>& U, const std::string& varname){
3420 printf("%s = [ Height: %zu x Width: %zu ]\n\n", varname.c_str(), M, N);
3421 }
3422
3428 template <size_t M, size_t N, typename T = double>
3429 static void dispf_macro(const ArcsMat<M,N,T>& U, const std::string& format, const std::string& varname){
3430 printf("%s = \n", varname.c_str());
3431 U.Disp(format);
3432 }
3433
3438 template <size_t M, size_t N, typename T = double>
3439 static void disp_macro(const ArcsMat<M,N,T>& U, const std::string& varname){
3440 // データ型によって書式指定子を変える
3441 // 浮動小数点型の場合
3442 if constexpr(std::is_floating_point_v<T>){
3443 dispf_macro(U, "% 4g", varname);
3444 return;
3445 }
3446
3447 // int型の場合
3448 if constexpr(std::is_same_v<T, int>){
3449 dispf_macro(U, "% d", varname);
3450 return;
3451 }
3452
3453 // long型の場合
3454 if constexpr(std::is_same_v<T, long>){
3455 dispf_macro(U, "% ld", varname);
3456 return;
3457 }
3458
3459 // size_t型の場合
3460 if constexpr(std::is_same_v<T, size_t>){
3461 dispf_macro(U, "% zu", varname);
3462 return;
3463 }
3464
3465 // 複素数型の場合
3466 if constexpr(std::is_same_v<T, std::complex<double>> || std::is_same_v<T, std::complex<float>>){
3467 dispf_macro(U, "% 4g", varname);
3468 return;
3469 }
3470 }
3471
3475 template <size_t M, size_t N, typename T = double>
3476 constexpr ArcsMat<M,N,T> eye(void){
3477 return ArcsMat<M,N,T>::eye();
3478 }
3479
3483 template <size_t M, size_t N, typename T = double>
3484 constexpr ArcsMat<M,N,T> zeros(void){
3485 return ArcsMat<M,N,T>::zeros();
3486 }
3487
3491 template <size_t M, size_t N, typename T = double>
3492 constexpr ArcsMat<M,N,T> ones(void){
3493 return ArcsMat<M,N,T>::ones();
3494 }
3495
3499 template <size_t M, size_t N, typename T = double>
3500 constexpr ArcsMat<M,N,T> ramp(void){
3501 return ArcsMat<M,N,T>::ramp();
3502 }
3503
3509 template<size_t M, size_t N, typename T = double, size_t P, size_t Q, typename R = double>
3510 constexpr void getcolumn(const ArcsMat<M,N,T>& U, ArcsMat<P,Q,R>& y, const size_t n){
3512 }
3513
3519 template <size_t M, size_t N, typename T = double>
3520 constexpr ArcsMat<M,1,T> getcolumn(const ArcsMat<M,N,T>& U, const size_t n){
3521 return ArcsMat<M,N,T>::getcolumn(U, n);
3522 }
3523
3529 template<size_t M, size_t N, typename T = double, size_t P, size_t Q, typename R = double>
3530 constexpr void setcolumn(ArcsMat<M,N,T>& UY, const ArcsMat<P,Q,R>& u, const size_t n){
3531 ArcsMat<M,N,T>::setcolumn(UY, u, n);
3532 }
3533
3540 template<size_t M, size_t N, typename T = double, size_t P, size_t Q, typename R = double>
3541 constexpr ArcsMat<M,N,T> setcolumn(const ArcsMat<P,Q,R>& u, const size_t n, const ArcsMat<M,N,T>& U){
3542 return ArcsMat<M,N,T>::setcolumn(u, n, U);
3543 }
3544
3550 template <size_t M, size_t N, typename T = double>
3551 constexpr void swapcolumn(ArcsMat<M,N,T>& UY, const size_t n1, const size_t n2){
3552 ArcsMat<M,N,T>::swapcolumn(UY, n1, n2);
3553 }
3554
3561 template <size_t M, size_t N, typename T = double>
3562 constexpr ArcsMat<M,N,T> swapcolumn(const size_t n1, const size_t n2, const ArcsMat<M,N,T>& U){
3563 return ArcsMat<M,N,T>::swapcolumn(n1, n2, U);
3564 }
3565
3573 template<size_t M, size_t N, typename T = double, typename R = double>
3574 constexpr void fillcolumn(ArcsMat<M,N,T>& UY, const R a, const size_t n, const size_t m1, const size_t m2){
3575 ArcsMat<M,N,T>::fillcolumn(UY, a, n, m1, m2);
3576 }
3577
3586 template<size_t M, size_t N, typename T = double, typename R = double>
3587 constexpr ArcsMat<M,N,T> fillcolumn(const R a, const size_t n, const size_t m1, const size_t m2, const ArcsMat<M,N,T>& U){
3588 return ArcsMat<M,N,T>::fillcolumn(a, n, m1, m2, U);
3589 }
3590
3596 template<size_t M, size_t N, typename T = double, size_t P, size_t Q, typename R = size_t>
3598 return ArcsMat<M,N,T>::ordercolumn(U, u);
3599 }
3600
3605 template<size_t M, size_t N, typename T = double, size_t P, size_t Q, typename R = size_t>
3609
3614 template<size_t M, size_t N, typename T = double, size_t P, size_t Q, typename R = double>
3615 constexpr void sumcolumn(const ArcsMat<M,N,T>& U, ArcsMat<P,Q,R>& y){
3617 }
3618
3623 template<size_t M, size_t N, typename T = double>
3625 return ArcsMat<M,N,T>::sumcolumn(U);
3626 }
3627
3633 template<size_t M, size_t N, typename T = double, size_t P, size_t Q, typename R = double>
3634 constexpr void getrow(const ArcsMat<M,N,T>& U, ArcsMat<P,Q,R>& y, const size_t m){
3635 ArcsMat<M,N,T>::getrow(U, y, m);
3636 }
3637
3643 template <size_t M, size_t N, typename T = double>
3644 constexpr ArcsMat<1,N,T> getrow(const ArcsMat<M,N,T>& U, const size_t m){
3645 return ArcsMat<M,N,T>::getrow(U, m);
3646 }
3647
3653 template<size_t M, size_t N, typename T = double, size_t P, size_t Q, typename R = double>
3654 constexpr void setrow(ArcsMat<M,N,T>& UY, const ArcsMat<P,Q,R>& u, const size_t m){
3655 ArcsMat<M,N,T>::setrow(UY, u, m);
3656 }
3657
3664 template<size_t M, size_t N, typename T = double, size_t P, size_t Q, typename R = double>
3665 constexpr ArcsMat<M,N,T> setrow(const ArcsMat<P,Q,R>& u, const size_t m, const ArcsMat<M,N,T>& U){
3666 return ArcsMat<M,N,T>::setrow(u, m, U);
3667 }
3668
3674 template <size_t M, size_t N, typename T = double>
3675 constexpr void swaprow(ArcsMat<M,N,T>& UY, const size_t m1, const size_t m2){
3676 ArcsMat<M,N,T>::swaprow(UY, m1, m2);
3677 }
3678
3685 template <size_t M, size_t N, typename T = double>
3686 constexpr ArcsMat<M,N,T> swaprow(const size_t m1, const size_t m2, const ArcsMat<M,N,T>& U){
3687 return ArcsMat<M,N,T>::swaprow(m1, m2, U);
3688 }
3689
3697 template<size_t M, size_t N, typename T = double, typename R = double>
3698 constexpr void fillrow(ArcsMat<M,N,T>& UY, const R a, const size_t m, const size_t n1, const size_t n2){
3699 ArcsMat<M,N,T>::fillrow(UY, a, m, n1, n2);
3700 }
3701
3710 template<size_t M, size_t N, typename T = double, typename R = double>
3711 constexpr ArcsMat<M,N,T> fillrow(const R a, const size_t m, const size_t n1, const size_t n2, const ArcsMat<M,N,T>& U){
3712 return ArcsMat<M,N,T>::fillrow(a, m, n1, n2, U);
3713 }
3714
3720 template<size_t M, size_t N, typename T = double, size_t P, size_t Q, typename R = size_t>
3722 return ArcsMat<M,N,T>::orderrow(U, u);
3723 }
3724
3729 template<size_t M, size_t N, typename T = double, size_t P, size_t Q, typename R = size_t>
3733
3738 template<size_t M, size_t N, typename T = double, size_t P, size_t Q, typename R = double>
3739 constexpr void sumrow(const ArcsMat<M,N,T>& U, ArcsMat<P,Q,R>& y){
3741 }
3742
3747 template<size_t M, size_t N, typename T = double>
3749 return ArcsMat<M,N,T>::sumrow(U);
3750 }
3751
3758 template<size_t M, size_t N, typename T = double, size_t P, size_t Q, typename R = double>
3759 constexpr void getvvector(const ArcsMat<M,N,T>& U, ArcsMat<P,Q,R>& y, const size_t m, const size_t n){
3760 ArcsMat<M,N,T>::getvvector(U, y, m, n);
3761 }
3762
3769 template<size_t P, size_t M, size_t N, typename T = double>
3770 constexpr ArcsMat<P,1,T> getvvector(const ArcsMat<M,N,T>& U, const size_t m, const size_t n){
3771 return ArcsMat<M,N,T>::template getvvector<P>(U, m, n);
3772 }
3773
3780 template<size_t M, size_t N, typename T = double, size_t P, size_t Q, typename R = double>
3781 constexpr void setvvector(ArcsMat<M,N,T>& UY, const ArcsMat<P,Q,R>& u, const size_t m, const size_t n){
3782 ArcsMat<M,N,T>::setvvector(UY, u, m, n);
3783 }
3784
3792 template<size_t M, size_t N, typename T = double, size_t P, size_t Q, typename R = double>
3793 constexpr ArcsMat<M,N,T> setvvector(const ArcsMat<P,Q,R>& u, const size_t m, const size_t n, const ArcsMat<M,N,T>& U){
3794 return ArcsMat<M,N,T>::setvvector(u, m, n, U);
3795 }
3796
3803 template<size_t M, size_t N, typename T = double, size_t P, size_t Q, typename R = double>
3804 constexpr void gethvector(const ArcsMat<M,N,T>& U, ArcsMat<P,Q,R>& y, const size_t m, const size_t n){
3805 ArcsMat<M,N,T>::gethvector(U, y, m, n);
3806 }
3807
3814 template<size_t Q, size_t M, size_t N, typename T = double>
3815 constexpr ArcsMat<1,Q,T> gethvector(const ArcsMat<M,N,T>& U, const size_t m, const size_t n){
3816 return ArcsMat<M,N,T>::template gethvector<Q>(U, m, n);
3817 }
3818
3825 template<size_t M, size_t N, typename T = double, size_t P, size_t Q, typename R = double>
3826 constexpr void sethvector(ArcsMat<M,N,T>& UY, const ArcsMat<P,Q,R>& u, const size_t m, const size_t n){
3827 ArcsMat<M,N,T>::sethvector(UY, u, m, n);
3828 }
3829
3837 template<size_t M, size_t N, typename T = double, size_t P, size_t Q, typename R = double>
3838 constexpr ArcsMat<M,N,T> sethvector(const ArcsMat<P,Q,R>& u, const size_t m, const size_t n, const ArcsMat<M,N,T>& U){
3839 return ArcsMat<M,N,T>::sethvector(u, m, n, U);
3840 }
3841
3848 template<size_t M, size_t N, typename T = double, size_t P, size_t Q, typename R = double>
3849 constexpr void getsubmatrix(const ArcsMat<M,N,T>& U, ArcsMat<P,Q,R>& Y, const size_t m, const size_t n){
3850 ArcsMat<M,N,T>::getsubmatrix(U, Y, m, n);
3851 }
3852
3859 template<size_t P, size_t Q, size_t M, size_t N, typename T = double>
3860 constexpr ArcsMat<P,Q,T> getsubmatrix(const ArcsMat<M,N,T>& U, const size_t m, const size_t n){
3861 return ArcsMat<M,N,T>::template getsubmatrix<P,Q>(U, m, n);
3862 }
3863
3870 template<size_t M, size_t N, typename T = double, size_t P, size_t Q, typename R = double>
3871 constexpr void setsubmatrix(ArcsMat<M,N,T>& UY, const ArcsMat<P,Q,R>& U, const size_t m, const size_t n){
3872 ArcsMat<M,N,T>::setsubmatrix(UY, U, m, n);
3873 }
3874
3882 template<size_t M, size_t N, typename T = double, size_t P, size_t Q, typename R = double>
3883 constexpr ArcsMat<M,N,T> setsubmatrix(const ArcsMat<P,Q,R>& Us, const size_t m, const size_t n, const ArcsMat<M,N,T>& U){
3884 return ArcsMat<M,N,T>::setsubmatrix(Us, m, n, U);
3885 }
3886
3898 template<size_t M, size_t N, typename T = double, size_t P, size_t Q, typename R = double>
3899 constexpr void copymatrix(
3900 const ArcsMat<M,N,T>& U, const size_t m1, const size_t m2, const size_t n1, const size_t n2,
3901 ArcsMat<P,Q,R>& Y, const size_t my, const size_t ny
3902 ){
3903 ArcsMat<M,N,T>::copymatrix(U, m1, m2, n1, n2, Y, my, ny);
3904 }
3905
3911 template<size_t M, size_t N, typename T = double, size_t P, size_t Q, typename R = double>
3912 constexpr void shiftup(const ArcsMat<M,N,T>& U, ArcsMat<P,Q,R>& Y, const size_t m = 1){
3913 ArcsMat<M,N,T>::shiftup(U, Y, m);
3914 }
3915
3921 template<size_t M, size_t N, typename T = double>
3922 constexpr ArcsMat<M,N,T> shiftup(const ArcsMat<M,N,T>& U, const size_t m = 1){
3923 return ArcsMat<M,N,T>::shiftup(U, m);
3924 }
3925
3931 template<size_t M, size_t N, typename T = double, size_t P, size_t Q, typename R = double>
3932 constexpr void shiftdown(const ArcsMat<M,N,T>& U, ArcsMat<P,Q,R>& Y, const size_t m = 1){
3934 }
3935
3941 template<size_t M, size_t N, typename T = double>
3942 constexpr ArcsMat<M,N,T> shiftdown(const ArcsMat<M,N,T>& U, const size_t m = 1){
3943 return ArcsMat<M,N,T>::shiftdown(U, m);
3944 }
3945
3951 template<size_t M, size_t N, typename T = double, size_t P, size_t Q, typename R = double>
3952 constexpr void shiftleft(const ArcsMat<M,N,T>& U, ArcsMat<P,Q,R>& Y, const size_t n = 1){
3954 }
3955
3961 template<size_t M, size_t N, typename T = double>
3962 constexpr ArcsMat<M,N,T> shiftleft(const ArcsMat<M,N,T>& U, const size_t n = 1){
3963 return ArcsMat<M,N,T>::shiftleft(U, n);
3964 }
3965
3971 template<size_t M, size_t N, typename T = double, size_t P, size_t Q, typename R = double>
3972 constexpr void shiftright(const ArcsMat<M,N,T>& U, ArcsMat<P,Q,R>& Y, const size_t n = 1){
3974 }
3980 template<size_t M, size_t N, typename T = double>
3981 constexpr ArcsMat<M,N,T> shiftright(const ArcsMat<M,N,T>& U, const size_t n = 1){
3982 return ArcsMat<M,N,T>::shiftright(U, n);
3983 }
3984
3990 template<size_t M, size_t N, typename T = double, size_t P, size_t Q, typename R = double, size_t D, size_t E, typename F = double>
3991 constexpr void concatv(const ArcsMat<M,N,T>& U1, const ArcsMat<P,Q,R>& U2, ArcsMat<D,E,F>& Y){
3992 ArcsMat<M,N,T>::concatv(U1, U2, Y);
3993 }
3994
4000 template<size_t M, size_t N, typename T = double, size_t P, size_t Q, typename R = double>
4001 static constexpr ArcsMat<M+P,N,T> concatv(const ArcsMat<M,N,T>& U1, const ArcsMat<P,Q,R>& U2){
4002 return ArcsMat<M,N,T>::concatv(U1, U2);
4003 }
4004
4010 template<size_t M, size_t N, typename T = double, size_t P, size_t Q, typename R = double, size_t D, size_t E, typename F = double>
4011 constexpr void concath(const ArcsMat<M,N,T>& U1, const ArcsMat<P,Q,R>& U2, ArcsMat<D,E,F>& Y){
4012 ArcsMat<M,N,T>::concath(U1, U2, Y);
4013 }
4014
4020 template<size_t M, size_t N, typename T = double, size_t P, size_t Q, typename R = double>
4022 return ArcsMat<M,N,T>::concath(U1, U2);
4023 }
4024
4032 template<size_t M, size_t N, typename T = double, size_t P, size_t Q, typename R = double, size_t D, size_t E, typename F = double, size_t G, size_t H, typename L = double, size_t V, size_t W, typename X = double>
4033 constexpr void concat4(const ArcsMat<M,N,T>& U11, const ArcsMat<P,Q,R>& U12, const ArcsMat<D,E,F>& U21, const ArcsMat<G,H,L>& U22, ArcsMat<V,W,X>& Y){
4034 ArcsMat<M,N,T>::concat4(U11, U12, U21, U22, Y);
4035 }
4036
4044 template<size_t M, size_t N, typename T = double, size_t P, size_t Q, typename R = double, size_t D, size_t E, typename F = double, size_t G, size_t H, typename L = double>
4045 constexpr ArcsMat<M+D,N+Q,T> concat4(const ArcsMat<M,N,T>& U11, const ArcsMat<P,Q,R>& U12, const ArcsMat<D,E,F>& U21, const ArcsMat<G,H,L>& U22){
4046 return ArcsMat<M,N,T>::concat4(U11, U12, U21, U22);
4047 }
4048
4054 template<size_t M, size_t N, typename T = double, size_t P, size_t Q, typename R = double>
4055 constexpr void diag(const ArcsMat<M,N,T>& u, ArcsMat<P,Q,R>& Y){
4057 }
4058
4063 template<size_t M, size_t N, typename T = double>
4065 return ArcsMat<M,N,T>::diag(u);
4066 }
4067
4073 template<size_t M, size_t N, typename T = double, size_t P, size_t Q, typename R = double, size_t L = std::min(M,N)>
4074 constexpr void getdiag(const ArcsMat<M,N,T>& U, ArcsMat<P,Q,R>& y, const ssize_t k = 0){
4075 ArcsMat<M,N,T>::getdiag(U, y, k);
4076 }
4077
4083 template<size_t M, size_t N, typename T = double, size_t L = std::min(M,N)>
4084 constexpr ArcsMat<L,1,T> getdiag(const ArcsMat<M,N,T>& U, const ssize_t k = 0){
4085 return ArcsMat<M,N,T>::getdiag(U, k);
4086 }
4087
4092 template<size_t M, size_t N, typename T = double>
4093 constexpr T trace(const ArcsMat<M,N,T>& U){
4094 return ArcsMat<M,N,T>::trace(U);
4095 }
4096
4101 template<size_t M, size_t N, typename T = double>
4102 constexpr T multdiag(const ArcsMat<M,N,T>& U){
4103 return ArcsMat<M,N,T>::multdiag(U);
4104 }
4105
4110 template<size_t M, size_t N, typename T = double>
4111 constexpr std::tuple<size_t,size_t> maxidx(const ArcsMat<M,N,T>& U){
4112 return ArcsMat<M,N,T>::maxidx(U);
4113 }
4114
4119 template<size_t M, size_t N, typename T = double>
4120 constexpr T max(const ArcsMat<M,N,T>& U){
4121 return ArcsMat<M,N,T>::max(U);
4122 }
4123
4128 template<size_t M, size_t N, typename T = double>
4129 constexpr std::tuple<size_t,size_t> minidx(const ArcsMat<M,N,T>& U){
4130 return ArcsMat<M,N,T>::minidx(U);
4131 }
4132
4137 template<size_t M, size_t N, typename T = double>
4138 constexpr T min(const ArcsMat<M,N,T>& U){
4139 return ArcsMat<M,N,T>::min(U);
4140 }
4141
4146 template<size_t M, size_t N, typename T = double>
4147 constexpr T sum(const ArcsMat<M,N,T>& U){
4148 return ArcsMat<M,N,T>::sum(U);
4149 }
4150
4155 template<size_t M, size_t N, typename T = double, size_t P, size_t Q, typename R = double>
4156 constexpr void exp(const ArcsMat<M,N,T>& U, ArcsMat<P,Q,R>& Y){
4157 ArcsMat<M,N,T>::exp(U, Y);
4158 }
4159
4164 template<size_t M, size_t N, typename T = double>
4165 constexpr ArcsMat<M,N,T> exp(const ArcsMat<M,N,T>& U){
4166 return ArcsMat<M,N,T>::exp(U);
4167 }
4168
4173 template<size_t M, size_t N, typename T = double, size_t P, size_t Q, typename R = double>
4174 constexpr void log(const ArcsMat<M,N,T>& U, ArcsMat<P,Q,R>& Y){
4175 ArcsMat<M,N,T>::log(U, Y);
4176 }
4177
4182 template<size_t M, size_t N, typename T = double>
4183 constexpr ArcsMat<M,N,T> log(const ArcsMat<M,N,T>& U){
4184 return ArcsMat<M,N,T>::log(U);
4185 }
4186
4191 template<size_t M, size_t N, typename T = double, size_t P, size_t Q, typename R = double>
4192 constexpr void log10(const ArcsMat<M,N,T>& U, ArcsMat<P,Q,R>& Y){
4194 }
4195
4200 template<size_t M, size_t N, typename T = double>
4202 return ArcsMat<M,N,T>::log10(U);
4203 }
4204
4209 template<size_t M, size_t N, typename T = double, size_t P, size_t Q, typename R = double>
4210 constexpr void sin(const ArcsMat<M,N,T>& U, ArcsMat<P,Q,R>& Y){
4211 ArcsMat<M,N,T>::sin(U, Y);
4212 }
4213
4218 template<size_t M, size_t N, typename T = double>
4219 constexpr ArcsMat<M,N,T> sin(const ArcsMat<M,N,T>& U){
4220 return ArcsMat<M,N,T>::sin(U);
4221 }
4222
4227 template<size_t M, size_t N, typename T = double, size_t P, size_t Q, typename R = double>
4228 constexpr void cos(const ArcsMat<M,N,T>& U, ArcsMat<P,Q,R>& Y){
4229 ArcsMat<M,N,T>::cos(U, Y);
4230 }
4231
4236 template<size_t M, size_t N, typename T = double>
4237 constexpr ArcsMat<M,N,T> cos(const ArcsMat<M,N,T>& U){
4238 return ArcsMat<M,N,T>::cos(U);
4239 }
4240
4245 template<size_t M, size_t N, typename T = double, size_t P, size_t Q, typename R = double>
4246 constexpr void tan(const ArcsMat<M,N,T>& U, ArcsMat<P,Q,R>& Y){
4247 ArcsMat<M,N,T>::tan(U, Y);
4248 }
4249
4254 template<size_t M, size_t N, typename T = double>
4255 constexpr ArcsMat<M,N,T> tan(const ArcsMat<M,N,T>& U){
4256 return ArcsMat<M,N,T>::tan(U);
4257 }
4258
4263 template<size_t M, size_t N, typename T = double, size_t P, size_t Q, typename R = double>
4264 constexpr void tanh(const ArcsMat<M,N,T>& U, ArcsMat<P,Q,R>& Y){
4266 }
4267
4272 template<size_t M, size_t N, typename T = double>
4274 return ArcsMat<M,N,T>::tanh(U);
4275 }
4276
4281 template<size_t M, size_t N, typename T = double, size_t P, size_t Q, typename R = double>
4282 constexpr void sqrt(const ArcsMat<M,N,T>& U, ArcsMat<P,Q,R>& Y){
4284 }
4285
4290 template<size_t M, size_t N, typename T = double>
4292 return ArcsMat<M,N,T>::sqrt(U);
4293 }
4294
4299 template<size_t M, size_t N, typename T = double, size_t P, size_t Q, typename R = double>
4300 constexpr void sign(const ArcsMat<M,N,T>& U, ArcsMat<P,Q,R>& Y){
4302 }
4303
4308 template<size_t M, size_t N, typename T = double>
4310 return ArcsMat<M,N,T>::sign(U);
4311 }
4312
4317 template<size_t M, size_t N, typename T = double, size_t P, size_t Q, typename R = double>
4318 constexpr void abs(const ArcsMat<M,N,T>& U, ArcsMat<P,Q,R>& Y){
4319 ArcsMat<M,N,T>::abs(U, Y);
4320 }
4321
4326 template<size_t M, size_t N, typename T = double>
4327 constexpr ArcsMat<M,N,T> abs(const ArcsMat<M,N,T>& U){
4328 return ArcsMat<M,N,T>::abs(U);
4329 }
4330
4335 template<size_t M, size_t N, typename T = double>
4336 constexpr ArcsMat<M,N,T> abs(const ArcsMat<M,N,std::complex<T>>& U){
4337 ArcsMat<M,N,T> Y; // 実数返し用
4338 ArcsMat<M,N,std::complex<T>>::abs(U, Y); // 入力は複素数、出力は実数
4339 return Y; // 実数で返す
4340 }
4341
4346 template<size_t M, size_t N, typename T = std::complex<double>, size_t P, size_t Q, typename R = double>
4347 constexpr void arg(const ArcsMat<M,N,T>& U, ArcsMat<P,Q,R>& Y){
4348 ArcsMat<M,N,T>::arg(U, Y);
4349 }
4350
4355 template<size_t M, size_t N, typename T = double>
4356 constexpr ArcsMat<M,N,T> arg(const ArcsMat<M,N,std::complex<T>>& U){
4357 ArcsMat<M,N,T> Y; // 実数返し用
4358 ArcsMat<M,N,std::complex<T>>::arg(U, Y); // 入力は複素数、出力は実数
4359 return Y; // 実数で返す
4360 }
4361
4366 template<size_t M, size_t N, typename T = std::complex<double>, size_t P, size_t Q, typename R = double>
4367 constexpr void real(const ArcsMat<M,N,T>& U, ArcsMat<P,Q,R>& Y){
4369 }
4370
4375 template<size_t M, size_t N, typename T = double>
4376 constexpr ArcsMat<M,N,T> real(const ArcsMat<M,N,std::complex<T>>& U){
4377 ArcsMat<M,N,T> Y; // 実数返し用
4378 ArcsMat<M,N,std::complex<T>>::real(U, Y); // 入力は複素数、出力は実数
4379 return Y; // 実数で返す
4380 }
4381
4386 template<size_t M, size_t N, typename T = std::complex<double>, size_t P, size_t Q, typename R = double>
4387 constexpr void imag(const ArcsMat<M,N,T>& U, ArcsMat<P,Q,R>& Y){
4389 }
4390
4395 template<size_t M, size_t N, typename T = double>
4396 constexpr ArcsMat<M,N,T> imag(const ArcsMat<M,N,std::complex<T>>& U){
4397 ArcsMat<M,N,T> Y; // 実数返し用
4398 ArcsMat<M,N,std::complex<T>>::imag(U, Y); // 入力は複素数、出力は実数
4399 return Y; // 実数で返す
4400 }
4401
4406 template<size_t M, size_t N, typename T = std::complex<double>, size_t P, size_t Q, typename R = std::complex<double>>
4407 constexpr void conj(const ArcsMat<M,N,T>& U, ArcsMat<P,Q,R>& Y){
4409 }
4410
4415 template<size_t M, size_t N, typename T = std::complex<double>>
4417 return ArcsMat<M,N,T>::conj(U);
4418 }
4419
4424 template<size_t M, size_t N, typename T = double, size_t P, size_t Q, typename R = double>
4425 constexpr void tp(const ArcsMat<M,N,T>& U, ArcsMat<P,Q,R>& Y){
4426 ArcsMat<M,N,T>::tp(U, Y);
4427 }
4428
4433 template <size_t M, size_t N, typename T = double>
4434 constexpr ArcsMat<N,M,T> tp(const ArcsMat<M,N,T>& U){
4435 return ArcsMat<M,N,T>::tp(U);
4436 }
4437
4442 template<size_t M, size_t N, typename T = std::complex<double>, size_t P, size_t Q, typename R = std::complex<double>>
4443 constexpr void Htp(const ArcsMat<M,N,T>& U, ArcsMat<P,Q,R>& Y){
4444 ArcsMat<M,N,T>::Htp(U, Y);
4445 }
4446
4451 template<size_t M, size_t N, typename T = std::complex<double>>
4452 constexpr ArcsMat<N,M,T> Htp(const ArcsMat<M,N,T>& U){
4453 return ArcsMat<M,N,T>::Htp(U);
4454 }
4455
4460 template<NormType NRM = ArcsMatrix::NormType::AMT_L2, typename T = double, size_t M, size_t N>
4461 constexpr T norm(const ArcsMat<M,N,T>& U){
4462 return ArcsMat<M,N,T>::template norm<NRM>(U);
4463 }
4464
4469 template<NormType NRM = ArcsMatrix::NormType::AMT_L2, typename R = double, typename T = double, size_t M, size_t N>
4470 constexpr R norm(const ArcsMat<M,N,std::complex<T>>& U){
4471 return ArcsMat<M,N,std::complex<T>>::template norm<NRM, R>(U);
4472 }
4473
4479 template<size_t M, size_t N, typename T = double, size_t P, size_t Q, typename R = double>
4480 constexpr void gettriup(const ArcsMat<M,N,T>& U, ArcsMat<P,Q,R>& Y, const size_t n = 1){
4481 ArcsMat<M,N,T>::gettriup(U, Y, n);
4482 }
4483
4489 template<size_t M, size_t N, typename T = double>
4490 constexpr ArcsMat<M,N,T> gettriup(const ArcsMat<M,N,T>& U, const size_t n = 1){
4491 return ArcsMat<M,N,T>::gettriup(U, n);
4492 }
4493
4499 template<size_t M, size_t N, typename T = double, size_t P, size_t Q, typename R = double>
4500 constexpr void gettrilo(const ArcsMat<M,N,T>& U, ArcsMat<P,Q,R>& Y, const size_t m = 1){
4501 ArcsMat<M,N,T>::gettrilo(U, Y, m);
4502 }
4503
4509 template<size_t M, size_t N, typename T = double>
4510 constexpr ArcsMat<M,N,T> gettrilo(const ArcsMat<M,N,T>& U, const size_t m = 1){
4511 return ArcsMat<M,N,T>::gettrilo(U, m);
4512 }
4513
4520 template<
4521 size_t M, size_t N, typename T = double, size_t ML, size_t NL, typename TL = double,
4522 size_t MU, size_t NU, typename TU = double, size_t MP, size_t NP, typename TP = double
4523 >
4525 ArcsMat<M,N,T>::LUP(A, L, U, P);
4526 }
4527
4532 template<size_t M, size_t N, typename T = double>
4533 constexpr std::tuple<ArcsMat<M,N,T>, ArcsMat<M,N,T>, ArcsMat<M,N,T>> LUP(const ArcsMat<M,N,T>& A){
4534 return ArcsMat<M,N,T>::LUP(A);
4535 }
4536
4542 template<
4543 size_t M, size_t N, typename T = double,
4544 size_t ML, size_t NL, typename TL = double, size_t MU, size_t NU, typename TU = double
4545 >
4546 constexpr void LU(const ArcsMat<M,N,T>& A, ArcsMat<ML,NL,TL>& L, ArcsMat<MU,NU,TU>& U){
4547 ArcsMat<M,N,T>::LU(A, L, U);
4548 }
4549
4554 template<size_t M, size_t N, typename T = double>
4555 constexpr std::tuple<ArcsMat<M,N,T>, ArcsMat<M,N,T>> LU(const ArcsMat<M,N,T>& A){
4556 return ArcsMat<M,N,T>::LU(A);
4557 }
4558
4563 template<size_t M, size_t N, typename T = double>
4564 constexpr T det(const ArcsMat<M,N,T>& A){
4565 return ArcsMat<M,N,T>::det(A);
4566 }
4567
4573 template<size_t M, size_t N, typename T = double, size_t MH, size_t NH, typename TH = double>
4574 constexpr void Householder(const ArcsMat<M,N,T>& v, ArcsMat<MH,NH,TH>& H, const size_t k = 1){
4576 }
4577
4583 template<size_t M, size_t N, typename T = double>
4584 constexpr ArcsMat<M,M,T> Householder(const ArcsMat<M,N,T>& v, const size_t k = 1){
4585 return ArcsMat<M,N,T>::Householder(v, k);
4586 }
4587
4593 template<
4594 size_t M, size_t N, typename T = double,
4595 size_t MQ, size_t NQ, typename TQ = double, size_t MR, size_t NR, typename TR = double
4596 >
4597 constexpr void QR(const ArcsMat<M,N,T>& A, ArcsMat<MQ,NQ,TQ>& Q, ArcsMat<MR,NR,TR>& R){
4598 ArcsMat<M,N,T>::QR(A, Q, R);
4599 }
4600
4605 template<size_t M, size_t N, typename T = double>
4606 constexpr std::tuple<ArcsMat<M,M,T>, ArcsMat<M,N,T>> QR(const ArcsMat<M,N,T>& A){
4607 return ArcsMat<M,N,T>::QR(A);
4608 }
4609
4616 template<
4617 size_t M, size_t N, typename T = double, size_t MU, size_t NU, typename TU = double,
4618 size_t MS, size_t NS, typename TS = double, size_t MV, size_t NV, typename TV = double
4619 >
4621 ArcsMat<M,N,T>::SVD(A, U, S, V);
4622 }
4623
4628 template<size_t M, size_t N, typename T = double>
4629 constexpr std::tuple<ArcsMat<M,M,T>, ArcsMat<M,N,T>, ArcsMat<N,N,T>> SVD(const ArcsMat<M,N,T>& A){
4630 return ArcsMat<M,N,T>::SVD(A);
4631 }
4632
4637 template<size_t M, size_t N, typename T = double>
4638 constexpr size_t rank(const ArcsMat<M,N,T>& A, const T eps = ArcsMat<M,N,T>::EPSILON){
4639 return ArcsMat<M,N,T>::rank(A, eps);
4640 }
4641
4647 template<size_t M, size_t N, typename T = double, size_t ML, size_t NL, typename TL = double, size_t MD, size_t ND, typename TD = double>
4648 constexpr void LDL(const ArcsMat<M,N,T>& A, ArcsMat<ML,NL,TL>& L, ArcsMat<MD,ND,TD>& D){
4649 ArcsMat<M,N,T>::LDL(A, L, D);
4650 }
4651
4656 template<size_t M, size_t N, typename T = double>
4657 constexpr std::tuple<ArcsMat<M,N,T>, ArcsMat<M,N,T>> LDL(const ArcsMat<M,N,T>& A){
4658 return ArcsMat<M,N,T>::LDL(A);
4659 }
4660
4665 template<size_t M, size_t N, typename T = double, size_t ML, size_t NL, typename TL = double>
4666 constexpr void Cholesky(const ArcsMat<M,N,T>& A, ArcsMat<ML,NL,TL>& R){
4668 }
4669
4674 template<size_t M, size_t N, typename T = double>
4676 return ArcsMat<M,N,T>::Cholesky(A);
4677 }
4678
4684 template<size_t M, size_t N, typename T = double, size_t MB, size_t NB, typename TB = double, size_t MX, size_t NX, typename TX = double>
4685 constexpr void linsolve(const ArcsMat<M,N,T>& A, const ArcsMat<MB,NB,TB>& B, ArcsMat<MX,NX,TX>& X){
4686 ArcsMat<M,N,T>::linsolve(A, B, X);
4687 }
4688
4694 template<size_t M, size_t N, typename T = double, size_t MB, size_t NB, typename TB = double>
4696 return ArcsMat<M,N,T>::linsolve(A, B);
4697 }
4698
4703 template<size_t M, size_t N, typename T = double, size_t P, size_t Q, typename R = double>
4704 constexpr void inv(const ArcsMat<M,N,T>& A, ArcsMat<P,Q,R>& Y){
4705 ArcsMat<M,N,T>::inv(A, Y);
4706 }
4707
4712 template<size_t M, size_t N, typename T = double>
4713 constexpr ArcsMat<M,N,T> inv(const ArcsMat<M,N,T>& A){
4714 return ArcsMat<M,N,T>::inv(A);
4715 }
4716
4721 template<size_t M, size_t N, typename T = double, size_t P, size_t Q, typename R = double>
4722 constexpr void pinv(const ArcsMat<M,N,T>& A, ArcsMat<P,Q,R>& Y){
4724 }
4725
4730 template<size_t M, size_t N, typename T = double>
4732 return ArcsMat<M,N,T>::pinv(A);
4733 }
4734
4741 template<size_t M, size_t N, typename T = double, size_t MP, size_t NP, typename TP = double, size_t MH, size_t NH, typename TH = double>
4744 }
4745
4751 template<size_t M, size_t N, typename T = double>
4752 constexpr std::tuple<ArcsMat<M,N,T>, ArcsMat<M,N,T>> Hessenberg(const ArcsMat<M,N,T>& A){
4754 }
4755
4762 template<size_t M, size_t N, typename T = double, size_t MU, size_t NU, typename TU = double, size_t MS, size_t NS, typename TS = double>
4764 ArcsMat<M,N,T>::Schur(A, U, S);
4765 }
4766
4772 template<size_t M, size_t N, typename T = double>
4773 constexpr std::tuple<ArcsMat<M,N,T>, ArcsMat<M,N,T>> Schur(const ArcsMat<M,N,T>& A){
4774 return ArcsMat<M,N,T>::Schur(A);
4775 }
4776
4781 template<size_t M, size_t N, typename T = double, size_t MV, size_t NV, typename TV = std::complex<double>>
4782 constexpr void eig(const ArcsMat<M,N,T>& A, ArcsMat<MV,NV,TV>& v){
4783 ArcsMat<M,N,T>::eig(A, v);
4784 }
4785
4790 template<size_t M, size_t N, typename T = double, typename TV = std::complex<double>>
4792 return ArcsMat<M,N,T>::eig(A);
4793 }
4794
4800 template<size_t M, size_t N, typename T = double, size_t MV, size_t NV, typename TV = std::complex<double>, size_t MD, size_t ND, typename TD = std::complex<double>>
4802 ArcsMat<M,N,T>::eigvec(A, V, D);
4803 }
4804
4809 template<size_t M, size_t N, typename T = double, typename TV = std::complex<double>>
4810 constexpr std::tuple< ArcsMat<M,N,TV>, ArcsMat<M,N,TV> > eigvec(const ArcsMat<M,N,T>& A){
4811 return ArcsMat<M,N,T>::eigvec(A);
4812 }
4813
4819 template<size_t M, size_t N, typename T = double, size_t MR, size_t NR, typename TR = double, size_t MY, size_t NY, typename TY = double>
4820 constexpr void Kron(const ArcsMat<M,N,T>& L, const ArcsMat<MR,NR,TR>& R, ArcsMat<MY,NY,TY>& Y){
4821 ArcsMat<M,N,T>::Kron(L, R, Y);
4822 }
4823
4829 template<size_t M, size_t N, typename T = double, size_t MR, size_t NR, typename TR = double>
4831 return ArcsMat<M,N,T>::Kron(L, R);
4832 }
4833
4839 template<size_t M, size_t N, typename T = double, size_t MR, size_t NR, typename TR = double, size_t MY, size_t NY, typename TY = double>
4840 constexpr void cross(const ArcsMat<M,N,T>& L, const ArcsMat<MR,NR,TR>& R, ArcsMat<MY,NY,TY>& Y){
4841 ArcsMat<M,N,T>::cross(L, R, Y);
4842 }
4843
4849 template<size_t M, size_t N, typename T = double, size_t MR, size_t NR, typename TR = double>
4851 return ArcsMat<M,N,T>::cross(L, R);
4852 }
4853
4858 template<size_t M, size_t N, typename T = double, size_t MY, size_t NY, typename TY = double>
4859 constexpr void vec(const ArcsMat<M,N,T>& U, ArcsMat<MY,NY,TY>& y){
4860 ArcsMat<M,N,T>::vec(U, y);
4861 }
4862
4867 template<size_t M, size_t N, typename T = double>
4869 return ArcsMat<M,N,T>::vec(U);
4870 }
4871
4876 template<size_t M, size_t N, typename T = double, size_t MY, size_t NY, typename TY = double>
4877 constexpr void vecinv(const ArcsMat<M,N,T>& u, ArcsMat<MY,NY,TY>& Y){
4879 }
4880
4886 template<size_t MY, size_t NY, size_t M, size_t N, typename T = double>
4888 return ArcsMat<M,N,T>::template vecinv<MY,NY>(u);
4889 }
4890
4896 template<size_t M, size_t N, typename T = double, size_t MY, size_t NY, typename TY = double>
4897 constexpr void expm(const ArcsMat<M,N,T>& U, ArcsMat<MY,NY,TY>& Y, const size_t k = 13){
4898 ArcsMat<M,N,T>::expm(U, Y, k);
4899 }
4900
4906 template<size_t M, size_t N, typename T = double>
4907 constexpr ArcsMat<M,N,T> expm(const ArcsMat<M,N,T>& U, const size_t k = 13){
4908 return ArcsMat<M,N,T>::expm(U, k);
4909 }
4910}
4911}
4912
4913#endif
ARCS用ASSERTクラス
#define arcs_assert(a)
ARCS用assertマクロ a : assert条件
Definition ARCSassert.hh:17
constexpr void expm(const ArcsMat< M, N, T > &U, ArcsMat< MY, NY, TY > &Y, const size_t k=13)
行列指数関数 (引数渡し版)
Definition ArcsMatrix.hh:4897
constexpr T sum(const ArcsMat< M, N, T > &U)
行列要素の総和を返す関数(戻り値渡し版のみ)
Definition ArcsMatrix.hh:4147
constexpr void Kron(const ArcsMat< M, N, T > &L, const ArcsMat< MR, NR, TR > &R, ArcsMat< MY, NY, TY > &Y)
クロネッカー積(引数渡し版)
Definition ArcsMatrix.hh:4820
constexpr void shiftright(const ArcsMat< M, N, T > &U, ArcsMat< P, Q, R > &Y, const size_t n=1)
行列の各要素を右にn列分シフトする関数(左段の列はゼロになる)(引数渡し版)
Definition ArcsMatrix.hh:3972
constexpr void abs(const ArcsMat< M, N, T > &U, ArcsMat< P, Q, R > &Y)
行列要素の絶対値を計算する関数(引数渡し版)
Definition ArcsMatrix.hh:4318
constexpr void LUP(const ArcsMat< M, N, T > &A, ArcsMat< ML, NL, TL > &L, ArcsMat< MU, NU, TU > &U, ArcsMat< MP, NP, TP > &P)
LU分解の結果と置換行列を返す関数(引数渡し版)
Definition ArcsMatrix.hh:4524
constexpr void cos(const ArcsMat< M, N, T > &U, ArcsMat< P, Q, R > &Y)
行列要素の余弦関数を計算する関数(引数渡し版)
Definition ArcsMatrix.hh:4228
constexpr void setrow(ArcsMat< M, N, T > &UY, const ArcsMat< P, Q, R > &u, const size_t m)
指定した行を横ベクトルで上書きする関数 (引数渡し版)
Definition ArcsMatrix.hh:3654
constexpr void log(const ArcsMat< M, N, T > &U, ArcsMat< P, Q, R > &Y)
行列要素の対数関数(底e版)を計算する関数(引数渡し版)
Definition ArcsMatrix.hh:4174
constexpr T norm(const ArcsMat< M, N, T > &U)
行列のノルムを返す関数(戻り値渡し版のみ)
Definition ArcsMatrix.hh:4461
constexpr void gettrilo(const ArcsMat< M, N, T > &U, ArcsMat< P, Q, R > &Y, const size_t m=1)
m行目を上端として左下の下三角部分のみを返す関数(上三角部分はゼロ)(引数渡し版)
Definition ArcsMatrix.hh:4500
constexpr void sumcolumn(const ArcsMat< M, N, T > &U, ArcsMat< P, Q, R > &y)
各列の総和を計算して横ベクトルを出力する関数 (引数渡し版)
Definition ArcsMatrix.hh:3615
constexpr void gettriup(const ArcsMat< M, N, T > &U, ArcsMat< P, Q, R > &Y, const size_t n=1)
n列目を左端として右上の上三角部分のみを返す関数(下三角部分はゼロ)(引数渡し版)
Definition ArcsMatrix.hh:4480
constexpr void vecinv(const ArcsMat< M, N, T > &u, ArcsMat< MY, NY, TY > &Y)
vec作用素の逆(縦ベクトル→行列) (引数渡し版)
Definition ArcsMatrix.hh:4877
constexpr void fillcolumn(ArcsMat< M, N, T > &UY, const R a, const size_t n, const size_t m1, const size_t m2)
n列目のm1行目からm2行目までを数値aで埋める関数 (m1 <= m2 であること) (引数渡し版)
Definition ArcsMatrix.hh:3574
constexpr void linsolve(const ArcsMat< M, N, T > &A, const ArcsMat< MB, NB, TB > &B, ArcsMat< MX, NX, TX > &X)
AX = Bの形の線形方程式をXについて解く関数(引数渡し版)
Definition ArcsMatrix.hh:4685
constexpr ArcsMat< M, N, T > ordercolumn(const ArcsMat< M, N, T > &U, const ArcsMat< P, Q, R > &u)
並び替え指定横ベクトルuが昇順になるように,行列Uの列を並び替える関数 (戻り値渡し版のみ)
Definition ArcsMatrix.hh:3597
constexpr T max(const ArcsMat< M, N, T > &U)
行列要素の最大値を返す関数(戻り値渡し版のみ)
Definition ArcsMatrix.hh:4120
constexpr void ordercolumn_and_vec(ArcsMat< M, N, T > &UY, ArcsMat< P, Q, R > &uy)
並び替え指定横ベクトルuが昇順になるように,行列Uの列と指定横ベクトルの両方を並び替える関数 (引数渡し版のみ)
Definition ArcsMatrix.hh:3606
constexpr std::tuple< size_t, size_t > maxidx(const ArcsMat< M, N, T > &U)
行列要素の最大値の要素番号を返す関数(戻り値渡し版のみ)
Definition ArcsMatrix.hh:4111
constexpr void sethvector(ArcsMat< M, N, T > &UY, const ArcsMat< P, Q, R > &u, const size_t m, const size_t n)
指定位置に横ベクトルで上書きする関数 (引数渡し版)
Definition ArcsMatrix.hh:3826
constexpr void cross(const ArcsMat< M, N, T > &L, const ArcsMat< MR, NR, TR > &R, ArcsMat< MY, NY, TY > &Y)
クロス積 (引数渡し版)
Definition ArcsMatrix.hh:4840
constexpr void gethvector(const ArcsMat< M, N, T > &U, ArcsMat< P, Q, R > &y, const size_t m, const size_t n)
指定位置から横ベクトルを抽出する関数 (引数渡し版)
Definition ArcsMatrix.hh:3804
constexpr void sumrow(const ArcsMat< M, N, T > &U, ArcsMat< P, Q, R > &y)
各行の総和を計算して縦ベクトルを出力する関数 (引数渡し版)
Definition ArcsMatrix.hh:3739
constexpr void Schur(const ArcsMat< M, N, T > &A, ArcsMat< MU, NU, TU > &U, ArcsMat< MS, NS, TS > &S)
複素Schur分解(引数渡し版) この関数はMATLABとは異なる解を出力する、ただしもちろん、A = USU' は成立
Definition ArcsMatrix.hh:4763
constexpr void tan(const ArcsMat< M, N, T > &U, ArcsMat< P, Q, R > &Y)
行列要素の正接関数を計算する関数(引数渡し版)
Definition ArcsMatrix.hh:4246
constexpr void Householder(const ArcsMat< M, N, T > &v, ArcsMat< MH, NH, TH > &H, const size_t k=1)
Householder行列を生成する関数(引数渡し版)
Definition ArcsMatrix.hh:4574
constexpr void concath(const ArcsMat< M, N, T > &U1, const ArcsMat< P, Q, R > &U2, ArcsMat< D, E, F > &Y)
行列を横に連結する関数(引数渡し版)
Definition ArcsMatrix.hh:4011
constexpr void shiftleft(const ArcsMat< M, N, T > &U, ArcsMat< P, Q, R > &Y, const size_t n=1)
行列の各要素を左にn列分シフトする関数(右段の列はゼロになる)(引数渡し版)
Definition ArcsMatrix.hh:3952
constexpr ArcsMat< M, N, T > ones(void)
m行n列の要素がすべて1の行列を返す関数
Definition ArcsMatrix.hh:3492
constexpr void sin(const ArcsMat< M, N, T > &U, ArcsMat< P, Q, R > &Y)
行列要素の正弦関数を計算する関数(引数渡し版)
Definition ArcsMatrix.hh:4210
constexpr T trace(const ArcsMat< M, N, T > &U)
行列のトレースを返す関数(戻り値渡し版のみ)
Definition ArcsMatrix.hh:4093
constexpr std::tuple< size_t, size_t > minidx(const ArcsMat< M, N, T > &U)
行列要素の最小値の要素番号を返す関数(戻り値渡し版のみ)
Definition ArcsMatrix.hh:4129
constexpr void concatv(const ArcsMat< M, N, T > &U1, const ArcsMat< P, Q, R > &U2, ArcsMat< D, E, F > &Y)
行列を縦に連結する関数(引数渡し版)
Definition ArcsMatrix.hh:3991
constexpr void pinv(const ArcsMat< M, N, T > &A, ArcsMat< P, Q, R > &Y)
Moore-Penroseの擬似逆行列を返す関数(引数渡し版)
Definition ArcsMatrix.hh:4722
constexpr void setcolumn(ArcsMat< M, N, T > &UY, const ArcsMat< P, Q, R > &u, const size_t n)
指定した列を縦ベクトルで上書きする関数 (引数渡し版)
Definition ArcsMatrix.hh:3530
constexpr void Hessenberg(const ArcsMat< M, N, T > &A, ArcsMat< MP, NP, TP > &P, ArcsMat< MH, NH, TH > &H)
Hessenberg分解(引数渡し版) 複素数の場合、この関数はMATLABとは異なる解を出力する。
Definition ArcsMatrix.hh:4742
constexpr void getvvector(const ArcsMat< M, N, T > &U, ArcsMat< P, Q, R > &y, const size_t m, const size_t n)
指定位置から縦ベクトルを抽出する関数 (引数渡し版)
Definition ArcsMatrix.hh:3759
constexpr void LDL(const ArcsMat< M, N, T > &A, ArcsMat< ML, NL, TL > &L, ArcsMat< MD, ND, TD > &D)
修正コレスキー分解(LDL分解) (引数渡し版)
Definition ArcsMatrix.hh:4648
constexpr void shiftup(const ArcsMat< M, N, T > &U, ArcsMat< P, Q, R > &Y, const size_t m=1)
行列の各要素を上に1行分シフトする関数(下段の行はゼロになる)(引数渡し版)
Definition ArcsMatrix.hh:3912
constexpr void tp(const ArcsMat< M, N, T > &U, ArcsMat< P, Q, R > &Y)
転置行列を返す関数 (引数渡し版)
Definition ArcsMatrix.hh:4425
constexpr void eigvec(const ArcsMat< M, N, T > &A, ArcsMat< MV, NV, TV > &V, ArcsMat< MD, ND, TD > &D)
固有値を持つ対角行列Dと、各々の固有値に対応する固有ベクトルを持つ行列Vを返す関数(引数渡し版)
Definition ArcsMatrix.hh:4801
constexpr void Cholesky(const ArcsMat< M, N, T > &A, ArcsMat< ML, NL, TL > &R)
修正コレスキー分解(引数渡し版)
Definition ArcsMatrix.hh:4666
constexpr void log10(const ArcsMat< M, N, T > &U, ArcsMat< P, Q, R > &Y)
行列要素の対数関数(底10版)を計算する関数(引数渡し版)
Definition ArcsMatrix.hh:4192
constexpr void setsubmatrix(ArcsMat< M, N, T > &UY, const ArcsMat< P, Q, R > &U, const size_t m, const size_t n)
小行列を行列の指定位置に上書きする関数 (引数渡し版)
Definition ArcsMatrix.hh:3871
constexpr ArcsMat< M, N, T > eye(void)
M行N列の単位行列を返す関数
Definition ArcsMatrix.hh:3476
constexpr void getdiag(const ArcsMat< M, N, T > &U, ArcsMat< P, Q, R > &y, const ssize_t k=0)
行列の対角要素を縦ベクトルとして取得する関数(引数渡し版)
Definition ArcsMatrix.hh:4074
constexpr void shiftdown(const ArcsMat< M, N, T > &U, ArcsMat< P, Q, R > &Y, const size_t m=1)
行列の各要素を下にm行分シフトする関数(上段の行はゼロになる)(引数渡し版)
Definition ArcsMatrix.hh:3932
NormType
ノルム計算方法の定義
Definition ArcsMatrix.hh:50
@ AMT_L1
絶対値ノルム(1-ノルム)
@ AMT_L2
ユークリッドノルム(2-ノルム)
@ AMT_LINF
無限大ノルム(最大値ノルム)
constexpr void swaprow(ArcsMat< M, N, T > &UY, const size_t m1, const size_t m2)
指定した行と行を入れ替える関数 (引数渡し版)
Definition ArcsMatrix.hh:3675
constexpr void getcolumn(const ArcsMat< M, N, T > &U, ArcsMat< P, Q, R > &y, const size_t n)
指定した列から縦ベクトルとして抽出する関数 (引数渡し版)
Definition ArcsMatrix.hh:3510
constexpr void exp(const ArcsMat< M, N, T > &U, ArcsMat< P, Q, R > &Y)
行列要素の指数関数を計算する関数(引数渡し版)
Definition ArcsMatrix.hh:4156
constexpr void real(const ArcsMat< M, N, T > &U, ArcsMat< P, Q, R > &Y)
複素数行列要素の実数部を取得する関数(引数渡し版)
Definition ArcsMatrix.hh:4367
constexpr void arg(const ArcsMat< M, N, T > &U, ArcsMat< P, Q, R > &Y)
複素数行列要素の偏角を計算する関数(引数渡し版)
Definition ArcsMatrix.hh:4347
constexpr void eig(const ArcsMat< M, N, T > &A, ArcsMat< MV, NV, TV > &v)
固有値を返す関数
Definition ArcsMatrix.hh:4782
constexpr void orderrow_and_vec(ArcsMat< M, N, T > &UY, ArcsMat< P, Q, R > &uy)
並び替え指定縦ベクトルuが昇順になるように,行列Uの行と指定縦ベクトルの両方を並び替える関数 (引数渡し版のみ)
Definition ArcsMatrix.hh:3730
constexpr T det(const ArcsMat< M, N, T > &A)
行列式の値を返す関数(戻り値返し版のみ)
Definition ArcsMatrix.hh:4564
constexpr T multdiag(const ArcsMat< M, N, T > &U)
行列の対角要素の総積を返す関数(戻り値渡し版のみ)
Definition ArcsMatrix.hh:4102
MatStatus
行列の状態の定義
Definition ArcsMatrix.hh:57
@ AMT_LU_EVEN
LU分解したときに並べ替えが偶数回発生
@ AMT_LU_ODD
LU分解したときに並べ替えが奇数回発生
@ AMT_NA
状態定義該当なし
constexpr void sqrt(const ArcsMat< M, N, T > &U, ArcsMat< P, Q, R > &Y)
行列要素の平方根を計算する関数(引数渡し版)
Definition ArcsMatrix.hh:4282
constexpr void copymatrix(const ArcsMat< M, N, T > &U, const size_t m1, const size_t m2, const size_t n1, const size_t n2, ArcsMat< P, Q, R > &Y, const size_t my, const size_t ny)
行列Uから別の行列Yへ位置とサイズを指定してコピーする関数(引数渡し版のみ) 等価なMATLABコード: Y(my:my+(m2-m1), ny:ny+(n2-n1)) = U(m1:m2,...
Definition ArcsMatrix.hh:3899
constexpr void vec(const ArcsMat< M, N, T > &U, ArcsMat< MY, NY, TY > &y)
vec作用素(行列→縦ベクトル) (引数渡し版)
Definition ArcsMatrix.hh:4859
constexpr void QR(const ArcsMat< M, N, T > &A, ArcsMat< MQ, NQ, TQ > &Q, ArcsMat< MR, NR, TR > &R)
QR分解(引数渡し版)
Definition ArcsMatrix.hh:4597
constexpr ArcsMat< M, N, T > zeros(void)
m行n列の零行列を返す関数
Definition ArcsMatrix.hh:3484
constexpr void getsubmatrix(const ArcsMat< M, N, T > &U, ArcsMat< P, Q, R > &Y, const size_t m, const size_t n)
行列から指定位置の小行列を抽出する関数 (引数渡し版)
Definition ArcsMatrix.hh:3849
constexpr void setvvector(ArcsMat< M, N, T > &UY, const ArcsMat< P, Q, R > &u, const size_t m, const size_t n)
指定位置に縦ベクトルで上書きする関数 (引数渡し版)
Definition ArcsMatrix.hh:3781
constexpr void diag(const ArcsMat< M, N, T > &u, ArcsMat< P, Q, R > &Y)
縦ベクトルの各要素を対角要素に持つ正方行列を生成する関数(引数渡し版)
Definition ArcsMatrix.hh:4055
constexpr T min(const ArcsMat< M, N, T > &U)
行列要素の最小値を返す関数(戻り値渡し版のみ)
Definition ArcsMatrix.hh:4138
constexpr void sign(const ArcsMat< M, N, T > &U, ArcsMat< P, Q, R > &Y)
行列要素の符号関数を計算する関数(引数渡し版)
Definition ArcsMatrix.hh:4300
constexpr void getrow(const ArcsMat< M, N, T > &U, ArcsMat< P, Q, R > &y, const size_t m)
指定した行から横ベクトルとして抽出する関数 (引数渡し版)
Definition ArcsMatrix.hh:3634
constexpr void LU(const ArcsMat< M, N, T > &A, ArcsMat< ML, NL, TL > &L, ArcsMat< MU, NU, TU > &U)
LU分解の結果のみ返す関数(引数渡し版)
Definition ArcsMatrix.hh:4546
constexpr ArcsMat< M, N, T > orderrow(const ArcsMat< M, N, T > &U, const ArcsMat< P, Q, R > &u)
並び替え指定縦ベクトルuが昇順になるように,行列Uの行を並び替える関数 (戻り値渡し版のみ)
Definition ArcsMatrix.hh:3721
constexpr void tanh(const ArcsMat< M, N, T > &U, ArcsMat< P, Q, R > &Y)
行列要素の双曲線正接関数を計算する関数(引数渡し版)
Definition ArcsMatrix.hh:4264
constexpr void SVD(const ArcsMat< M, N, T > &A, ArcsMat< MU, NU, TU > &U, ArcsMat< MS, NS, TS > &S, ArcsMat< MV, NV, TV > &V)
SVD特異値分解(引数渡し版)
Definition ArcsMatrix.hh:4620
constexpr void imag(const ArcsMat< M, N, T > &U, ArcsMat< P, Q, R > &Y)
複素数行列要素の虚数部を取得する関数(引数渡し版)
Definition ArcsMatrix.hh:4387
constexpr size_t rank(const ArcsMat< M, N, T > &A, const T eps=ArcsMat< M, N, T >::EPSILON)
行列の階数を返す関数(戻り値返し版のみ)
Definition ArcsMatrix.hh:4638
constexpr ArcsMat< M, N, T > ramp(void)
単調増加の縦ベクトルを返す関数
Definition ArcsMatrix.hh:3500
constexpr void concat4(const ArcsMat< M, N, T > &U11, const ArcsMat< P, Q, R > &U12, const ArcsMat< D, E, F > &U21, const ArcsMat< G, H, L > &U22, ArcsMat< V, W, X > &Y)
4つの行列を1つに連結する関数(戻り値渡し版)
Definition ArcsMatrix.hh:4033
constexpr void Htp(const ArcsMat< M, N, T > &U, ArcsMat< P, Q, R > &Y)
エルミート転置行列を返す関数 (引数渡し版)
Definition ArcsMatrix.hh:4443
constexpr void fillrow(ArcsMat< M, N, T > &UY, const R a, const size_t m, const size_t n1, const size_t n2)
m行目のn1列目からn2列目までを数値aで埋める関数 (n1 <= n2 であること) (引数渡し版)
Definition ArcsMatrix.hh:3698
constexpr void swapcolumn(ArcsMat< M, N, T > &UY, const size_t n1, const size_t n2)
指定した列と列を入れ替える関数 (引数渡し版)
Definition ArcsMatrix.hh:3551
constexpr void conj(const ArcsMat< M, N, T > &U, ArcsMat< P, Q, R > &Y)
複素数行列要素の複素共役を取得する関数(引数渡し版)
Definition ArcsMatrix.hh:4407
constexpr void inv(const ArcsMat< M, N, T > &A, ArcsMat< P, Q, R > &Y)
逆行列を返す関数(引数渡し版)
Definition ArcsMatrix.hh:4704
Definition ArcsMatrix.hh:67
Definition ArcsMatrix.hh:73
ARCS-Matrix 行列演算クラス
Definition ArcsMatrix.hh:89
constexpr void Set(const T1 &u1, const T2 &... u2)
行列要素に値を設定する関数
Definition ArcsMatrix.hh:643
static constexpr void real(const ArcsMat< M, N, T > &U, ArcsMat< P, Q, R > &Y)
複素数行列要素の実数部を取得する関数(引数渡し版)
Definition ArcsMatrix.hh:2084
constexpr ArcsMat< 1, Q, T > GetHorizontalVec(const size_t m, const size_t n) const
指定した先頭位置から横ベクトルを抜き出して返す関数 (戻り値渡し版)
Definition ArcsMatrix.hh:826
static constexpr void LU(const ArcsMat< M, N, T > &A, ArcsMat< ML, NL, TL > &L, ArcsMat< MU, NU, TU > &U)
LU分解の結果のみ返す関数(引数渡し版)
Definition ArcsMatrix.hh:2377
static constexpr ArcsMat< 1, N, T > sumcolumn(const ArcsMat< M, N, T > &U)
各列の総和を計算して横ベクトルを出力する関数 (戻り値渡し版)
Definition ArcsMatrix.hh:1080
static constexpr ArcsMat< M, N, T > exp(const ArcsMat< M, N, T > &U)
行列要素の指数関数を計算する関数(戻り値渡し版)
Definition ArcsMatrix.hh:1846
static constexpr void getvvector(const ArcsMat< M, N, T > &U, ArcsMat< P, Q, R > &y, const size_t m, const size_t n)
指定位置から縦ベクトルを抽出する関数 (引数渡し版)
Definition ArcsMatrix.hh:1247
static constexpr ArcsMat< M, N, T > fillcolumn(const R a, const size_t n, const size_t m1, const size_t m2, const ArcsMat< M, N, T > &U)
n列目のm1行目からm2行目までを数値aで埋める関数 (n1 <= n2 であること) (戻り値渡し版)
Definition ArcsMatrix.hh:1024
constexpr void LoadArray(const std::array< R, P > &Array)
1次元std::array配列を縦ベクトルとして読み込む関数
Definition ArcsMatrix.hh:720
static constexpr ArcsMat< M, N, T > fillrow(const R a, const size_t m, const size_t n1, const size_t n2, const ArcsMat< M, N, T > &U)
m行目のn1列目からn2列目までを数値aで埋める関数 (n1 <= n2 であること) (戻り値渡し版)
Definition ArcsMatrix.hh:1178
constexpr T & operator[](const size_t m)
縦ベクトル添字演算子(縦ベクトルのm番目の要素に値を設定する。A(m,1) = xと同じ意味) 備考:ArcsMatは縦ベクトル優先なので、横ベクトル添字演算子は無い。
Definition ArcsMatrix.hh:218
constexpr void SetHorizontalVec(const ArcsMat< P, Q, R > &w, size_t m, size_t n)
指定した先頭位置に横ベクトルを埋め込む関数
Definition ArcsMatrix.hh:853
static constexpr T max(const ArcsMat< M, N, T > &U)
行列要素の最大値を返す関数(戻り値渡し版のみ)
Definition ArcsMatrix.hh:1782
static constexpr void sumrow(const ArcsMat< M, N, T > &U, ArcsMat< P, Q, R > &y)
各行の総和を計算して縦ベクトルを出力する関数 (引数渡し版)
Definition ArcsMatrix.hh:1221
constexpr friend ArcsMat< M, N, T > operator*(const T &left, const ArcsMat< M, N, T > &right)
行列乗算演算子 (スカラー*行列の場合)
Definition ArcsMatrix.hh:542
static constexpr std::tuple< ArcsMat< M, M, T >, ArcsMat< M, N, T > > QR(const ArcsMat< M, N, T > &A)
QR分解(タプル返し版)
Definition ArcsMatrix.hh:2506
constexpr void GetVerticalVec(ArcsMat< P, Q, R > &v, const size_t m, const size_t n) const
指定した先頭位置から縦ベクトルを抜き出して返す関数 (引数渡し版)
Definition ArcsMatrix.hh:784
static constexpr ArcsMat< M+P, N, T > concatv(const ArcsMat< M, N, T > &U1, const ArcsMat< P, Q, R > &U2)
行列を縦に連結する関数(戻り値渡し版)
Definition ArcsMatrix.hh:1583
static constexpr void sin(const ArcsMat< M, N, T > &U, ArcsMat< P, Q, R > &Y)
行列要素の正弦関数を計算する関数(引数渡し版)
Definition ArcsMatrix.hh:1905
static constexpr void concat4(const ArcsMat< M, N, T > &U11, const ArcsMat< P, Q, R > &U12, const ArcsMat< D, E, F > &U21, const ArcsMat< G, H, L > &U22, ArcsMat< V, W, X > &Y)
4つの行列を1つに連結する関数(引数渡し版)
Definition ArcsMatrix.hh:1625
static constexpr double EPSILON
零とみなす閾値(実数版)
Definition ArcsMatrix.hh:3373
static constexpr ArcsMat< M, 1, T > sumrow(const ArcsMat< M, N, T > &U)
各行の総和を計算して縦ベクトルを出力する関数 (戻り値渡し版)
Definition ArcsMatrix.hh:1234
constexpr T & operator()(const size_t m, const size_t n, const bool chk)
行列括弧演算子(行列の(m,n)要素に値を設定する。サイズチェック可能版)
Definition ArcsMatrix.hh:257
static constexpr ArcsMat< M, N, T > setsubmatrix(const ArcsMat< P, Q, R > &Us, const size_t m, const size_t n, const ArcsMat< M, N, T > &U)
小行列を行列の指定位置に上書きする関数 (戻り値渡し版)
Definition ArcsMatrix.hh:1387
static constexpr std::tuple< ArcsMat< M, N, T >, ArcsMat< M, N, T >, ArcsMat< M, N, T > > LUP(const ArcsMat< M, N, T > &A)
LU分解の結果と置換行列を返す関数(タプル返し版)
Definition ArcsMatrix.hh:2365
constexpr ArcsMat(const std::initializer_list< R > InitList)
コンストラクタ(初期化リスト版)
Definition ArcsMatrix.hh:121
constexpr friend void operator/(const T &left, const ArcsMat< M, N, T > &right)
行列除算演算子 (スカラー/行列の場合)
Definition ArcsMatrix.hh:549
static constexpr void LUP(const ArcsMat< M, N, T > &A, ArcsMat< ML, NL, TL > &L, ArcsMat< MU, NU, TU > &U, ArcsMat< MP, NP, TP > &P)
LU分解の結果と置換行列を返す関数(引数渡し版)
Definition ArcsMatrix.hh:2295
static constexpr void exp(const ArcsMat< M, N, T > &U, ArcsMat< P, Q, R > &Y)
行列要素の指数関数を計算する関数(引数渡し版)
Definition ArcsMatrix.hh:1833
constexpr void DispSize(void) const
行列のサイズを表示
Definition ArcsMatrix.hh:607
static constexpr void setvvector(ArcsMat< M, N, T > &UY, const ArcsMat< P, Q, R > &u, const size_t m, const size_t n)
指定位置に縦ベクトルで上書きする関数 (引数渡し版)
Definition ArcsMatrix.hh:1269
static constexpr void pinv(const ArcsMat< M, N, T > &A, ArcsMat< P, Q, R > &Y)
Moore-Penroseの擬似逆行列を返す関数(引数渡し版)
Definition ArcsMatrix.hh:2948
static constexpr ArcsMat< M+D, N+Q, T > concat4(const ArcsMat< M, N, T > &U11, const ArcsMat< P, Q, R > &U12, const ArcsMat< D, E, F > &U21, const ArcsMat< G, H, L > &U22)
4つの行列を1つに連結する関数(戻り値渡し版)
Definition ArcsMatrix.hh:1660
static constexpr std::tuple< ArcsMat< M, N, TV >, ArcsMat< M, N, TV > > eigvec(const ArcsMat< M, N, T > &A)
固有値を持つ対角行列Dと、各々の固有値に対応する固有ベクトルを持つ行列Vを返す関数(タプル返し版)
Definition ArcsMatrix.hh:3135
static constexpr ArcsMat< M, N, T > ones(void)
m行n列の要素がすべて1の行列を返す関数
Definition ArcsMatrix.hh:902
static constexpr ArcsMat< M, N, T > shiftdown(const ArcsMat< M, N, T > &U, const size_t m=1)
行列の各要素を下にm行分シフトする関数(上段の行はゼロになる)(戻り値渡し版)
Definition ArcsMatrix.hh:1487
static constexpr void linsolve_mat_nsqh(const ArcsMat< M, N, T > &A, const ArcsMat< MB, NB, TB > &B, ArcsMat< MX, NX, TX > &X)
AX = Bの形の線形方程式をXについて解く関数(非正方横行列A・行列X,B版) (内部用引数渡し版のみ) この関数はMATLABとは異なる解を出力する、ただしもちろん、AX = B は成立
Definition ArcsMatrix.hh:2856
static constexpr void linsolve_vec(const ArcsMat< M, N, T > &A, const ArcsMat< MB, NB, TB > &b, ArcsMat< MX, NX, TX > &x)
Ax = bの形の線形方程式をxについて解く関数(正方行列A・ベクトルx,b版) (内部用引数渡し版のみ)
Definition ArcsMatrix.hh:2686
static constexpr void fillcolumn(ArcsMat< M, N, T > &UY, const R a, const size_t n, const size_t m1, const size_t m2)
n列目のm1行目からm2行目までを数値aで埋める関数 (m1 <= m2 であること) (引数渡し版)
Definition ArcsMatrix.hh:1006
static constexpr void orderrow_and_vec(ArcsMat< M, N, T > &UY, ArcsMat< P, Q, R > &uy)
並び替え指定縦ベクトルuが昇順になるように,行列Uの行と指定縦ベクトルの両方を並び替える関数 (引数渡し版のみ)
Definition ArcsMatrix.hh:1206
static constexpr void linsolve_vec_nsqh(const ArcsMat< M, N, T > &A, const ArcsMat< MB, NB, TB > &b, ArcsMat< MX, NX, TX > &x)
Ax = bの形の線形方程式をxについて解く関数(非正方横長行列A・ベクトルx,b版) (内部用引数渡し版のみ) この関数はMATLABとは異なる解を出力する、ただしもちろん、Ax = b は成立
Definition ArcsMatrix.hh:2816
static constexpr ArcsMat< M, N, T > cross(const ArcsMat< M, N, T > &L, const ArcsMat< MR, NR, TR > &R)
クロス積 (戻り値返し版)
Definition ArcsMatrix.hh:3246
static constexpr void conj(const ArcsMat< M, N, T > &U, ArcsMat< P, Q, R > &Y)
複素数行列要素の複素共役を取得する関数(引数渡し版)
Definition ArcsMatrix.hh:2114
constexpr T operator()(const size_t m, const size_t n, const bool chk) const
行列括弧演算子(行列の(m,n)要素の値を返す。サイズチェック可能版)
Definition ArcsMatrix.hh:244
static constexpr ArcsMat< M, N, T > sethvector(const ArcsMat< P, Q, R > &u, const size_t m, const size_t n, const ArcsMat< M, N, T > &U)
指定位置に横ベクトルで上書きする関数 (戻り値渡し版)
Definition ArcsMatrix.hh:1328
static constexpr void log(const ArcsMat< M, N, T > &U, ArcsMat< P, Q, R > &Y)
行列要素の対数関数(底e版)を計算する関数(引数渡し版)
Definition ArcsMatrix.hh:1857
constexpr ArcsMat(const ArcsMat< P, Q, R > &right)
コピーコンストラクタ(サイズもしくは型が違う行列の場合の定義)
Definition ArcsMatrix.hh:158
constexpr void StoreArray(std::array< R, P > &Array) const
縦ベクトルを1次元std::array配列に書き込む関数
Definition ArcsMatrix.hh:731
static constexpr ArcsMat< M, N, T > ordercolumn(const ArcsMat< M, N, T > &U, const ArcsMat< P, Q, R > &u)
並び替え指定横ベクトルuが昇順になるように,行列Uの列を並び替える関数 (戻り値渡し版のみ)
Definition ArcsMatrix.hh:1036
constexpr ArcsMat< M, Q, T > operator*(const ArcsMat< P, Q, R > &right) const
行列乗算演算子(行列=行列*行列の場合)
Definition ArcsMatrix.hh:380
constexpr void FillAllZero(void)
すべての要素を指定したゼロで埋める関数
Definition ArcsMatrix.hh:712
constexpr friend ArcsMat< M, N, T > operator+(const T &left, const ArcsMat< M, N, T > &right)
行列加算演算子 (スカラー+行列の場合)
Definition ArcsMatrix.hh:528
static constexpr ArcsMat< M, N, T > log(const ArcsMat< M, N, T > &U)
行列要素の対数関数(底e版)を計算する関数(戻り値渡し版)
Definition ArcsMatrix.hh:1870
static constexpr void sqrt(const ArcsMat< M, N, T > &U, ArcsMat< P, Q, R > &Y)
行列要素の平方根を計算する関数(引数渡し版)
Definition ArcsMatrix.hh:2001
constexpr friend ArcsMat< M, N, T > operator-(const T &left, const ArcsMat< M, N, T > &right)
行列減算演算子 (スカラー-行列の場合)
Definition ArcsMatrix.hh:535
static constexpr T multdiag(const ArcsMat< M, N, T > &U)
行列の対角要素の総積を返す関数(戻り値渡し版のみ)
Definition ArcsMatrix.hh:1748
static constexpr void arg(const ArcsMat< M, N, T > &U, ArcsMat< P, Q, R > &Y)
複素数行列要素の偏角を計算する関数(引数渡し版)
Definition ArcsMatrix.hh:2069
constexpr ArcsMat(const R InitValue)
コンストラクタ(任意初期値版)
Definition ArcsMatrix.hh:106
static constexpr void diag(const ArcsMat< M, N, T > &u, ArcsMat< P, Q, R > &Y)
縦ベクトルの各要素を対角要素に持つ正方行列を生成する関数(引数渡し版)
Definition ArcsMatrix.hh:1672
constexpr void Disp(void) const
行列の要素を表示(表示形式自動版)
Definition ArcsMatrix.hh:602
static constexpr ArcsMat< N, NB, T > linsolve(const ArcsMat< M, N, T > &A, const ArcsMat< MB, NB, TB > &B)
AX = Bの形の線形方程式をXについて解く関数(戻り値返し版)
Definition ArcsMatrix.hh:2913
static constexpr std::complex< double > EPSLCOMP
零とみなす閾値(複素数版)
Definition ArcsMatrix.hh:3374
constexpr void Zeroing(const T eps=ArcsMat< M, N, T >::EPSILON)
ゼロに近い要素を完全にゼロにする関数
Definition ArcsMatrix.hh:865
static constexpr void sethvector(ArcsMat< M, N, T > &UY, const ArcsMat< P, Q, R > &u, const size_t m, const size_t n)
指定位置に横ベクトルで上書きする関数 (引数渡し版)
Definition ArcsMatrix.hh:1316
constexpr void DispAddress(void) const
行列要素の各メモリアドレスを表示する関数
Definition ArcsMatrix.hh:554
static constexpr void vecinv(const ArcsMat< M, N, T > &u, ArcsMat< MY, NY, TY > &Y)
vec作用素の逆(縦ベクトル→行列) (引数渡し版)
Definition ArcsMatrix.hh:3288
static constexpr ArcsMat< M, N, T > expm(const ArcsMat< M, N, T > &U, const size_t k=13)
行列指数関数 (戻り値返し版)
Definition ArcsMatrix.hh:3365
static constexpr T sum(const ArcsMat< M, N, T > &U)
行列要素の総和を返す関数(戻り値渡し版のみ)
Definition ArcsMatrix.hh:1823
static constexpr ArcsMat< 1, N, T > getrow(const ArcsMat< M, N, T > &U, const size_t m)
指定した行から横ベクトルとして抽出する関数 (戻り値渡し版)
Definition ArcsMatrix.hh:1101
constexpr ArcsMat< M, N, T > operator-(const ArcsMat< P, Q, R > &right) const
行列減算演算子(行列=行列-行列の場合)
Definition ArcsMatrix.hh:348
static constexpr T trace(const ArcsMat< M, N, T > &U)
行列のトレースを返す関数(戻り値渡し版のみ)
Definition ArcsMatrix.hh:1738
static constexpr ArcsMat< M, N, T > conj(const ArcsMat< M, N, T > &U)
複素数行列要素の複素共役を取得する関数(戻り値渡し版)
Definition ArcsMatrix.hh:2127
static constexpr void shiftdown(const ArcsMat< M, N, T > &U, ArcsMat< P, Q, R > &Y, const size_t m=1)
行列の各要素を下にm行分シフトする関数(上段の行はゼロになる)(引数渡し版)
Definition ArcsMatrix.hh:1465
static constexpr void expm(const ArcsMat< M, N, T > &U, ArcsMat< MY, NY, TY > &Y, const size_t k=13)
行列指数関数 (引数渡し版)
Definition ArcsMatrix.hh:3322
static constexpr std::tuple< ArcsMat< M, N, T >, ArcsMat< M, N, T > > LDL(const ArcsMat< M, N, T > &A)
修正コレスキー分解(LDL分解) (タプル返し版)
Definition ArcsMatrix.hh:2648
constexpr ArcsMat(const ArcsMat< M, N, T > &right)
コピーコンストラクタ
Definition ArcsMatrix.hh:147
static constexpr void sign(const ArcsMat< M, N, T > &U, ArcsMat< P, Q, R > &Y)
行列要素の符号関数を計算する関数(引数渡し版)
Definition ArcsMatrix.hh:2023
static constexpr void swapcolumn(ArcsMat< M, N, T > &UY, const size_t n1, const size_t n2)
指定した列と列を入れ替える関数 (引数渡し版)
Definition ArcsMatrix.hh:979
constexpr size_t GetNumOfNonZero(const T eps=ArcsMat< M, N, T >::EPSILON) const
非ゼロ要素の数を返す関数
Definition ArcsMatrix.hh:628
static constexpr void fillrow(ArcsMat< M, N, T > &UY, const R a, const size_t m, const size_t n1, const size_t n2)
m行目のn1列目からn2列目までを数値aで埋める関数 (n1 <= n2 であること) (引数渡し版)
Definition ArcsMatrix.hh:1160
static constexpr ArcsMat< M, N+Q, T > concath(const ArcsMat< M, N, T > &U1, const ArcsMat< P, Q, R > &U2)
行列を横に連結する関数(戻り値渡し版)
Definition ArcsMatrix.hh:1611
static constexpr ArcsMat< N, M, T > tp(const ArcsMat< M, N, T > &U)
転置行列を返す関数 (戻り値渡し版)
Definition ArcsMatrix.hh:2150
constexpr void LoadArray(const std::array< std::array< R, P >, Q > &Array)
2次元std::array配列を行列として読み込む関数
Definition ArcsMatrix.hh:742
static constexpr ArcsMat< M, M, T > diag(const ArcsMat< M, N, T > &u)
縦ベクトルの各要素を対角要素に持つ正方行列を生成する関数(戻り値渡し版)
Definition ArcsMatrix.hh:1683
static constexpr ArcsMat< M, N, T > setrow(const ArcsMat< P, Q, R > &u, const size_t m, const ArcsMat< M, N, T > &U)
指定した行を横ベクトルで上書きする関数 (戻り値渡し版)
Definition ArcsMatrix.hh:1123
static constexpr ArcsMat< M, N, T > setcolumn(const ArcsMat< P, Q, R > &u, const size_t n, const ArcsMat< M, N, T > &U)
指定した列を縦ベクトルで上書きする関数 (戻り値渡し版)
Definition ArcsMatrix.hh:969
constexpr ArcsMat< N, M, T > operator~(void) const
転置演算子
Definition ArcsMatrix.hh:2178
static constexpr std::tuple< ArcsMat< M, N, T >, ArcsMat< M, N, T > > Hessenberg(const ArcsMat< M, N, T > &A)
Hessenberg分解(タプル返し版) 複素数の場合、この関数はMATLABとは異なる解を出力する。
Definition ArcsMatrix.hh:3015
static constexpr ArcsMat< 1, Q, T > gethvector(const ArcsMat< M, N, T > &U, const size_t m, const size_t n)
指定位置から横ベクトルを抽出する関数 (戻り値渡し版)
Definition ArcsMatrix.hh:1305
static constexpr ArcsMat< M, N, T > zeros(void)
m行n列の零行列を返す関数
Definition ArcsMatrix.hh:895
constexpr void GetHorizontalVec(ArcsMat< P, Q, R > &w, const size_t m, const size_t n) const
指定した先頭位置から横ベクトルを抜き出して返す関数 (引数渡し版)
Definition ArcsMatrix.hh:811
constexpr ArcsMat(void)
コンストラクタ
Definition ArcsMatrix.hh:92
static constexpr std::tuple< size_t, size_t > maxidx(const ArcsMat< M, N, T > &U)
行列要素の最大値の要素番号を返す関数(タプル返し版のみ)
Definition ArcsMatrix.hh:1757
static constexpr T det(const ArcsMat< M, N, T > &A)
行列式の値を返す関数(戻り値返し版のみ)
Definition ArcsMatrix.hh:2395
static constexpr ArcsMat< M *N, 1, T > vec(const ArcsMat< M, N, T > &U)
vec作用素(行列→縦ベクトル) (戻り値返し版)
Definition ArcsMatrix.hh:3277
static constexpr void cross_vec(const ArcsMat< M, N, T > &l, const ArcsMat< MR, NR, TR > &r, ArcsMat< MY, NY, TY > &y)
クロス積 ベクトル版 (内部用引数渡し版のみ)
Definition ArcsMatrix.hh:3183
constexpr ArcsMat< M, N, T > & operator+=(const R &right)
行列加算代入演算子(行列=行列+行列、行列=行列+スカラーの場合)
Definition ArcsMatrix.hh:437
static constexpr void tan(const ArcsMat< M, N, T > &U, ArcsMat< P, Q, R > &Y)
行列要素の正接関数を計算する関数(引数渡し版)
Definition ArcsMatrix.hh:1953
constexpr ArcsMat< M, N, T > operator/(const R &right) const
行列除算演算子(行列=行列/スカラーの場合)
Definition ArcsMatrix.hh:422
static constexpr ArcsMat< M, N, T > swapcolumn(const size_t n1, const size_t n2, const ArcsMat< M, N, T > &U)
指定した列と列を入れ替える関数 (戻り値渡し版)
Definition ArcsMatrix.hh:992
constexpr ArcsMat< M, N, T > operator%(const ArcsMat< P, Q, R > &right) const
行列アダマール除算演算子 (行列の要素ごとの除算)
Definition ArcsMatrix.hh:513
constexpr T operator()(const size_t m, const size_t n) const
行列括弧演算子(行列の(m,n)要素の値を返す。サイズチェック無し版)
Definition ArcsMatrix.hh:227
constexpr T operator[](const size_t m) const
縦ベクトル添字演算子(縦ベクトルのm番目の要素の値を返す。x = A(m,1)と同じ意味) 備考:ArcsMatは縦ベクトル優先なので、横ベクトル添字演算子は無い。
Definition ArcsMatrix.hh:209
static constexpr void setsubmatrix(ArcsMat< M, N, T > &UY, const ArcsMat< P, Q, R > &U, const size_t m, const size_t n)
小行列を行列の指定位置に上書きする関数 (引数渡し版)
Definition ArcsMatrix.hh:1370
static constexpr void gethvector(const ArcsMat< M, N, T > &U, ArcsMat< P, Q, R > &y, const size_t m, const size_t n)
指定位置から横ベクトルを抽出する関数 (引数渡し版)
Definition ArcsMatrix.hh:1294
static constexpr ArcsMat< M, N, T > swaprow(const size_t m1, const size_t m2, const ArcsMat< M, N, T > &U)
指定した行と行を入れ替える関数 (戻り値渡し版)
Definition ArcsMatrix.hh:1146
static constexpr void swaprow(ArcsMat< M, N, T > &UY, const size_t m1, const size_t m2)
指定した行と行を入れ替える関数 (引数渡し版)
Definition ArcsMatrix.hh:1133
static constexpr ArcsMat< M *MR, N *NR, T > Kron(const ArcsMat< M, N, T > &L, const ArcsMat< MR, NR, TR > &R)
クロネッカー積(戻り値返し版)
Definition ArcsMatrix.hh:3171
constexpr void SetVerticalVec(const ArcsMat< P, Q, R > &v, const size_t m, const size_t n)
指定した先頭位置に縦ベクトルを埋め込む関数
Definition ArcsMatrix.hh:838
static constexpr void Schur(const ArcsMat< M, N, T > &A, ArcsMat< MU, NU, TU > &U, ArcsMat< MS, NS, TS > &S)
複素Schur分解(引数渡し版) この関数はMATLABとは異なる解を出力する、ただしもちろん、A = USU' は成立
Definition ArcsMatrix.hh:3028
constexpr ArcsMat< M, N, T > operator+(void) const
単項プラス演算子
Definition ArcsMatrix.hh:291
static constexpr ArcsMat< MY, NY, T > vecinv(const ArcsMat< M, N, T > &u)
vec作用素の逆(縦ベクトル→行列) (戻り値返し版)
Definition ArcsMatrix.hh:3310
constexpr ArcsMat< M, N, T > & operator-=(const R &right)
行列減算代入演算子(行列=行列-行列、行列=行列-スカラーの場合)
Definition ArcsMatrix.hh:447
static constexpr void shiftup(const ArcsMat< M, N, T > &U, ArcsMat< P, Q, R > &Y, const size_t m=1)
行列の各要素を上にm行分シフトする関数(下段の行はゼロになる)(引数渡し版)
Definition ArcsMatrix.hh:1431
constexpr ArcsMat(ArcsMat< M, N, T > &&right)
ムーブコンストラクタ(サイズと型が違う行列の場合, エラー検出用の定義)
Definition ArcsMatrix.hh:196
static constexpr ArcsMat< M, N, T > orderrow(const ArcsMat< M, N, T > &U, const ArcsMat< P, Q, R > &u)
並び替え指定縦ベクトルuが昇順になるように,行列Uの行を並び替える関数 (戻り値渡し版のみ)
Definition ArcsMatrix.hh:1190
static constexpr void Cholesky(const ArcsMat< M, N, T > &A, ArcsMat< ML, NL, TL > &R)
修正コレスキー分解(引数渡し版)
Definition ArcsMatrix.hh:2659
static constexpr ArcsMat< M, M, T > Householder(const ArcsMat< M, N, T > &v, const size_t k=1)
Householder行列を生成する関数(戻り値返し版)
Definition ArcsMatrix.hh:2440
static constexpr void concatv(const ArcsMat< M, N, T > &U1, const ArcsMat< P, Q, R > &U2, ArcsMat< D, E, F > &Y)
行列を縦に連結する関数(引数渡し版)
Definition ArcsMatrix.hh:1567
static constexpr void LDL(const ArcsMat< M, N, T > &A, ArcsMat< ML, NL, TL > &L, ArcsMat< MD, ND, TD > &D)
修正コレスキー分解(LDL分解) (引数渡し版)
Definition ArcsMatrix.hh:2615
static constexpr ArcsMat< M, N, T > setvvector(const ArcsMat< P, Q, R > &u, const size_t m, const size_t n, const ArcsMat< M, N, T > &U)
指定位置に縦ベクトルで上書きする関数 (戻り値渡し版)
Definition ArcsMatrix.hh:1281
constexpr ArcsMat< M, N, T > operator^(const int &right) const
行列べき乗演算子(正方行列のべき乗)
Definition ArcsMatrix.hh:475
static constexpr void tp(const ArcsMat< M, N, T > &U, ArcsMat< P, Q, R > &Y)
転置行列を返す関数 (引数渡し版)
Definition ArcsMatrix.hh:2138
static constexpr std::tuple< ArcsMat< M, M, T >, ArcsMat< M, N, T >, ArcsMat< N, N, T > > SVD(const ArcsMat< M, N, T > &A)
SVD特異値分解(タプル返し版)
Definition ArcsMatrix.hh:2590
static constexpr void linsolve_mat(const ArcsMat< M, N, T > &A, const ArcsMat< MB, NB, TB > &B, ArcsMat< MX, NX, TX > &X)
AX = Bの形の線形方程式をxについて解く関数(正方行列A・行列X,B版) (内部用引数渡し版のみ)
Definition ArcsMatrix.hh:2731
constexpr ArcsMat< M, N, T > & operator*=(const R &right)
行列乗算代入演算子(行列=行列*行列、行列=行列*スカラーの場合)
Definition ArcsMatrix.hh:457
static constexpr void eig(const ArcsMat< M, N, T > &A, ArcsMat< MV, NV, TV > &v)
固有値を返す関数(引数渡し版)
Definition ArcsMatrix.hh:3077
static constexpr T min(const ArcsMat< M, N, T > &U)
行列要素の最小値を返す関数(戻り値渡し版のみ)
Definition ArcsMatrix.hh:1815
static constexpr std::tuple< size_t, size_t > minidx(const ArcsMat< M, N, T > &U)
行列要素の最小値の要素番号を返す関数(タプル返し版のみ)
Definition ArcsMatrix.hh:1790
static constexpr void inv(const ArcsMat< M, N, T > &A, ArcsMat< P, Q, R > &Y)
逆行列を返す関数(引数渡し版)
Definition ArcsMatrix.hh:2924
constexpr ArcsMat< M, N, T > & operator=(const ArcsMat< P, Q, R > &right)
行列代入演算子(サイズと型が違う行列の場合, エラー検出用の定義)
Definition ArcsMatrix.hh:281
constexpr ArcsMat< M, N, T > & operator/=(const R &right)
行列除算代入演算子(行列=行列/スカラーの場合)
Definition ArcsMatrix.hh:467
constexpr void FillAll(const R &u)
すべての要素を指定した値で埋める関数
Definition ArcsMatrix.hh:688
static constexpr ArcsMat< M, N, T > gettrilo(const ArcsMat< M, N, T > &U, const size_t m=1)
m行目を上端として左下の下三角部分のみを返す関数(上三角部分はゼロ)(戻り値渡し版)
Definition ArcsMatrix.hh:2282
constexpr void operator/(const ArcsMat< P, Q, R > &right) const
行列除算演算子(行列=行列/行列の場合)
Definition ArcsMatrix.hh:413
static constexpr ArcsMat< N, M, T > Htp(const ArcsMat< M, N, T > &U)
エルミート転置行列を返す関数 (戻り値渡し版)
Definition ArcsMatrix.hh:2170
static constexpr size_t rank(const ArcsMat< M, N, T > &A, const T eps=ArcsMat< M, N, T >::EPSILON)
行列の階数を返す関数(戻り値返し版のみ)
Definition ArcsMatrix.hh:2602
static constexpr void Hessenberg(const ArcsMat< M, N, T > &A, ArcsMat< MP, NP, TP > &P, ArcsMat< MH, NH, TH > &H)
Hessenberg分解(引数渡し版) 複素数の場合、この関数はMATLABとは異なる解を出力する。
Definition ArcsMatrix.hh:2979
constexpr ArcsMat< M, N, T > operator-(void) const
単項マイナス演算子
Definition ArcsMatrix.hh:302
constexpr ArcsMat< M, N, T > operator&(const ArcsMat< P, Q, R > &right) const
行列アダマール積演算子(行列の要素ごとの乗算)
Definition ArcsMatrix.hh:496
static constexpr ArcsMat< P, 1, T > getvvector(const ArcsMat< M, N, T > &U, const size_t m, const size_t n)
指定位置から縦ベクトルを抽出する関数 (戻り値渡し版)
Definition ArcsMatrix.hh:1258
static constexpr void abs(const ArcsMat< M, N, T > &U, ArcsMat< P, Q, R > &Y)
行列要素の絶対値を計算する関数(引数渡し版)
Definition ArcsMatrix.hh:2045
constexpr const std::array< std::array< T, M >, N > & ReadOnlyRef(void) const
std:arrayの2次元配列データの読み込み専用の参照を返す関数
Definition ArcsMatrix.hh:774
static constexpr void linsolve_mat_nsqv(const ArcsMat< M, N, T > &A, const ArcsMat< MB, NB, TB > &B, ArcsMat< MX, NX, TX > &X)
AX = Bの形の線形方程式をxについて解く関数(非正方縦長行列A・行列X,B版) (内部用引数渡し版のみ)
Definition ArcsMatrix.hh:2792
static constexpr void getcolumn(const ArcsMat< M, N, T > &U, ArcsMat< P, Q, R > &y, const size_t n)
指定した列から縦ベクトルとして抽出する関数 (引数渡し版)
Definition ArcsMatrix.hh:938
static constexpr void shiftleft(const ArcsMat< M, N, T > &U, ArcsMat< P, Q, R > &Y, const size_t n=1)
行列の各要素を左にn列分シフトする関数(右段の列はゼロになる)(引数渡し版)
Definition ArcsMatrix.hh:1499
static constexpr void cross_mat(const ArcsMat< M, N, T > &L, const ArcsMat< MR, NR, TR > &R, ArcsMat< MY, NY, TY > &Y)
クロス積 行列版 (内部用引数渡し版のみ)
Definition ArcsMatrix.hh:3205
static constexpr ArcsMat< M, 1, TV > eig(const ArcsMat< M, N, T > &A)
固有値を返す関数(戻り値返し版)
Definition ArcsMatrix.hh:3094
constexpr void Get(T1 &u1, T2 &... u2)
行列要素から値を読み込む関数
Definition ArcsMatrix.hh:666
static constexpr void gettrilo(const ArcsMat< M, N, T > &U, ArcsMat< P, Q, R > &Y, const size_t m=1)
m行目を上端として左下の下三角部分のみを返す関数(上三角部分はゼロ)(引数渡し版)
Definition ArcsMatrix.hh:2266
constexpr ArcsMat< M, N, T > operator-(const R &right) const
行列減算演算子(行列=行列-スカラーの場合)
Definition ArcsMatrix.hh:365
static constexpr ArcsMat< M, N, T > Cholesky(const ArcsMat< M, N, T > &A)
修正コレスキー分解(戻り値返し版)
Definition ArcsMatrix.hh:2674
static constexpr void Householder(const ArcsMat< M, N, T > &v, ArcsMat< MH, NH, TH > &H, const size_t k=1)
Householder行列を生成する関数(引数渡し版)
Definition ArcsMatrix.hh:2416
static constexpr void Htp(const ArcsMat< M, N, T > &U, ArcsMat< P, Q, R > &Y)
エルミート転置行列を返す関数 (引数渡し版)
Definition ArcsMatrix.hh:2161
static constexpr ArcsMat< M, N, T > tan(const ArcsMat< M, N, T > &U)
行列要素の正接関数を計算する関数(戻り値渡し版)
Definition ArcsMatrix.hh:1966
static constexpr ArcsMat< M, N, T > shiftleft(const ArcsMat< M, N, T > &U, const size_t n=1)
行列の各要素を左にn列分シフトする関数(右段の列はゼロになる)(戻り値渡し版)
Definition ArcsMatrix.hh:1521
static constexpr void Kron(const ArcsMat< M, N, T > &L, const ArcsMat< MR, NR, TR > &R, ArcsMat< MY, NY, TY > &Y)
クロネッカー積(引数渡し版)
Definition ArcsMatrix.hh:3147
static constexpr void concath(const ArcsMat< M, N, T > &U1, const ArcsMat< P, Q, R > &U2, ArcsMat< D, E, F > &Y)
行列を横に連結する関数(引数渡し版)
Definition ArcsMatrix.hh:1595
constexpr ArcsMat< M, N, T > operator+(const R &right) const
行列加算演算子(行列=行列+スカラーの場合)
Definition ArcsMatrix.hh:333
static constexpr void gettriup(const ArcsMat< M, N, T > &U, ArcsMat< P, Q, R > &Y, const size_t n=1)
n列目を左端として右上の上三角部分のみを返す関数(下三角部分はゼロ)(引数渡し版)
Definition ArcsMatrix.hh:2238
static constexpr void setrow(ArcsMat< M, N, T > &UY, const ArcsMat< P, Q, R > &u, const size_t m)
指定した行を横ベクトルで上書きする関数 (引数渡し版)
Definition ArcsMatrix.hh:1111
static constexpr ArcsMat< M, N, T > gettriup(const ArcsMat< M, N, T > &U, const size_t n=1)
n列目を左端として右上の上三角部分のみを返す関数(下三角部分はゼロ)(戻り値渡し版)
Definition ArcsMatrix.hh:2254
static constexpr ArcsMat< M, N, T > sign(const ArcsMat< M, N, T > &U)
行列要素の符号関数を計算する関数(戻り値渡し版)
Definition ArcsMatrix.hh:2034
static constexpr ArcsMat< M, N, T > sqrt(const ArcsMat< M, N, T > &U)
行列要素の平方根を計算する関数(戻り値渡し版)
Definition ArcsMatrix.hh:2012
constexpr ArcsMat< M, N, T > & operator=(const ArcsMat< M, N, T > &right)
行列代入演算子(サイズと型が同じ同士の行列の場合)
Definition ArcsMatrix.hh:268
static constexpr std::tuple< ArcsMat< M, N, T >, ArcsMat< M, N, T > > Schur(const ArcsMat< M, N, T > &A)
複素Schur分解(タプル返し版) この関数はMATLABとは異なる解を出力する、ただしもちろん、A = USU' は成立
Definition ArcsMatrix.hh:3066
static constexpr void QR(const ArcsMat< M, N, T > &A, ArcsMat< MQ, NQ, TQ > &Q, ArcsMat< MR, NR, TR > &R)
QR分解(引数渡し版) 注意:複素数で縦長行列の場合ではMATLABとは異なる解を出力する
Definition ArcsMatrix.hh:2453
static constexpr void getdiag(const ArcsMat< M, N, T > &U, ArcsMat< P, Q, R > &y, const ssize_t k=0)
行列の対角要素を縦ベクトルとして取得する関数(引数渡し版)
Definition ArcsMatrix.hh:1695
static constexpr void imag(const ArcsMat< M, N, T > &U, ArcsMat< P, Q, R > &Y)
複素数行列要素の虚数部を取得する関数(引数渡し版)
Definition ArcsMatrix.hh:2099
static constexpr ArcsMat< P, Q, T > getsubmatrix(const ArcsMat< M, N, T > &U, const size_t m, const size_t n)
行列から指定位置の小行列を抽出する関数 (戻り値渡し版)
Definition ArcsMatrix.hh:1357
static constexpr void linsolve_vec_nsqv(const ArcsMat< M, N, T > &A, const ArcsMat< MB, NB, TB > &b, ArcsMat< MX, NX, TX > &x)
Ax = bの形の線形方程式をxについて解く関数(非正方縦長行列A・ベクトルx,b版) (内部用引数渡し版のみ)
Definition ArcsMatrix.hh:2754
static constexpr R norm(const ArcsMat< M, N, T > &U)
行列のノルムを返す関数(戻り値渡し版のみ)
Definition ArcsMatrix.hh:2195
static constexpr ArcsMat< M, N, T > eye(void)
n行n列の単位行列を返す関数
Definition ArcsMatrix.hh:910
static constexpr void SVD(const ArcsMat< M, N, T > &A, ArcsMat< MU, NU, TU > &U, ArcsMat< MS, NS, TS > &S, ArcsMat< MV, NV, TV > &V)
SVD特異値分解(引数渡し版) 注意:複素数で非正方行列の場合ではMATLABとは異なる解を出力する
Definition ArcsMatrix.hh:2526
constexpr ArcsMat< P, 1, T > GetVerticalVec(const size_t m, const size_t n) const
指定した先頭位置から縦ベクトルを抜き出して返す関数 (戻り値渡し版)
Definition ArcsMatrix.hh:799
constexpr ArcsMat< M, N, T > operator*(const R &right) const
行列乗算演算子(行列=行列*スカラーの場合)
Definition ArcsMatrix.hh:398
static constexpr ArcsMat< M, N, T > shiftup(const ArcsMat< M, N, T > &U, const size_t m=1)
行列の各要素を上にm行分シフトする関数(下段の行はゼロになる)(戻り値渡し版)
Definition ArcsMatrix.hh:1453
static constexpr ArcsMat< L, 1, T > getdiag(const ArcsMat< M, N, T > &U, const ssize_t k=0)
行列の対角要素を縦ベクトルとして取得する関数(戻り値渡し版)
Definition ArcsMatrix.hh:1729
static constexpr void getrow(const ArcsMat< M, N, T > &U, ArcsMat< P, Q, R > &y, const size_t m)
指定した行から横ベクトルとして抽出する関数 (引数渡し版)
Definition ArcsMatrix.hh:1092
constexpr ArcsMatrix::MatStatus GetStatus(void) const
行列の状態をそのまま返す関数
Definition ArcsMatrix.hh:762
static constexpr void vec(const ArcsMat< M, N, T > &U, ArcsMat< MY, NY, TY > &y)
vec作用素(行列→縦ベクトル) (引数渡し版)
Definition ArcsMatrix.hh:3257
static constexpr ArcsMat< M, N, T > cos(const ArcsMat< M, N, T > &U)
行列要素の余弦を計算する関数(戻り値渡し版)
Definition ArcsMatrix.hh:1942
static constexpr void cross(const ArcsMat< M, N, T > &L, const ArcsMat< MR, NR, TR > &R, ArcsMat< MY, NY, TY > &Y)
クロス積 (引数渡し版)
Definition ArcsMatrix.hh:3229
static constexpr ArcsMat< M, N, T > log10(const ArcsMat< M, N, T > &U)
行列要素の対数関数(底10版)を計算する関数(戻り値渡し版)
Definition ArcsMatrix.hh:1894
static constexpr void copymatrix(const ArcsMat< M, N, T > &U, const size_t m1, const size_t m2, const size_t n1, const size_t n2, ArcsMat< P, Q, R > &Y, const size_t my, const size_t ny)
行列Uから別の行列Yへ位置とサイズを指定してコピーする関数(引数渡し版のみ) 等価なMATLABコード: Y(my:my+(m2-m1), ny:ny+(n2-n1)) = U(m1:m2,...
Definition ArcsMatrix.hh:1405
static constexpr std::tuple< ArcsMat< M, N, T >, ArcsMat< M, N, T > > LU(const ArcsMat< M, N, T > &A)
LU分解の結果のみ返す関数(タプル返し版)
Definition ArcsMatrix.hh:2386
constexpr std::array< std::array< T, M >, N > GetData(void) const
std:arrayの2次元配列データをそのまま返す関数
Definition ArcsMatrix.hh:768
constexpr size_t GetWidth(void) const
行列の幅(列数)を返す関数
Definition ArcsMatrix.hh:621
constexpr size_t GetHeight(void) const
行列の高さ(行数)を返す関数
Definition ArcsMatrix.hh:615
static constexpr void eigvec(const ArcsMat< M, N, T > &A, ArcsMat< MV, NV, TV > &V, ArcsMat< MD, ND, TD > &D)
固有値を持つ対角行列Dと、各々の固有値に対応する固有ベクトルを持つ行列Vを返す関数(引数渡し版)
Definition ArcsMatrix.hh:3106
static constexpr ArcsMat< M, N, T > ramp(void)
単調増加の縦ベクトルを返す関数
Definition ArcsMatrix.hh:925
static constexpr ArcsMat< M, N, R > abs(const ArcsMat< M, N, T > &U)
行列要素の絶対値を計算する関数(戻り値渡し版)
Definition ArcsMatrix.hh:2058
static constexpr ArcsMat< M, N, T > inv(const ArcsMat< M, N, T > &A)
逆行列を返す関数(戻り値返し版)
Definition ArcsMatrix.hh:2937
static constexpr ArcsMat< M, 1, T > getcolumn(const ArcsMat< M, N, T > &U, const size_t n)
指定した列から縦ベクトルとして抽出する関数 (戻り値渡し版)
Definition ArcsMatrix.hh:947
static constexpr void shiftright(const ArcsMat< M, N, T > &U, ArcsMat< P, Q, R > &Y, const size_t n=1)
行列の各要素を右にn列分シフトする関数(左段の列はゼロになる)(引数渡し版)
Definition ArcsMatrix.hh:1533
static constexpr ArcsMat< M, N, T > sin(const ArcsMat< M, N, T > &U)
行列要素の正弦関数を計算する関数(戻り値渡し版)
Definition ArcsMatrix.hh:1918
constexpr T & operator()(const size_t m, const size_t n)
行列括弧演算子(行列の(m,n)要素に値を設定する。サイズチェック無し版)
Definition ArcsMatrix.hh:235
constexpr void ZeroingTriLo(const T eps=ArcsMat< M, N, T >::EPSILON)
下三角(主対角除く)に限定して、ゼロに近い要素を完全にゼロにする関数
Definition ArcsMatrix.hh:876
constexpr ArcsMat< M, N, T > operator+(const ArcsMat< P, Q, R > &right) const
行列加算演算子(行列=行列+行列の場合)
Definition ArcsMatrix.hh:316
static constexpr void ordercolumn_and_vec(ArcsMat< M, N, T > &UY, ArcsMat< P, Q, R > &uy)
並び替え指定横ベクトルuが昇順になるように,行列Uの列と指定横ベクトルの両方を並び替える関数 (引数渡し版のみ)
Definition ArcsMatrix.hh:1052
static constexpr ArcsMat< M, N, T > shiftright(const ArcsMat< M, N, T > &U, const size_t n=1)
行列の各要素を右にn列分シフトする関数(左段の列はゼロになる)(戻り値渡し版)
Definition ArcsMatrix.hh:1555
constexpr void StoreArray(std::array< std::array< R, P >, Q > &Array) const
行列を2次元std::array配列に書き込む関数
Definition ArcsMatrix.hh:753
static constexpr void setcolumn(ArcsMat< M, N, T > &UY, const ArcsMat< P, Q, R > &u, const size_t n)
指定した列を縦ベクトルで上書きする関数 (引数渡し版)
Definition ArcsMatrix.hh:957
static constexpr void tanh(const ArcsMat< M, N, T > &U, ArcsMat< P, Q, R > &Y)
行列要素の双曲線正接関数を計算する関数(引数渡し版)
Definition ArcsMatrix.hh:1977
static constexpr ArcsMat< M, N, T > tanh(const ArcsMat< M, N, T > &U)
行列要素の双曲線正接関数を計算する関数(戻り値渡し版)
Definition ArcsMatrix.hh:1990
constexpr ArcsMat(ArcsMat< M, N, T > &&right)
ムーブコンストラクタ
Definition ArcsMatrix.hh:186
static constexpr ArcsMat< N, M, T > pinv(const ArcsMat< M, N, T > &A)
Moore-Penroseの疑似逆行列を返す関数(戻り値返し版)
Definition ArcsMatrix.hh:2966
static constexpr void linsolve(const ArcsMat< M, N, T > &A, const ArcsMat< MB, NB, TB > &B, ArcsMat< MX, NX, TX > &X)
AX = Bの形の線形方程式をXについて解く関数(引数渡し版)
Definition ArcsMatrix.hh:2879
constexpr void Disp(const std::string &format) const
行列の要素を表示
Definition ArcsMatrix.hh:571
static constexpr void log10(const ArcsMat< M, N, T > &U, ArcsMat< P, Q, R > &Y)
行列要素の対数関数(底10版)を計算する関数(引数渡し版)
Definition ArcsMatrix.hh:1881
static constexpr void getsubmatrix(const ArcsMat< M, N, T > &U, ArcsMat< P, Q, R > &Y, const size_t m, const size_t n)
行列から指定位置の小行列を抽出する関数 (引数渡し版)
Definition ArcsMatrix.hh:1341
static constexpr void sumcolumn(const ArcsMat< M, N, T > &U, ArcsMat< P, Q, R > &y)
各列の総和を計算して横ベクトルを出力する関数 (引数渡し版)
Definition ArcsMatrix.hh:1067
static constexpr void cos(const ArcsMat< M, N, T > &U, ArcsMat< P, Q, R > &Y)
行列要素の余弦関数を計算する関数(引数渡し版)
Definition ArcsMatrix.hh:1929