- [mathjax enable]
- linalg[meta header]
- function template[meta id-type]
- std::linalg[meta namespace]
- cpp26[meta cpp]
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)
}
- setup_givens_rotation_result[link setup_givens_rotation_result.md]
- complex[link /reference/complex/complex.md]
ギブンス回転を計算する。すなわち、以下の式が成り立つような、Real
型の値c
と s
, r
を計算する。
ただし、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}
である。
[注意] 処理系にあるコンパイラで確認していないため、間違っているかもしれません。
#include <cmath>
#include <complex>
#include <iostream>
#include <linalg>
template <class T>
void print(const std::linalg::setup_givens_rotation_result<T>& result) {
std::cout << "c: " << result.c << '\n'
<< "s: " << result.s << '\n'
<< "r: " << result.r << '\n';
}
int main()
{
// (1)
std::cout << "(1)\n";
auto result1 = std::linalg::setup_givens_rotation(1.0, std::sqrt(3.0));
print(result1);
// (2)
std::cout << "(2)\n";
auto result2 = std::linalg::setup_givens_rotation(std::complex<double>(1.0, 0), std::complex<double>(0, std::sqrt(3.0)));
print(result2);
return 0;
}
- std::linalg::setup_givens_rotation[link /reference/linalg/setup_givens_rotation.md]
- std::linalg::setup_givens_rotation_result[link /reference/linalg/setup_givens_rotation_result.md]
(1)
c: 0.5
s: -0.866025
r: 2.0
(2)
c: 0.5
s: (0,-0.866025)
r: (2,0)
- C++26
- Clang: ??
- GCC: ??
- ICC: ??
- Visual C++: ??