连接 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]);