我目前正在尝试使用函数来创建:
0 V12 V13 V14
V21 0 V23 V24
V31 V32 0 V34
V41 V42 V43 0
我发现这样做的方法是使用这些方程式:
(2*V1 - 1)*(2*V2-1) = for spot V(1,2) in the Matrix
(2*V1 - 1)*(2*V3-1) = for spot V(1,3) in the Matrix
etc
到目前为止,我有:
let singleState state =
if state = 0.0 then 0.0
else
((2.0 *. state) -. 1.0);;
let rec matrixState v =
match v with
| [] -> []
| hd :: [] -> v
| hd :: (nx :: _ as tl) ->
singleState hd *. singleState nx :: matrixState tl;;
我的结果是:
float list = [-3.; -3.; -3.; -1.]
当它们应该是列表的列表,如下所示:
0 -1 1 -1
-1 0 -1 1
1 -1 0 -1
-1 1 -1 0
因此,它不是制作列表列表,而是制作一个列表。我也很难弄清楚如何制作对角线0。
签名应如下所示:
val singleState : float list -> float list list = <fun>
val matrixState : float list list -> float list list = <fun>
我正在
val singleState : float -> float = <fun>
val matrixState : float list -> float list = <fun>
有什么想法吗?
答案 0 :(得分:0)
通过一些修复,你的函数会产生一行结果。然后你可以为你需要的每一行调用一次。重复呼叫的好方法可能是List.map
。
假设这主要是一个学习练习,首先制作这样的矩阵可能会很好:
V11 V12 V13 V14
V21 V22 V23 V24
V31 V32 V33 V34
V41 V42 V43 V44
我认为这将更容易计算。
然后你可以用零替换对角线。这里有一些代替对角线的代码:
let replnth r n l =
List.mapi (fun i x -> if i = n then r else x) l
let zerorow row (n, res) =
(n - 1, replnth 0.0 n row :: res)
let zerodiag m =
let (_, res) = List.fold_right zerorow m (List.length m - 1, []) in
res
答案 1 :(得分:0)
我更愿意使用数组来完成你的工作。
然后使用一个很好的函数Array.init
,就像这样,
# Array.init 5 (fun x -> x);;
- : int array = [|0; 1; 2; 3; 4|]
我们注意到 5 扮演我们数组大小的角色。
但是你想要一个矩阵,我们需要构建一个数组Array,它是通过两个Array.init
调用实现的,最后一个嵌套到第一个,
# Array.init 3 (fun row -> Array.init 3 (fun col -> row+col));;
- : int array array = [|[|0; 1; 2|]; [|1; 2; 3|]; [|2; 3; 4|]|]
注意,我调用了我的变量行和 col 来表示它们对应于矩阵的行索引和列索引。
最后,由于您的公式使用参考 V 保持值 [| V1; V2; V3; V4 |] ,我们需要创建一个并合并调用将它添加到我们的矩阵构建器中,(像tab
}
tab.(n-1)
的单元格n上的值hold
最终引导我们进入工作实例,
let vect = [|1;2;3;4|]
let built_matrix =
Array.init 4 (fun row ->
Array.init 4 (fun col ->
if col=row then 0
else vect.(row)+vect.(col)))
当然,为了根据您的要求匹配这段代码,您必须根据自己的方便进行调整。
关于语法的附注,
每次重复数组都可以避免使用OCaml的一些不错的功能
我们可以在本地打开这样的模块,
let built_matrix =
let open Array in
init 4 (fun row ->
init 4 (fun col ->
if col=row then 0
else vect.(row)+vect.(col)))
更短,let open Array in ...
可以写成Array.(...)
,在优秀的 utop 下解释的代码块下面来说明它(我将利用这个机会将矩阵转换为列表列表。)
utop #
Array.(
to_list
@@ map to_list
@@ init 4 (fun r ->
init 4 (fun c ->
if r = c then 0
else vect.(r)+ vect.(c))))
;;
- : int list list = [[0; 3; 4; 5]; [3; 0; 5; 6]; [4; 5; 0; 7]; [5; 6; 7; 0]]
我希望它有所帮助