Ocaml函数,从一个矩阵生成一个修改矩阵



我有这个小函数:

let switch matrix =
for i = 0 to Array.length matrix - 1 do
for j = 0 to Array.length (Array.get matrix i) - 1 do
if Array.get (Array.get matrix i) j = false then
Array.set (Array.get matrix i) j true
done
done;;

基本上将矩阵中的所有假值翻转为真值。这不是我真正想要的,这只是为了说明我到目前为止所做的尝试。

问题是这个函数改变了矩阵的值,而不是创建一个矩阵。

我需要它是bool数组数组->Bool array array =

我需要做什么才能有一个这样做的函数

我想到了模式匹配,所以我试过:

let switch matrix =
for i = 0 to Array.length matrix - 1 do
for j = 0 to Array.length (Array.get matrix i) - 1 do
match Array.get (Array.get matrix i) j with true -> true | false -> true
done
done;;

但是这个函数说:他的表达式应该是unit类型的

抱歉,如果这是一个愚蠢的问题,我只是开始与OCaml

编辑:所以,我试了这个:

let switch matrix =
let newMatrix =
Array.make_matrix (Array.length matrix)
(Array.length (Array.get matrix 1))
true
in
let switching matrixes = matrixes.(0).(0) <- false in
switching newMatrix;
newMatrix;;

但是现在,它的类型是数组array ->Bool array array =。但我需要它是bool数组数组->Bool array数组。我该怎么做才能走出困境?

如果你有一个布尔值的矩阵,并且想要将假值翻转为真,那么你总是会得到一个全是真值的矩阵。

这大大简化了你的代码。

let switch matrix =
Array.(
let height = length matrix in
let width  = length matrix.(0) in
make_matrix width height true
)

如果你的目标是将真变为假,假变为真:

let switch matrix =
Array.(
map (map not) matrix
)

编辑后的解决方案很好。您只需要将第一个函数(修改矩阵的函数)应用于您创建的新矩阵。

从第一段代码开始:

let switch matrix = for i = 0 to (Array.length matrix - 1) do 
for j = 0 to ((Array.length (Array.get matrix i ))-1) do
if Array.get (Array.get matrix i) j = false then Array.set (Array.get matrix i) j true
done;
done;

正确格式化并对Array.getArray.set使用.().() <-运算符:

let switch matrix =
for i = 0 to Array.length matrix - 1 do
for j = 0 to Array.length matrix.(i) - 1 do
if not matrix.(i).(j) then matrix.(i).(j) <- true
done
done

if expr = true等价于if expr,if expr = false等价于if not expr

然后在代码的开头创建一个新的矩阵,填充true,根据matrix修改它并返回它,我们得到:
let switch matrix =
let n = Array.length matrix in 
let p = Array.length (matrix.(0)) in
let result = Array.make_matrix n p true in
for i = 0 to n - 1 do
for j = 0 to p - 1 do
if matrix.(i).(j) then result.(i).(j) <- false
done
done;
result

最新更新