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