多次元配列の合計関数
QUBO++は、変数または式の多次元配列に対して2つの合計関数を提供します:
qbpp::sum(): 配列内の全要素の合計を計算します。qbpp::vector_sum(): 最下位(最も内側の)次元に沿った和を計算します。 結果の配列は入力配列より1次元少なくなります。 入力配列は2次元以上である必要があります。
以下のプログラムは qbpp::sum() と qbpp::vector_sum():
#include "qbpp.hpp"
int main() {
auto x = qbpp::var("x", 2, 3, 3);
auto y = x + 1;
for (size_t i = 0; i < 2; ++i) {
for (size_t j = 0; j < 3; ++j) {
for (size_t k = 0; k < 3; ++k) {
std::cout << "y[" << i << "][" << j << "][" << k << "] = " << y[i][j][k]
<< std::endl;
}
}
}
auto sum = qbpp::sum(y).simplify();
std::cout << "sum(y) = " << sum << std::endl;
auto vector_sum = qbpp::vector_sum(y).simplify();
for (size_t i = 0; i < 2; ++i) {
for (size_t j = 0; j < 3; ++j) {
std::cout << "vector_sum[" << i << "][" << j << "] = " << vector_sum[i][j]
<< std::endl;
}
}
}
まず、サイズ $2 \times 3 \times 3$ の変数配列 x $2 \times 3 \times 3$ のサイズの変数配列が定義される。
次に、 y は、 xすべての要素に1を加えることで配列
を作成し、 y の全要素を計算し出力する。
その後、 qbpp::sum(y) が計算され出力される。
その後、 qbpp::vector_sum() 関数が y が適用され、結果は vector_sumに格納される。これはサイズ $2 \times 3$ の式からなる二次元配列である。
最後に、 vector_sum がすべて出力される。
このプログラムは以下の出力を生成する:
y[0][0][0] = 1 +x[0][0][0]
y[0][0][1] = 1 +x[0][0][1]
y[0][0][2] = 1 +x[0][0][2]
y[0][1][0] = 1 +x[0][1][0]
y[0][1][1] = 1 +x[0][1][1]
y[0][1][2] = 1 +x[0][1][2]
y[0][2][0] = 1 +x[0][2][0]
y[0][2][1] = 1 +x[0][2][1]
y[0][2][2] = 1 +x[0][2][2]
y[1][0][0] = 1 +x[1][0][0]
y[1][0][1] = 1 +x[1][0][1]
y[1][0][2] = 1 +x[1][0][2]
y[1][1][0] = 1 +x[1][1][0]
y[1][1][1] = 1 +x[1][1][1]
y[1][1][2] = 1 +x[1][1][2]
y[1][2][0] = 1 +x[1][2][0]
y[1][2][1] = 1 +x[1][2][1]
y[1][2][2] = 1 +x[1][2][2]
sum(y) = 18 +x[0][0][0] +x[0][0][1] +x[0][0][2] +x[0][1][0] +x[0][1][1] +x[0][1][2] +x[0][2][0] +x[0][2][1] +x[0][2][2] +x[1][0][0] +x[1][0][1] +x[1][0][2] +x[1][1][0] +x[1][1][1] +x[1][1][2] +x[1][2][0] +x[1][2][1] +x[1][2][2]
vector_sum[0][0] = 3 +x[0][0][0] +x[0][0][1] +x[0][0][2]
vector_sum[0][1] = 3 +x[0][1][0] +x[0][1][1] +x[0][1][2]
vector_sum[0][2] = 3 +x[0][2][0] +x[0][2][1] +x[0][2][2]
vector_sum[1][0] = 3 +x[1][0][0] +x[1][0][1] +x[1][0][2]
vector_sum[1][1] = 3 +x[1][1][0] +x[1][1][1] +x[1][1][2]
vector_sum[1][2] = 3 +x[1][2][0] +x[1][2][1] +x[1][2][2]
明示的なforループを使用しても同じ結果が得られます。
ただし、大規模な配列の場合は qbpp::sum() および qbpp::vector_sum()を使用することを推奨します。これらの関数は内部でマルチスレッドを活用し、計算を高速化するためです。
最終更新日: 2025.12.26