Matrix 无法在ocaml中保存数组值

Matrix 无法在ocaml中保存数组值,matrix,ocaml,matrix-multiplication,Matrix,Ocaml,Matrix Multiplication,我正在写一个简单的程序来计算 正确的结果应该是: 如您所见,单个值是正确的,但我无法将它们保存在矩阵中。你有什么想法吗 这是在utop中执行的代码和一些测试,没有使用其他库(既没有核心也没有电池): (*3x3矩阵*) 设矩阵=[| [| 1; 2; 3|]; [| 4; 5; 6|]; [| 7; 8; 9|] |];; (*返回[i][j]位置*处矩阵的单元格) 让我们获取单元(矩阵:int数组)(行:int)(列:int):int= Array.get(Array.get矩阵行)列

我正在写一个简单的程序来计算

正确的结果应该是: 如您所见,单个值是正确的,但我无法将它们保存在矩阵中。你有什么想法吗

这是在
utop
中执行的代码和一些测试,没有使用其他库(既没有核心也没有电池):

(*3x3矩阵*)
设矩阵=[|
[| 1; 2; 3|]; 
[| 4; 5; 6|]; 
[| 7; 8; 9|] 
|];;
(*返回[i][j]位置*处矩阵的单元格)
让我们获取单元(矩阵:int数组)(行:int)(列:int):int=
Array.get(Array.get矩阵行)列
;;
(*返回第n行*)
让我们获取_行(矩阵:int数组)(n:int):int数组=
获取矩阵n
;;
(*返回矩阵*的第n列)
让我们获取_col(矩阵:int数组)(n:int):int数组=
Array.map(趣味行->Array.get行n)矩阵
;;
(*返回矩阵的行数*)
让get_num_rows矩阵=
数组长度矩阵
;;
(*返回矩阵的列数*)
让我们得到\u num\u cols矩阵=
Array.length(Array.get矩阵0)
;;
(*创建NxM矩阵*)
让我们创建矩阵行cols=
Array.make行(Array.make列0)
;;
(*将行和列的每个位置相乘,然后将它们相加*)
让和(行:int数组)(列:int数组):int=
Array.fold_左(+)0(Array.map2(*)行列)
;;
(*矩阵乘法*)
让每列相乘(m1:int数组)(m2:int数组)=
(*创建矩阵*)
设nrows=get_num_行m1 in
设ncols=get_num_rows m2 in
让矩阵=创建矩阵nrows ncols in
(*评价*)
对于i=0至nrows-1 do
对于j=0至ncols-1 do
设值=求和列列(取列m1 i)(取列m2 j)in
Printf.Printf“%i,%i->%i”i j值;
矩阵(i)。(j)int->int->int=
val get_行:整数数组->整数->整数数组=
val get_col:int array array->int->int array=
val get_num_rows:'a array->int=
val get_num_cols:'a array array->int=
val创建_矩阵:int->int->int数组=
val sum\行\列:整数数组->整数数组->整数=
val乘行每列:
整数数组->整数数组->整数数组=
─( 14:54:52 )─< 命令42>─────────────────────────────────────────────────────────────────────────────{计数器:0}─
utop#获取单元矩阵0;;
-:int=1
─( 14:55:12 )─< 命令43>─────────────────────────────────────────────────────────────────────────────{counter:0}─
utop#获取单元矩阵2;;
-:int=9
─( 14:56:52 )─< 命令45>─────────────────────────────────────────────────────────────────────────────{计数器:0}─
utop#获取行矩阵1;;
-:int数组=[| 4;5;6 |]
─( 14:57:02 )─< 命令46>─────────────────────────────────────────────────────────────────────────────{计数器:0}─
utop#获取列矩阵1;;
-:int数组=[| 2;5;8 |]
─( 14:57:08 )─< 命令47>─────────────────────────────────────────────────────────────────────────────{计数器:0}─
utop#创建矩阵3;;
-:int数组=[|[| 0;0;0 |]];[|0;0;0 |]];[|0;0;0 |]]
─( 14:57:19 )─< 命令48>─────────────────────────────────────────────────────────────────────────────{计数器:0}─
utop#sum#u row|col[| 1;2;3 |][| 1;2;3 |];;
-:int=14
─( 14:57:31 )─< 命令49>─────────────────────────────────────────────────────────────────────────────{计数器:0}─
utop#sum#u row|col[| 1;2;3 |][| 1;4;7 |];;
-:int=30
─( 14:57:51 )─< 命令50>─────────────────────────────────────────────────────────────────────────────{计数器:0}─
utop#每列矩阵乘行#;;
0,0 -> 30   30
0,1 -> 36   36
0,2 -> 42   42
1,0 -> 66   66
1,1 -> 81   81
1,2 -> 96   96
2,0 -> 102   102
2,1 -> 126   126
2,2 -> 150   150
-:int数组=
[|[|102; 126; 150|]; [|102; 126; 150|]; [|102; 126; 150|]|]
*)

问题出在您的
创建矩阵
功能中。它当前所做的是创建一个数组,并对每一行使用相同的数组。这意味着在
mat.(2)。(2)
中写入与在
mat.(1)。(2)
中写入相同


stdlib中有一个函数用于此目的:
数组。生成矩阵
,使用它

