将矩阵复制到另一个矩阵 ocaml

时间:2021-05-06 13:13:36

标签: matrix ocaml setvalue

我正在尝试将第一个矩阵的值逐个复制到第二个元素。我不明白为什么当我想设置新值时“<-”对我不起作用。代码如下:

let y=[|[|"true";"true";"false";"false"|];
        [|"true";"false";"true";"false"|];
        [|"false";"false";"true";"true"|];
        [|"false";"true";"false";"true"|]|]
;;

let fill_array = 
  let l=Array.length x in
  for i=0 to l-1 do
    for j=0 to l-1 do
      x.(i).(j)<-(y(i).(j))
    done;
  done;
  x;;

我收到以下错误:此表达式的类型为字符串数组数组 这不是一个函数;它不能被应用。 理想情况下,这将是一个 bool 数组,但我想先尝试使用字符串。

2 个答案:

答案 0 :(得分:2)

你少了一个点。在

x.(i).(j)<- y(i).(j)

y(i) 是一个函数应用程序,而您想要的是 y.(i)

x.(i).(j)<- y.(i).(j)

请注意,对于逐个元素的复制,另一种选择是使用高阶函数而不是低级循环:

let copy x y =
  Array.iteri (fun i xi ->
    Array.iteri (fun j x -> y.(i).(j) <- x) xi
  ) x

答案 1 :(得分:2)

在 OCaml 的说法中,复制意味着创建某物的副本。对于用另一种数据结构填充一种数据结构的内容的过程,我们使用单词 blit。它是特定于 OCaml 的,可能会令人困惑,但很高兴知道它会帮助您浏览 OCaml 文档。知道您搜索的事物的名称总是很好:)

复制

要复制矩阵只需执行 Array.(map copy),例如,

let xs = Array.make 10 10 0 
let ys = Array.(map copy) xs
let () = 
  ys.(0).(0) <- 1;
  assert (xs.(0).(0) = 0)

这里的Array.(map copy)使用的是OCaml的本地开放特性,与Array.map Array.copy相同。 Array.map 函数创建一个新数组,该数组使用提供的函数对原始数组的每个元素进行转换,在我们的示例中为 Array.copy。要复制 3d 矩阵,您可以执行 Array.(map@@map copy) 等。

传输

如果您想将矩阵复制到现有矩阵中,那么最有效的方法是使用 Array.blit,例如,

let blit_matrix ~dst ~src = 
  Array.iteri (fun row dst ->
    Array.blit src.(row) 0 dst 0 (Array.length src.(row))) dst
相关问题