# ベクトルに対する基本演算子と関数 基本的に、ベクトルに対する演算子や関数は**要素ごと(element-wise)**に適用されます。 ## ベクトルに対する基本演算子 基本演算子 `+`, `-`, `*`, `/` は、変数ベクトルおよび式ベクトルに対して使用できます。 :::{container} prog-cpp QUBO++ では、これらの演算子は**各要素に対して個別に適用**されます。 ::: :::{container} prog-python PyQBPP では、これらの演算子は**各要素に対して個別に適用**されます。 ::: ## ベクトルとスカラーの演算 ベクトルとスカラーを組み合わせる場合、スカラーはベクトルの各要素に適用されます。 例えば、サイズ3のベクトル `x` に対して: - `2 * x` は `{2*x[0], 2*x[1], 2*x[2]}` を生成します。 - `x + 1` は `{x[0] + 1, x[1] + 1, x[2] + 1}` を生成します。 次のプログラムは、この動作を示しています。 :::{container} prog-cpp ```{literalinclude} ../../programFiles/cppPrograms/advanced/vector-operators-and-functions-program1.cpp :language: cpp :caption: vector-operators-and-functions-program1.cpp ``` ::: :::{container} prog-python ```{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-program.md :start-after: :end-before: ``` ## ベクトル同士の演算 同じサイズの2つのベクトルを組み合わせる場合、演算は各インデックスごとに要素単位で実行されます。 次の例では、サイズ3のベクトル `x` と `y` を使用しています。 :::{container} prog-cpp ```{literalinclude} ../../programFiles/cppPrograms/advanced/vector-operators-and-functions-program2.cpp :language: cpp :caption: vector-operators-and-functions-program2.cpp ``` ::: :::{container} prog-python ```{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-program.md :start-after: :end-before: ``` ベクトル同士の演算では、**同じサイズである必要があります**。 ## より複雑な要素ごとの演算例 次の例では、ベクトルとスカラーの演算、ベクトル同士の演算、単項マイナス、および括弧を含む、より複雑な式を示します。 :::{container} prog-cpp ```{literalinclude} ../../programFiles/cppPrograms/advanced/vector-operators-and-functions-program3.cpp :language: cpp :caption: vector-operators-and-functions-program3.cpp ``` ::: :::{container} prog-python ```{literalinclude} ../../programFiles/pythonPrograms/advanced/vector-operators-and-functions-program3.py :language: python :caption: vector-operators-and-functions-program3.py ``` ::: この例でも、すべての演算は要素ごとに適用されます。 - `x + 1` および `y - 1` は、それぞれ `{x[i] + 1}` と `{y[i] - 1}` を生成します。 - 単項マイナス `-(x + 1)` も要素ごとに適用され、`{-(x[i] + 1)}` になります。 - 乗算 `6 * -(x + 1) * (y - 1)` も要素ごとに実行されます。 したがって、各インデックス i に対して: ```{include} ../../programFiles/markDown/advanced/vector-operators-and-functions-program.md :start-after: :end-before: ``` これを展開すると: ```{include} ../../programFiles/markDown/advanced/vector-operators-and-functions-program.md :start-after: :end-before: ``` 最後に、`g = f / 3` は各要素を 3 で割るため、 ```{include} ../../programFiles/markDown/advanced/vector-operators-and-functions-program.md :start-after: :end-before: ``` となります。 出力は次のとおりです。 ```{include} ../../programFiles/markDown/advanced/vector-operators-and-functions-program.md :start-after: :end-before: ``` ## ベクトルに対する複合演算子 `+=`, `-=`, `*=`, `/=` といった複合演算子も、変数ベクトルおよび式ベクトルに対して使用できます。 これらの演算も **要素ごと(element-wise)** に適用されます。 次の例は、サイズ3のベクトルに対する複合演算子の動作を示しています。 :::{container} prog-cpp ```{literalinclude} ../../programFiles/cppPrograms/advanced/vector-operators-and-functions-program4.cpp :language: cpp :caption: vector-operators-and-functions-program4.cpp ``` ::: :::{container} prog-python ```{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-program.md :start-after: :end-before: ``` ## ベクトルに対する square 関数 `sqr` 関数もベクトルに対して使用できます。 こちらも各要素ごとに二乗が計算されます。 :::{container} prog-cpp ```{literalinclude} ../../programFiles/cppPrograms/advanced/vector-operators-and-functions-program5.cpp :language: cpp :caption: vector-operators-and-functions-program5.cpp ``` ::: :::{container} prog-python ```{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-program.md :start-after: :end-before: ``` ## ベクトルに対する simplify 関数 `simplify` 関数もベクトルに対して利用可能で、各要素がそれぞれ簡約されます。 :::{container} prog-cpp ```{literalinclude} ../../programFiles/cppPrograms/advanced/vector-operators-and-functions-program6.cpp :language: cpp :caption: vector-operators-and-functions-program6.cpp ``` ::: :::{container} prog-python ```{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-program.md :start-after: :end-before: ``` **NOTE:** これらの演算子および関数は、多次元配列に対しても同様に動作します。