Skip to content

Commit

Permalink
linalg: refine BLAS1 functions (#1233)
Browse files Browse the repository at this point in the history
- Markdownリストレイアウト崩れ修正
- 一部に内部リンク付与
- 例示コードのハイライト指定
  • Loading branch information
yohhoy committed Jul 11, 2024
1 parent 0ee79ff commit d73c2fc
Show file tree
Hide file tree
Showing 14 changed files with 93 additions and 78 deletions.
5 changes: 3 additions & 2 deletions reference/linalg/apply_givens_rotation.md
Original file line number Diff line number Diff line change
Expand Up @@ -50,6 +50,7 @@ namespace std::linalg {
complex<Real> s); // (4)
}
```
* complex[link /reference/complex/complex.md]
## 概要
Expand All @@ -73,8 +74,8 @@ $$
## 適格要件
- 共通:
+ `Real`が`complex<Real>`を規定できる型であること
+ [`compatible-static-extents`](/reference/linalg/compatible-static-extents.md)`<InOutVec1, InOutVec2>(0,0) == true`
+ `Real`が[`complex`](/reference/complex/complex.md)`<Real>`を規定できる型であること
+ [`compatible-static-extents`](/reference/linalg/compatible-static-extents.md)`<InOutVec1, InOutVec2>(0,0) == true`
- (2), (4): [`is_execution_policy`](/reference/execution/is_execution_policy.md)`<ExecutionPolicy>::value`が`true`
Expand Down
4 changes: 3 additions & 1 deletion reference/linalg/copy.md
Original file line number Diff line number Diff line change
Expand Up @@ -30,15 +30,17 @@ namespace std::linalg {
## テンプレートパラメータ制約
`x`と`y`の次元が等しくなければならない。
- `x.rank() == y.rank()`
## 適格要件
- (1), (2): 0以上`x.rank()`未満の整数rに対して、[`compatible-static-extents`](/reference/linalg/compatible-static-extents.md)`<InVec, OutVec>(r,r)`が`true`
- (1), (2): 0以上[`x.rank()`](/reference/mdspan/mdspan/rank.md)未満の整数`r`に対して、[`compatible-static-extents`](/reference/linalg/compatible-static-extents.md)`<InVec, OutVec>(r,r)`が`true`
- (2): [`is_execution_policy`](/reference/execution/is_execution_policy.md)`<ExecutionPolicy>::value`が`true`
## 事前条件
`x`と`y`の各次元の要素数が等しくなければならない。
- `x.extents() == y.extents()`
Expand Down
8 changes: 4 additions & 4 deletions reference/linalg/dot.md
Original file line number Diff line number Diff line change
Expand Up @@ -45,7 +45,7 @@ namespace std::linalg {
## 適格要件
- 共通:
+ [`compatible-static-extents`](compatible-static-extents.md)`<InVec1, InVec2>(0, 0)`が`true` (2つのベクトルの静的な要素数が同じ)
+ [`compatible-static-extents`](compatible-static-extents.md)`<InVec1, InVec2>(0, 0)`が`true` (2つのベクトルの静的な要素数が同じ)
- (2), (4): [`is_execution_policy`](/reference/execution/is_execution_policy.md)`<ExecutionPolicy>::value`が`true`
Expand All @@ -58,8 +58,8 @@ namespace std::linalg {
## 効果
- (1), (2): なし
- (3), (4): `T`を各ベクトルの値型の積の型`decltype(declval<typename InVec1::value_type>() * declval<typename InVec2::value_type>())`とする。
+ (3): `dot(v1, v2, T{})`を返す。
+ (4): `dot(std::forward<ExecutionPolicy>(exec), v1, v2, T{})`を返す。
+ (3): `dot(v1, v2, T{})`を返す。
+ (4): `dot(std::forward<ExecutionPolicy>(exec), v1, v2, T{})`を返す。
## 戻り値
Expand All @@ -77,7 +77,7 @@ $$
## 備考
- (1), (2): もし`InVec1::value_type`、`InVec2::value_type`、`Scalar`が全て浮動小数点数型または`std::complex`の特殊化で、`Scalar`が`InVec1::value_type`と`InVec2::value_type`より精度が高い場合、和の各項は`Scalar`またはより高い精度の型が使われる。
- (1), (2): もし`InVec1::value_type`、`InVec2::value_type`、`Scalar`が全て浮動小数点数型または[`std::complex`](/reference/complex/complex.md)の特殊化で、`Scalar`が`InVec1::value_type`と`InVec2::value_type`より精度が高い場合、和の各項は`Scalar`またはより高い精度の型が使われる。
## 例
Expand Down
12 changes: 6 additions & 6 deletions reference/linalg/dotc.md
Original file line number Diff line number Diff line change
Expand Up @@ -45,7 +45,7 @@ namespace std::linalg {
## 適格要件
- 共通:
+ [`compatible-static-extents`](compatible-static-extents.md)`<InVec1, InVec2>(0, 0)`が`true` (2つのベクトルの静的な要素数が同じ)
+ [`compatible-static-extents`](compatible-static-extents.md)`<InVec1, InVec2>(0, 0)`が`true` (2つのベクトルの静的な要素数が同じ)
- (2), (4): [`is_execution_policy`](/reference/execution/is_execution_policy.md)`<ExecutionPolicy>::value`が`true`
Expand All @@ -57,10 +57,10 @@ namespace std::linalg {
## 効果
- (1): [`dot`](dot.md)`(`[`conjugated`](conjugated.md)`(v1), v2, init)`を返す。
- (2): `dot(std::forward<ExecutionPolicy>(exec), conjugated(v1), v2, init)`を返す。
- (3), (4): `T`を各ベクトルの値型の積の型`decltype(conj-if-needed(declval<typename InVec1::value_type>()) * declval<typename InVec2::value_type>())`とする。
+ (3): `dotc(v1, v2, T{})`を返す。
+ (4): `dotc(std::forward<ExecutionPolicy>(exec), v1, v2, T{})`を返す。
- (2): [`dot`](dot.md)`(std::forward<ExecutionPolicy>(exec),` [`conjugated`](conjugated.md)`(v1), v2, init)`を返す。
- (3), (4): `T`を各ベクトルの値型の積の型`decltype(`[`conj-if-needed`](conj-if-needed.md)`(declval<typename InVec1::value_type>()) * declval<typename InVec2::value_type>())`とする。
+ (3): `dotc(v1, v2, T{})`を返す。
+ (4): `dotc(std::forward<ExecutionPolicy>(exec), v1, v2, T{})`を返す。
## 戻り値
Expand Down Expand Up @@ -114,7 +114,7 @@ int main()
return 0;
}
```

