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

Copying a matrix into another matrix ocaml

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

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;;

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

你漏了一个点。在

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

用 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 函数创建一个新数组,它使用提供的函数对原始数组的每个元素进行 faps,在我们的例子中是 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