let concat_matrices_i ?check mat1 mat2 =
if Array.length mat1.mat_j <> Array.length mat2.mat_j then
raise Uncompatible_matrices;
(
match check with
None -> ()
| Some f -> Array.iteri (fun i v -> f v mat2.mat_j.(i)) mat1.mat_j
);
let len_i1 = Array.length mat1.mat_i in
let len_i2 = Array.length mat2.mat_i in
let len_i = len_i1 + len_i2 in
let len_j = Array.length mat1.mat_j in
let init_v =
if len_j < 1 then
None
else
if len_i1 < 1 then
if len_i2 < 1 then
None
else
Some mat2.mat_mat.(0).(0)
else
Some mat1.mat_mat.(0).(0)
in
let mat =
match init_v with
None -> [| |]
| Some v ->
let mat = Array.make_matrix len_i len_j v in
for i = 0 to len_i1 - 1 do
for j = 0 to len_j - 1 do
mat.(i).(j) <- mat1.mat_mat.(i).(j)
done
done;
for i = 0 to len_i2 - 1 do
for j = 0 to len_j - 1 do
mat.(len_i1 + i).(j) <- mat2.mat_mat.(i).(j)
done
done;
mat
in
{
mat_i = Array.append mat1.mat_i mat2.mat_i ;
mat_j = mat1.mat_j ;
mat_mat = mat;
}