* std::linalg::dotc[color ff0000]

### 出力
```
Expand Down
18 changes: 9 additions & 9 deletions reference/linalg/matrix_frob_norm.md
Original file line number Diff line number Diff line change
Expand Up @@ -38,13 +38,13 @@ namespace std::linalg {
## 適格要件
- (1), (2): `decltype(init + `[`abs-if-needed`](abs-if-needed.md)`(declval<typename InMat::value_type>()) * abs-if-needed(declval<typename InMat::value_type>()))`が`Scalar`に変換可能。
- (1), (2): `decltype(init +` [`abs-if-needed`](abs-if-needed.md)`(declval<typename InMat::value_type>()) * abs-if-needed(declval<typename InMat::value_type>()))`が`Scalar`に変換可能。
- (2), (4): [`is_execution_policy`](/reference/execution/is_execution_policy.md)`<ExecutionPolicy>::value`が`true`
## 効果
- (3), (4): `T`を`decltype(abs-if-needed(declval<typename InMat::value_type>()) * abs-if-needed(declval<typename InMat::value_type>()))`とすると、
+ (3): `matrix_frob_norm(A, T{})`を返す。
+ (4): `matrix_frob_norm(std::forward<ExecutionPolicy>(exec), A, T{})`を返す。
- (3), (4): `T`を`decltype(`[`abs-if-needed`](abs-if-needed.md)`(declval<typename InMat::value_type>()) * abs-if-needed(declval<typename InMat::value_type>()))`とすると、
+ (3): `matrix_frob_norm(A, T{})`を返す。
+ (4): `matrix_frob_norm(std::forward<ExecutionPolicy>(exec), A, T{})`を返す。
## 戻り値
Expand All @@ -54,13 +54,13 @@ $$
\sqrt{\sum_{i = 0}^{m - 1} \sum_{j = 0}^{n - 1} |\verb|A[|i, j\verb|]||^2 + \verb|init|^2}
$$
- (3), (4): `T`を`decltype(abs-if-needed(declval<typename InMat::value_type>()) * abs-if-needed(declval<typename InMat::value_type>()))`とすると、
+ (3): `matrix_frob_norm(A, T{})`を返す。
+ (4): `matrix_frob_norm(std::forward<ExecutionPolicy>(exec), A, T{})`を返す。
- (3), (4): `T`を`decltype(`[`abs-if-needed`](abs-if-needed.md)`(declval<typename InMat::value_type>()) * abs-if-needed(declval<typename InMat::value_type>()))`とすると、
+ (3): `matrix_frob_norm(A, T{})`を返す。
+ (4): `matrix_frob_norm(std::forward<ExecutionPolicy>(exec), A, T{})`を返す。
## 備考
- (1), (2): もし`InMat::value_type`と`Scalar`がどちらも浮動小数点数型または`std::complex`の特殊化で、`Scalar`が`InMat::value_type`より精度が高い場合、和の各項は`Scalar`またはより高い精度の型が使われる。
- (1), (2): もし`InMat::value_type`と`Scalar`がどちらも浮動小数点数型または[`std::complex`](/reference/complex/complex.md)の特殊化で、`Scalar`が`InMat::value_type`より精度が高い場合、和の各項は`Scalar`またはより高い精度の型が使われる。
## 例
Expand Down Expand Up @@ -97,7 +97,7 @@ int main()
return 0;
}
```

