# 配列の基本演算子と関数 :::{container} prog-cpp 基本的に,配列に対する演算子と関数は要素ごとに適用されます. ## 配列の基本演算子 基本演算子 **`+`**,**`-`**,**`*`** は変数や式の配列に対して使用できます.**`/`**(÷整数)は式の配列に対して使用できます(変数配列は `auto f = x + 0;` のように式の配列へ変換してから). Hi-QUBOでは,これらの演算子は要素ごとに適用されます. ### 配列とスカラーの演算 配列とスカラーを組み合わせると,スカラーが配列の各要素に適用されます. 例えば,`x` がサイズ3の配列の場合: - `2 * x` は `{2*x[0], 2*x[1], 2*x[2]}` を生成 - `x + 1` は `{x[0] + 1, x[1] + 1, x[2] + 1}` を生成 以下のプログラムはこの動作を示しています. ```{literalinclude} /../programFiles/cppPrograms/advanced/vector-operators-and-functions-program1.cpp :language: cpp :caption: vector-operators-and-functions-program1.cpp ``` このプログラムは2値変数の配列 `x = {x[0], x[1], x[2]}` を作成します. `2 * x` で各要素に `2` を掛け,`+ 1` で各要素に `1` を加えるため,`f` は `{1 + 2*x[0], 1 + 2*x[1], 1 + 2*x[2]}` になります. このプログラムは以下の出力を生成します. ```{include} /../programFiles/markDown/advanced/vector-operators-and-functions.md :start-after: :end-before: ``` ### 配列同士の演算 同じサイズの2つの配列を組み合わせると,各インデックスで要素ごとに演算が行われます. 以下の例では,どちらもサイズ3の2つの配列 `x` と `y` を使用しています. ```{literalinclude} /../programFiles/cppPrograms/advanced/vector-operators-and-functions-program2.cpp :language: cpp :caption: vector-operators-and-functions-program2.cpp ``` ここでは: - `2 * x` は `{2*x[0], 2*x[1], 2*x[2]}` になる - `3 * y` は `{3*y[0], 3*y[1], 3*y[2]}` になる - 加算は要素ごとに行われるため,`i` 番目の要素は `2*x[i] + 3*y[i]` - `+ 1` も要素ごとに適用される したがって,`f` は `{1 + 2*x[0] + 3*y[0], 1 + 2*x[1] + 3*y[1], 1 + 2*x[2] + 3*y[2]}` となり,出力と一致します. ```{include} /../programFiles/markDown/advanced/vector-operators-and-functions.md :start-after: :end-before: ``` 配列同士の演算は同じ配列サイズが必要です. 次の例は,配列とスカラーの演算,配列同士の演算,単項マイナス,括弧を含む,より複雑な要素ごとの式を示しています. ```{literalinclude} /../programFiles/cppPrograms/advanced/vector-operators-and-functions-program3.cpp :language: cpp :caption: vector-operators-and-functions-program3.cpp ``` この例でも,すべての演算は要素ごとに適用されます. - まず,`x + 1` と `y - 1` は各要素にスカラーを加減算し,2つの配列 `{x[i]+1}` と `{y[i]-1}` を生成します. - 単項マイナス -(x + 1) も要素ごとに適用され,`{-(x[i]+1)}` になります. - 乗算 `6 * -(x + 1) * (y - 1)` も要素ごとに行われ,各インデックス `i` で `f[i]=6*(-(x[i]+1))*(y[i]-1)` となります. この式を展開すると `f[i]=6-6x[i]y[i]+6x[i]-6y[i]` となり,出力と一致します. - 最後に,`g = f / 3` は各要素を3で割るため,`g[i]=f[i]/3=2-2x[i]y[i]+2x[i]-2y[i]` となり,やはり出力と一致します. ```{include} /../programFiles/markDown/advanced/vector-operators-and-functions.md :start-after: :end-before: ``` ## 配列の複合演算子 同様に,複合演算子 **`+=`**,**`-=`**,**`*=`**,**`/=`** も式の配列に対して使用できます(変数配列の要素型は変更できないため,先に式の配列へ変換します). 以下の例は,サイズ3の配列に対するこれらの演算子の動作を示しています. ```{literalinclude} /../programFiles/cppPrograms/advanced/vector-operators-and-functions-program4.cpp :language: cpp :caption: vector-operators-and-functions-program4.cpp ``` このプログラムは以下の出力を生成します. ```{include} /../programFiles/markDown/advanced/vector-operators-and-functions.md :start-after: :end-before: ``` ## 配列の2乗関数 2乗関数も配列に対して使用できます.以下に例を示します. ```{literalinclude} /../programFiles/cppPrograms/advanced/vector-operators-and-functions-program5.cpp :language: cpp :caption: vector-operators-and-functions-program5.cpp ``` このプログラムは以下の出力を生成します. ```{include} /../programFiles/markDown/advanced/vector-operators-and-functions.md :start-after: :end-before: ``` ## 配列の簡約化関数 簡約化関数も配列に対して使用できます.以下に例を示します. ```{literalinclude} /../programFiles/cppPrograms/advanced/vector-operators-and-functions-program6.cpp :language: cpp :caption: vector-operators-and-functions-program6.cpp ``` このプログラムは以下の出力を生成します. ```{include} /../programFiles/markDown/advanced/vector-operators-and-functions.md :start-after: :end-before: ``` > **注意** > これらの演算子と関数は **多次元配列** に対しても使用できます. ::: :::{container} prog-python 基本的に,配列に対する演算子と関数は要素ごとに適用されます. ## 配列の基本演算子 基本演算子 **`+`**,**`-`**,**`*`** は変数や式の配列に対して使用できます.**`/`**(÷整数)は式の配列に対して使用できます. Hi-QUBOでは,これらの演算子は要素ごとに適用されます. ### 配列とスカラーの演算 配列とスカラーを組み合わせると,スカラーが配列の各要素に適用されます. 例えば,`x` がサイズ3の配列の場合: - `2 * x` は `[2*x[0], 2*x[1], 2*x[2]]` を生成 - `x + 1` は `[x[0] + 1, x[1] + 1, x[2] + 1]` を生成 以下のプログラムはこの動作を示しています. ```{literalinclude} /../programFiles/pythonPrograms/advanced/vector-operators-and-functions-program1.py :language: python :caption: vector-operators-and-functions-program1.py ``` このプログラムは2値変数の配列 `x = [x[0], x[1], x[2]]` を作成します. `2 * x` で各要素に `2` を掛け,`+ 1` で各要素に `1` を加えるため,`f` は `[1 + 2*x[0], 1 + 2*x[1], 1 + 2*x[2]]` になります. このプログラムは以下の出力を生成します. ```{include} /../programFiles/markDown/advanced/vector-operators-and-functions.md :start-after: :end-before: ``` ### 配列同士の演算 同じサイズの2つの配列を組み合わせると,各インデックスで要素ごとに演算が行われます. 以下の例では,どちらもサイズ3の2つの配列 `x` と `y` を使用しています. ```{literalinclude} /../programFiles/pythonPrograms/advanced/vector-operators-and-functions-program2.py :language: python :caption: vector-operators-and-functions-program2.py ``` ここでは: - `2 * x` は `[2*x[0], 2*x[1], 2*x[2]]` になる - `3 * y` は `[3*y[0], 3*y[1], 3*y[2]]` になる - 加算は要素ごとに行われるため,`i` 番目の要素は `2*x[i] + 3*y[i]` - `+ 1` も要素ごとに適用される したがって,`f` は `[1 + 2*x[0] + 3*y[0], 1 + 2*x[1] + 3*y[1], 1 + 2*x[2] + 3*y[2]]` となり,出力と一致します. ```{include} /../programFiles/markDown/advanced/vector-operators-and-functions.md :start-after: :end-before: ``` 配列同士の演算は同じ配列サイズが必要です. 次の例は,配列とスカラーの演算,配列同士の演算,単項マイナス,括弧を含む,より複雑な要素ごとの式を示しています. ```{literalinclude} /../programFiles/pythonPrograms/advanced/vector-operators-and-functions-program3.py :language: python :caption: vector-operators-and-functions-program3.py ``` この例でも,すべての演算は要素ごとに適用されます. - まず,`x + 1` と `y - 1` は各要素にスカラーを加減算し,2つの配列 `[x[i]+1]` と `[y[i]-1]` を生成します. - 単項マイナス -(x + 1) も要素ごとに適用され,`[-(x[i]+1)]` になります. - 乗算 `6 * -(x + 1) * (y - 1)` も要素ごとに行われ,各インデックス `i` で `f[i]=6*(-(x[i]+1))*(y[i]-1)` となります. この式を展開すると `f[i]=6-6x[i]y[i]+6x[i]-6y[i]` となり,出力と一致します. - 最後に,`g = f / 3` は各要素を3で割るため,`g[i]=f[i]/3=2-2x[i]y[i]+2x[i]-2y[i]` となり,やはり出力と一致します. ```{include} /../programFiles/markDown/advanced/vector-operators-and-functions.md :start-after: :end-before: ``` ## 配列の複合演算子 同様に,複合演算子 **`+=`**,**`-=`**,**`*=`**,**`/=`** も式の配列に対して使用できます. 以下の例は,サイズ3の配列に対するこれらの演算子の動作を示しています. ```{literalinclude} /../programFiles/pythonPrograms/advanced/vector-operators-and-functions-program4.py :language: python :caption: vector-operators-and-functions-program4.py ``` このプログラムは以下の出力を生成します. ```{include} /../programFiles/markDown/advanced/vector-operators-and-functions.md :start-after: :end-before: ``` ## 配列の2乗関数 2乗関数も配列に対して使用できます.以下に例を示します. ```{literalinclude} /../programFiles/pythonPrograms/advanced/vector-operators-and-functions-program5.py :language: python :caption: vector-operators-and-functions-program5.py ``` このプログラムは以下の出力を生成します. ```{include} /../programFiles/markDown/advanced/vector-operators-and-functions.md :start-after: :end-before: ``` ## 配列の簡約化関数 簡約化関数も配列に対して使用できます.以下に例を示します. ```{literalinclude} /../programFiles/pythonPrograms/advanced/vector-operators-and-functions-program6.py :language: python :caption: vector-operators-and-functions-program6.py ``` このプログラムは以下の出力を生成します. ```{include} /../programFiles/markDown/advanced/vector-operators-and-functions.md :start-after: :end-before: ``` > **注釈** > これらの演算子と関数は **多次元配列** に対しても使用できます. :::