问题描述
我正在尝试将第一个矩阵的值逐个复制到第二个元素。我不明白为什么当我想设置新值时“
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 数组,但我想先尝试使用字符串。
解决方法
你少了一个点。在
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
函数创建一个新数组,该数组使用提供的函数对原始数组的每个元素进行转换,在我们的示例中为 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