* std::linalg::matrix_frob_norm[color ff0000]

### 出力
```
Expand Down
16 changes: 8 additions & 8 deletions reference/linalg/matrix_inf_norm.md
Original file line number Diff line number Diff line change
Expand Up @@ -43,9 +43,9 @@ namespace std::linalg {
## 効果
- (3), (4): `T`を`decltype(abs-if-needed(declval<typename InMat::value_type>()))`とすると、
+ (3): `matrix_inf_norm(A, T{})`を返す。
+ (4): `matrix_inf_norm(std::forward<ExecutionPolicy>(exec), A, T{})`を返す。
- (3), (4): `T`を`decltype(`[`abs-if-needed`](abs-if-needed.md)`(declval<typename InMat::value_type>()))`とすると、
+ (3): `matrix_inf_norm(A, T{})`を返す。
+ (4): `matrix_inf_norm(std::forward<ExecutionPolicy>(exec), A, T{})`を返す。
## 戻り値
Expand All @@ -57,13 +57,13 @@ $$
\verb|init| + \max_{i = 0, \dots ,m - 1}\sum_{j = 0}^{n - 1} |\verb|A[|i, j\verb|]||
$$
- (3), (4): `T`を`decltype(abs-if-needed(declval<typename InMat::value_type>()))`とすると、
+ (3): `matrix_inf_norm(A, T{})`を返す。
+ (4): `matrix_inf_norm(std::forward<ExecutionPolicy>(exec), A, T{})`を返す。
- (3), (4): `T`を`decltype(`[`abs-if-needed`](abs-if-needed.md)`(declval<typename InMat::value_type>()))`とすると、
+ (3): `matrix_inf_norm(A, T{})`を返す。
+ (4): `matrix_inf_norm(std::forward<ExecutionPolicy>(exec), A, T{})`を返す。
## 備考
- (1), (2): もし`InMat::value_type`と`Scalar`がどちらも浮動小数点数型または`std::complex`の特殊化で、`Scalar`が`InMat::value_type`より精度が高い場合、和の各項は`Scalar`またはより高い精度の型が使われる。
- (1), (2): もし`InMat::value_type`と`Scalar`がどちらも浮動小数点数型または[`std::complex`](/reference/complex/complex.md)の特殊化で、`Scalar`が`InMat::value_type`より精度が高い場合、和の各項は`Scalar`またはより高い精度の型が使われる。
## 例
Expand Down Expand Up @@ -100,7 +100,7 @@ int main()
return 0;
}
```

* std::linalg::matrix_inf_norm[color ff0000]

