namespace std::linalg {
template<class Real>
setup_givens_rotation_result<Real> setup_givens_rotation(Real a, Real b) noexcept; // (1)
template<class Real>
setup_givens_rotation_result<complex<Real>> setup_givens_rotation(complex<Real> a, complex<Real> b) noexcept; // (2)
}
概要
ギブンス回転を計算する。すなわち、以下の式が成り立つような、Real
型の値c
と s
, r
を計算する。
$$ \begin{split} \begin{pmatrix} c & s \\ -\overline{s} & c \end{pmatrix} \begin{pmatrix} a \\ b \end{pmatrix} &= \begin{pmatrix} r \\ 0 \end{pmatrix},\\ c^2 + |s|^2 &= 1 \end{split} $$
ただし、s
とr
の型はa
とb
の型による。
- (1)
a
とb
の型がReal
の場合、s
とr
の型もReal
。r
は$(a, b)^T$のユークリッドノルム、つまり$\sqrt{|a|^2 + |b|^2}$である。 - (2)
a
とb
の型がcomplex<Real>
の場合、s
とr
の型もcomplex<Real>
。以下で定義される$sgn$関数を用いると、r
は$sgn(a) * \sqrt{|a|^2 + |b|^2}$である。 $$ sgn(x):= \begin{cases} \frac{x}{|x|} & \text{($x \neq 0$)} \\ 1 & \text{($x = 0$)} \end{cases} $$
テンプレートパラメータ制約
Real
はcomplex<Real>
が規定できる型であること。
戻り値
c
とs
が入力$(a, b)^T$に対するギブンス回転行列の成分で、r
を入力$(a, b)^T$のユークリッドノルムとすると、戻り値は{c, s, r}
である。
例
出力
バージョン
言語
- C++26
処理系
- Clang: ??
- GCC: ??
- ICC: ??
- Visual C++: ??