连接 2 个数组 minizinc
Concatenate 2 Arrays minizinc
下面我有 2 个二维数组(A-2 行 x 3 列,B-2 行 x 1 列)
A=[|1,2,3 B=[|1
|4,5,6|] |1|]
我需要连接这 2 个数组并制作一个如下所示的新数组 C(2 行和 4 列)
C=[|1,2,3,1
|4,5,6,1|]
PS:我知道添加新的 row.But 添加列似乎有所不同。
你能帮我使用数组 a 和 b 的连接生成数组 c 吗?
列连接肯定比使用行提供更多的挑战。
MiniZinc 目前不包含任何好的转置或压缩功能,通常可以让您相对轻松地编写此功能。相反,我们必须编写一个递归函数,一次连接一行,然后附加剩余的行:
array[int, int] of int: A=[|1,2,3|4,5,6|];
array[int, int] of int: B=[|1|1|];
function array[int] of int: concat_row_elements(array[int, int] of int: X, array[int, int] of int: Y, int: start) =
if start in index_set_1of2(X) then
row(X, start) ++ row(Y, start) ++ concat_row_elements(X, Y, start+1)
else
[]
endif;
function array[int, int] of int: concat_rows(array[int, int] of int: X, array[int, int] of int: Y) =
let {
constraint assert(index_set_1of2(X) == index_set_1of2(Y), "Concatenation of rows can only occur if they have the same number of rows");
} in array2d(
index_set_1of2(X),
1..card(index_set_2of2(X)) + card(index_set_2of2(Y)),
concat_row_elements(X, Y, min(index_set_1of2(X)))
);
array[int, int] of int: C ::add_to_output = concat_rows(A, B);
此函数将给出预期的输出:C = array2d(1..2, 1..4, [1, 2, 3, 1, 4, 5, 6, 1]);
下面我有 2 个二维数组(A-2 行 x 3 列,B-2 行 x 1 列)
A=[|1,2,3 B=[|1
|4,5,6|] |1|]
我需要连接这 2 个数组并制作一个如下所示的新数组 C(2 行和 4 列)
C=[|1,2,3,1
|4,5,6,1|]
PS:我知道添加新的 row.But 添加列似乎有所不同。 你能帮我使用数组 a 和 b 的连接生成数组 c 吗?
列连接肯定比使用行提供更多的挑战。 MiniZinc 目前不包含任何好的转置或压缩功能,通常可以让您相对轻松地编写此功能。相反,我们必须编写一个递归函数,一次连接一行,然后附加剩余的行:
array[int, int] of int: A=[|1,2,3|4,5,6|];
array[int, int] of int: B=[|1|1|];
function array[int] of int: concat_row_elements(array[int, int] of int: X, array[int, int] of int: Y, int: start) =
if start in index_set_1of2(X) then
row(X, start) ++ row(Y, start) ++ concat_row_elements(X, Y, start+1)
else
[]
endif;
function array[int, int] of int: concat_rows(array[int, int] of int: X, array[int, int] of int: Y) =
let {
constraint assert(index_set_1of2(X) == index_set_1of2(Y), "Concatenation of rows can only occur if they have the same number of rows");
} in array2d(
index_set_1of2(X),
1..card(index_set_2of2(X)) + card(index_set_2of2(Y)),
concat_row_elements(X, Y, min(index_set_1of2(X)))
);
array[int, int] of int: C ::add_to_output = concat_rows(A, B);
此函数将给出预期的输出:C = array2d(1..2, 1..4, [1, 2, 3, 1, 4, 5, 6, 1]);