### 出力
```
Expand Down
16 changes: 8 additions & 8 deletions reference/linalg/matrix_one_norm.md
Original file line number Diff line number Diff line change
Expand Up @@ -43,9 +43,9 @@ namespace std::linalg {
## 効果
- (3), (4): `T`を`decltype(abs-if-needed(declval<typename InMat::value_type>()))`とすると、
+ (3): `matrix_one_norm(A, T{})`を返す。
+ (4): `matrix_one_norm(std::forward<ExecutionPolicy>(exec), A, T{})`を返す。
- (3), (4): `T`を`decltype(`[`abs-if-needed`](abs-if-needed.md)`(declval<typename InMat::value_type>()))`とすると、
+ (3): `matrix_one_norm(A, T{})`を返す。
+ (4): `matrix_one_norm(std::forward<ExecutionPolicy>(exec), A, T{})`を返す。
## 戻り値
Expand All @@ -57,13 +57,13 @@ $$
\verb|init| + \max_{j = 0, \dots ,n - 1}\sum_{i = 0}^{m - 1} |\verb|A[|i, j\verb|]||
$$
- (3), (4): `T`を`decltype(abs-if-needed(declval<typename InMat::value_type>()))`とすると、
+ (3): `matrix_one_norm(A, T{})`を返す。
+ (4): `matrix_one_norm(std::forward<ExecutionPolicy>(exec), A, T{})`を返す。
- (3), (4): `T`を`decltype(`[`abs-if-needed`](abs-if-needed.md)`(declval<typename InMat::value_type>()))`とすると、
+ (3): `matrix_one_norm(A, T{})`を返す。
+ (4): `matrix_one_norm(std::forward<ExecutionPolicy>(exec), A, T{})`を返す。
## 備考
- (1), (2): もし`InMat::value_type`と`Scalar`がどちらも浮動小数点数型または`std::complex`の特殊化で、`Scalar`が`InMat::value_type`より精度が高い場合、和の各項は`Scalar`またはより高い精度の型が使われる。
- (1), (2): もし`InMat::value_type`と`Scalar`がどちらも浮動小数点数型または[`std::complex`](/reference/complex/complex.md)の特殊化で、`Scalar`が`InMat::value_type`より精度が高い場合、和の各項は`Scalar`またはより高い精度の型が使われる。
## 例
Expand Down Expand Up @@ -100,7 +100,7 @@ int main()
return 0;
}
```

* std::linalg::matrix_one_norm[color ff0000]