它起作用了!为什么
Array.make len 0
复制元素0,但
Array.make len Array
复制数组的引用而不是实际数组?Ignus:请参阅for
Array.make
,特别是:
如果x是可变的,它将
(* matrix multiplication *)
let multiply_row_per_col (m1 : int array array) (m2 : int array array) = 
    (* create matrix *)
    let nrows = get_num_rows m1 in
    let ncols = get_num_rows m2 in
    let matrix = create_matrix nrows ncols in
    (* evaluation *)
    for i = 0 to nrows - 1 do
        for j = 0 to ncols - 1 do
            let value = sum_row_col (get_row m1 i) (get_col m2 j) in
            Printf.printf "%i,%i -> %i   " i j value;
            matrix.(i).(j) <- value;
            Printf.printf "%i\n" matrix.(i).(j);
        done;
    done;
    (* return value *)
    matrix
;;
utop # matrix;;
- : int array array = [|[|1; 2; 3|]; [|4; 5; 6|]; [|7; 8; 9|]|]
utop # multiply_row_per_col matrix matrix ;;
0,0 -> 30   30
0,1 -> 36   36
0,2 -> 42   42
1,0 -> 66   66
1,1 -> 81   81
1,2 -> 96   96
2,0 -> 102   102
2,1 -> 126   126
2,2 -> 150   150
- : int array array =
[|[|102; 126; 150|]; [|102; 126; 150|]; [|102; 126; 150|]|]
(* 3x3 matrix *)
let matrix = [| 
    [| 1; 2; 3|]; 
    [| 4; 5; 6|]; 
    [| 7; 8; 9|] 
|];;

(* return the cell of the matrix at [i][j] position *)
let get_cell (matrix : int array array) (row : int) (col : int) : int = 
    Array.get (Array.get matrix row) col
;;

(* return the n-th row *)
let get_row (matrix : int array array) (n : int) : int array = 
    Array.get matrix n
;;

(* return the n-th col of the matrix *)
let get_col (matrix : int array array) (n : int) : int array = 
    Array.map (fun row -> Array.get row n) matrix
;;

(* return the number of rows of a matrix *)
let get_num_rows matrix = 
    Array.length matrix
;;

(* return the number of cols of a matrix *)
let get_num_cols matrix = 
    Array.length (Array.get matrix 0)
;;

(* create NxM matrix *)
let create_matrix rows cols = 
    Array.make rows (Array.make cols 0)
;;

(* multiply each position of row and col, then sum all of them *)
let sum_row_col (row : int array) (col : int array) : int =
    Array.fold_left (+) 0 (Array.map2 ( * ) row col)
;;

(* matrix multiplication *)
let multiply_row_per_col (m1 : int array array) (m2 : int array array) = 
    (* create matrix *)
    let nrows = get_num_rows m1 in
    let ncols = get_num_rows m2 in
    let matrix = create_matrix nrows ncols in
    (* evaluation *)
    for i = 0 to nrows - 1 do
        for j = 0 to ncols - 1 do
            let value = sum_row_col (get_row m1 i) (get_col m2 j) in
            Printf.printf "%i,%i -> %i   " i j value;
            matrix.(i).(j) <- value;
            Printf.printf "%i\n" matrix.(i).(j);
        done;
    done;
    (* return value *)
    matrix
;;

(*
    utop # #use "Matrix_multiplication.ml";;
    val matrix : int array array = [|[|1; 2; 3|]; [|4; 5; 6|]; [|7; 8; 9|]|]
    val get_cell : int array array -> int -> int -> int = <fun>
    val get_row : int array array -> int -> int array = <fun>
    val get_col : int array array -> int -> int array = <fun>
    val get_num_rows : 'a array -> int = <fun>
    val get_num_cols : 'a array array -> int = <fun>
    val create_matrix : int -> int -> int array array = <fun>
    val sum_row_col : int array -> int array -> int = <fun>
    val multiply_row_per_col :
      int array array -> int array array -> int array array = <fun>
    ─( 14:54:52 )─< command 42 >─────────────────────────────────────────────────────────────────────────────{ counter: 0 }─
    utop # get_cell matrix 0 0;;
    - : int = 1
    ─( 14:55:12 )─< command 43 >─────────────────────────────────────────────────────────────────────────────{ counter: 0 }─
    utop # get_cell matrix 2 2;;
    - : int = 9
    ─( 14:56:52 )─< command 45 >─────────────────────────────────────────────────────────────────────────────{ counter: 0 }─
    utop # get_row matrix 1;;
    - : int array = [|4; 5; 6|]
    ─( 14:57:02 )─< command 46 >─────────────────────────────────────────────────────────────────────────────{ counter: 0 }─
    utop # get_col matrix 1;;
    - : int array = [|2; 5; 8|]
    ─( 14:57:08 )─< command 47 >─────────────────────────────────────────────────────────────────────────────{ counter: 0 }─
    utop # create_matrix 3 3;;
    - : int array array = [|[|0; 0; 0|]; [|0; 0; 0|]; [|0; 0; 0|]|]
    ─( 14:57:19 )─< command 48 >─────────────────────────────────────────────────────────────────────────────{ counter: 0 }─
    utop # sum_row_col [|1;2;3|] [|1;2;3|] ;;
    - : int = 14
    ─( 14:57:31 )─< command 49 >─────────────────────────────────────────────────────────────────────────────{ counter: 0 }─
    utop # sum_row_col [|1;2;3|] [|1;4;7|] ;;
    - : int = 30
    ─( 14:57:51 )─< command 50 >─────────────────────────────────────────────────────────────────────────────{ counter: 0 }─
    utop # multiply_row_per_col matrix matrix ;;
    0,0 -> 30   30
    0,1 -> 36   36
    0,2 -> 42   42
    1,0 -> 66   66
    1,1 -> 81   81
    1,2 -> 96   96
    2,0 -> 102   102
    2,1 -> 126   126
    2,2 -> 150   150
    - : int array array =
    [|[|102; 126; 150|]; [|102; 126; 150|]; [|102; 126; 150|]|]
*)