Skip to content

Commit c5cacdf

Browse files
committed
linalg : vector_abs_sumを追加 (#1233)
Signed-off-by: Yuya Asano <64895419+sukeya@users.noreply.github.com>
1 parent eed3fa0 commit c5cacdf

File tree

4 files changed

+197
-1
lines changed

4 files changed

+197
-1
lines changed

reference/linalg.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -70,7 +70,7 @@ BLAS 1, 2, 3のアルゴリズムでテンプレートパラメータが特に
7070
| [`sum_of_squares_result`](linalg/sum_of_squares_result.md) | `vector_sum_of_squares`の結果型 (class template) | C++26 |
7171
| [`vector_sum_of_squares`](linalg/vector_sum_of_squares.md) | xLASSQ: ベクトル要素の平方和を求める (function template) | C++26 |
7272
| [`vector_two_norm`](linalg/vector_two_norm.md) | xNRM2: ベクトルのユークリッドノルム(Euclidean norm)を求める (function template) | C++26 |
73-
| `vector_abs_sum` | xASUM: ベクトル要素の絶対値和を求める (function template) | C++26 |
73+
| [`vector_abs_sum`](linalg/vector_abs_sum.md) | xASUM: ベクトル要素の絶対値和を求める (function template) | C++26 |
7474
| `vector_idx_abs_max` | xIAMAX: ベクトル要素のうち最大絶対値インデクスを返す (function template) | C++26 |
7575
| `matrix_frob_norm` | 行列のフロベニウスノルム(Frobenius norm)を求める (function template) | C++26 |
7676
| `matrix_one_norm` | 行列の1ノルム(One norm)を求める (function template) | C++26 |

reference/linalg/imag-if-needed.md

Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,32 @@
1+
# imag-if-needed
2+
3+
* linalg[meta header]
4+
* function[meta id-type]
5+
* std::linalg[meta namespace]
6+
* cpp26[meta cpp]
7+
8+
## 概要
9+
`imag-if-needed`は、必要に応じて複素数の虚部を返す、説明専用の関数オブジェクトである。
10+
11+
`T`の式`E`に対して、式`imag-if-needed(E)`は次と等価である。
12+
13+
1. `T`が算術型でなく、式`imag(E)`が下記宣言を含むコンテキストにおいてオーバーロード解決を行った結果が妥当であるとき、`imag(E)`
14+
```cpp
15+
template<class T>
16+
T imag(const T&) = delete;
17+
```
18+
2. そうでない場合、`((void)E, T{})`
19+
20+
21+
## 備考
22+
オーバーロード解決により選択された関数が入力された複素数の実部を返さないとき、プログラムは不適格となる。
23+
24+
25+
## バージョン
26+
### 言語
27+
- C++26
28+
29+
30+
## 参照
31+
- [P1673R13 A free function linear algebra interface based on the BLAS](https://www.open-std.org/jtc1/sc22/wg21/docs/papers/2023/p1673r13.html)
32+

reference/linalg/real-if-needed.md

Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,32 @@
1+
# real-if-needed
2+
3+
* linalg[meta header]
4+
* function[meta id-type]
5+
* std::linalg[meta namespace]
6+
* cpp26[meta cpp]
7+
8+
## 概要
9+
`real-if-needed`は、必要に応じて複素数の実部を返す、説明専用の関数オブジェクトである。
10+
11+
`T`の式`E`に対して、式`real-if-needed(E)`は次と等価である。
12+
13+
1. `T`が算術型でなく、式`real(E)`が下記宣言を含むコンテキストにおいてオーバーロード解決を行った結果が妥当であるとき、`real(E)`
14+
```cpp
15+
template<class T>
16+
T real(const T&) = delete;
17+
```
18+
2. そうでない場合、`E`
19+
20+
21+
## 備考
22+
オーバーロード解決により選択された関数が入力された複素数の実部を返さないとき、プログラムは不適格となる。
23+
24+
25+
## バージョン
26+
### 言語
27+
- C++26
28+
29+
30+
## 参照
31+
- [P1673R13 A free function linear algebra interface based on the BLAS](https://www.open-std.org/jtc1/sc22/wg21/docs/papers/2023/p1673r13.html)
32+

reference/linalg/vector_abs_sum.md

Lines changed: 132 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,132 @@
1+
# vector_abs_sum
2+
3+
* [mathjax enable]
4+
* linalg[meta header]
5+
* function template[meta id-type]
6+
* std::linalg[meta namespace]
7+
* cpp26[meta cpp]
8+
9+
```cpp
10+
namespace std::linalg {
11+
template<in-vector InVec, class Scalar>
12+
Scalar vector_abs_sum(InVec v, Scalar init); // (1)
13+
14+
template<class ExecutionPolicy,
15+
in-vector InVec,
16+
class Scalar>
17+
Scalar vector_abs_sum(ExecutionPolicy&& exec,
18+
InVec v,
19+
Scalar init); // (2)
20+
21+
template<in-vector InVec>
22+
auto vector_abs_sum(InVec v); // (3)
23+
24+
template<class ExecutionPolicy, in-vector InVec>
25+
auto vector_abs_sum(ExecutionPolicy&& exec, InVec v); // (4)
26+
}
27+
```
28+
29+
30+
## 概要
31+
ベクトルの各成分の絶対値の和(1ノルム)を計算する。
32+
33+
- (1): 逐次実行する。
34+
- (2): 指定された実行ポリシーに応じて実行する。
35+
- (3): (1)で`init`に`InVec::value_type`のデフォルト値を与えて逐次実行する。
36+
- (4): (2)で`init`に`InVec::value_type`のデフォルト値を与えて、指定された実行ポリシーに応じて実行する。
37+
38+
39+
## 適格要件
40+
- (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`に変換可能。
41+
42+
## 効果
43+
- (3), (4): `T`を`typename InVec::value_type`とすると、
44+
+ (3): `vector_abs_sum(v, T{})`を返す。
45+
+ (4): `vector_abs_sum(std::forward<ExecutionPolicy>(exec), v, T{})`を返す。
46+
47+
48+
## 戻り値
49+
- (1), (2): `N`を`v`の次元`v.extent(0)`とすると、以下を返す。
50+
1. もし`N`が0なら`init`
51+
2. そうでない場合、もし`InVec::value_type`が算術型なら以下の式の値
52+
53+
$$
54+
\sum_{i = 0}^{N - 1} |\verb|v[|i\verb|]|| + \verb|init|
55+
$$
56+
57+
3. そうでない場合、以下の式の値
58+
59+
$$
60+
\sum_{i = 0}^{N - 1} \left\{|\mathrm{Re}(\verb|v[|i\verb|]|)| + |\mathrm{Im}(\verb|v[|i\verb|]|)|\right\} + \verb|init|
61+
$$
62+
63+
64+
- (3), (4): `T`を`typename InVec::value_type`とすると、
65+
+ (3): `vector_abs_sum(v, T{})`を返す。
66+
+ (4): `vector_abs_sum(std::forward<ExecutionPolicy>(exec), v, T{})`を返す。
67+
68+
69+
## 備考
70+
- (1), (2): もし`InVec::value_type`と`Scalar`がどちらも浮動小数点数型または`std::complex`の特殊化で、`Scalar`が`InVec::value_type`より精度が高い場合、和の各項は`Scalar`またはより高い精度の型が使われる。
71+
72+
73+
## 例
74+
**[注意] 処理系にあるコンパイラで確認していないため、間違っているかもしれません。**
75+
76+
```cpp
77+
#include <array>
78+
#include <cmath>
79+
#include <execution>
80+
#include <iostream>
81+
#include <linalg>
82+
#include <mdspan>
83+
84+
int main()
85+
{
86+
constexpr size_t N = 4;
87+
88+
std::array<double, N> vec(N);
89+
90+
std::mdspan v(vec.data(), N);
91+
92+
for(int i = 0; i < v.extent(0); ++i) v(i) = std::pow(-1.0, i) / (i + 1);
93+
94+
std::cout << std::linalg::vector_abs_sum(v, -5.0 / 6) << '\n' // (1)
95+
<< std::linalg::vector_abs_sum(std::execution::par, v, -5.0 / 6) << '\n' // (2)
96+
<< std::linalg::vector_abs_sum(v) << '\n' // (3)
97+
<< std::linalg::vector_abs_sum(std::execution::par, v) << '\n'; // (4)
98+
99+
return 0;
100+
}
101+
```
102+
103+
104+
### 出力
105+
```
106+
1.25
107+
1.25
108+
2.08333
109+
2.08333
110+
```
111+
112+
113+
## バージョン
114+
### 言語
115+
- C++26
116+
117+
### 処理系
118+
- [Clang](/implementation.md#clang): ??
119+
- [GCC](/implementation.md#gcc): ??
120+
- [ICC](/implementation.md#icc): ??
121+
- [Visual C++](/implementation.md#visual_cpp): ??
122+
123+
124+
## 関連項目
125+
- [`execution`](/reference/execution.md)
126+
- [`mdspan`](/reference/mdspan.md)
127+
128+
129+
## 参照
130+
- [P0788R3 Standard Library Specification in a Concepts and Contracts World](http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2018/p0788r3.pdf)
131+
- [LAPACK: dzasum](https://netlib.org/lapack/explore-html/d5/d72/group__asum_gaf23444d1c822b34db864558d7afc76dd.html#gaf23444d1c822b34db864558d7afc76dd)
132+

0 commit comments

Comments
 (0)