### 出力
```
Expand Down
11 changes: 7 additions & 4 deletions reference/linalg/setup_givens_rotation.md
Original file line number Diff line number Diff line change
Expand Up @@ -9,13 +9,16 @@
```cpp
namespace std::linalg {
template<class Real>
setup_givens_rotation_result<Real> setup_givens_rotation(Real a, Real b) noexcept; // (1)
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<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`を計算する。
Expand Down Expand Up @@ -53,7 +56,7 @@ $$
## 適格要件
- `Real`は`complex<Real>`が規定できる型であること。
- `Real`は[`complex`](/reference/complex/complex.md)`<Real>`が規定できる型であること。
## 戻り値
Expand Down
4 changes: 3 additions & 1 deletion reference/linalg/setup_givens_rotation_result.md
Original file line number Diff line number Diff line change
Expand Up @@ -21,13 +21,15 @@ namespace std::linalg {
};
}
```
* complex[link /reference/complex/complex.md]
## 概要
ギブンス回転の結果を表すクラス。詳しくは、[`setup_givens_rotation`](setup_givens_rotation.md)にて。
## 適格要件
- `Real`は`complex<Real>`が規定できる型であること。
- `Real`は[`complex`](/reference/complex/complex.md)`<Real>`が規定できる型であること。
## 例
Expand Down
2 changes: 2 additions & 0 deletions reference/linalg/swap_elements.md
Original file line number Diff line number Diff line change
Expand Up @@ -30,6 +30,7 @@ namespace std::linalg {
## テンプレートパラメータ制約
`x`と`y`の次元が等しくなければならない。
- `x.rank() == y.rank()`
Expand All @@ -40,6 +41,7 @@ namespace std::linalg {
## 事前条件
`x`と`y`の各次元の要素数が等しくなければならない。
- `x.extents() == y.extents()`
Expand Down
20 changes: 10 additions & 10 deletions reference/linalg/vector_abs_sum.md
Original file line number Diff line number Diff line change
Expand Up @@ -37,38 +37,38 @@ namespace std::linalg {
## 適格要件
- (1), (2): `decltype(init + `[`abs-if-needed`](abs-if-needed.md)`(`[`real-if-needed`](real-if-needed.md)`(declval<typename InVec::value_type>())) + abs-if-needed(`[`imag-if-needed`](imag-if-needed.md)`(declval<typename InVec::value_type>())))`が`Scalar`に変換可能。
- (1), (2): `decltype(init +` [`abs-if-needed`](abs-if-needed.md)`(`[`real-if-needed`](real-if-needed.md)`(declval<typename InVec::value_type>())) + abs-if-needed(`[`imag-if-needed`](imag-if-needed.md)`(declval<typename InVec::value_type>())))`が`Scalar`に変換可能。
- (2), (4): [`is_execution_policy`](/reference/execution/is_execution_policy.md)`<ExecutionPolicy>::value`が`true`
## 効果
- (3), (4): `T`を`typename InVec::value_type`とすると、
+ (3): `vector_abs_sum(v, T{})`を返す。
+ (4): `vector_abs_sum(std::forward<ExecutionPolicy>(exec), v, T{})`を返す。
+ (3): `vector_abs_sum(v, T{})`を返す。
+ (4): `vector_abs_sum(std::forward<ExecutionPolicy>(exec), v, T{})`を返す。
## 戻り値
- (1), (2): `N`を`v`の次元`v.extent(0)`とすると、以下を返す。
1. もし`N`が0なら`init`
2. そうでない場合、もし`InVec::value_type`が算術型なら以下の式の値
- もし`N`が0なら`init`
- そうでない場合、もし`InVec::value_type`が算術型なら以下の式の値
$$
\sum_{i = 0}^{N - 1} |\verb|v[|i\verb|]|| + \verb|init|
$$
3. そうでない場合、以下の式の値
- そうでない場合、以下の式の値
$$
\sum_{i = 0}^{N - 1} \left\{|\mathrm{Re}(\verb|v[|i\verb|]|)| + |\mathrm{Im}(\verb|v[|i\verb|]|)|\right\} + \verb|init|
$$
- (3), (4): `T`を`typename InVec::value_type`とすると、
+ (3): `vector_abs_sum(v, T{})`を返す。
+ (4): `vector_abs_sum(std::forward<ExecutionPolicy>(exec), v, T{})`を返す。
+ (3): `vector_abs_sum(v, T{})`を返す。
+ (4): `vector_abs_sum(std::forward<ExecutionPolicy>(exec), v, T{})`を返す。
## 備考
- (1), (2): もし`InVec::value_type`と`Scalar`がどちらも浮動小数点数型または`std::complex`の特殊化で、`Scalar`が`InVec::value_type`より精度が高い場合、和の各項は`Scalar`またはより高い精度の型が使われる。
- (1), (2): もし`InVec::value_type`と`Scalar`がどちらも浮動小数点数型または[`std::complex`](/reference/complex/complex.md)の特殊化で、`Scalar`が`InVec::value_type`より精度が高い場合、和の各項は`Scalar`またはより高い精度の型が使われる。
## 例
Expand Down Expand Up @@ -102,7 +102,7 @@ int main()
return 0;
}
```

* std::linalg::vector_abs_sum[color ff0000]

### 出力
```
Expand Down
22 changes: 12 additions & 10 deletions reference/linalg/vector_idx_abs_max.md
Original file line number Diff line number Diff line change
Expand Up @@ -32,16 +32,18 @@ namespace std::linalg {
## 戻り値
- (1), (2): `N`を`v`の次元`v.extent(0)`とすると、以下を返す。
1. もし`N`が0なら`std::numeric_limits<typename InVec::size_type>::max()`
2. そうでない場合、もし`InVec::value_type`が算術型なら絶対値が最大の最初の`v`の成分のインデックス。つまり、
$$
\argmax_{i = 0, \dots, N - 1} |\verb|v[|i\verb|]||
$$
3. そうでない場合、
+ もし`N`が0なら[`std::numeric_limits`](/reference/limits/numeric_limits.md)`<typename InVec::size_type>::max()`
+ そうでない場合、もし`InVec::value_type`が算術型なら絶対値が最大の最初の`v`の成分のインデックス。つまり、
$$
\argmax_{i = 0, \dots, N - 1}\left\{|\mathrm{Re}(\verb|v[|i\verb|]|)| + |\mathrm{Im}(\verb|v[|i\verb|]|)|\right\}
$$
$$
\argmax_{i = 0, \dots, N - 1} |\verb|v[|i\verb|]||
$$
+ そうでない場合、
$$
\argmax_{i = 0, \dots, N - 1}\left\{|\mathrm{Re}(\verb|v[|i\verb|]|)| + |\mathrm{Im}(\verb|v[|i\verb|]|)|\right\}
$$
## 例
Expand Down Expand Up @@ -73,7 +75,7 @@ int main()
return 0;
}
```

* std::linalg::vector_idx_abs_max[color ff0000]

### 出力
```
Expand Down
Loading

0 comments on commit d73c2fc

Please sign in to comment.