Version française
Home     About     Download     Resources     Contact us    
Browse thread
Ocaml <-> Matlab interface
[ Home ] [ Index: by date | by threads ]
[ Search: ]

[ Message by date: previous | next ] [ Message in thread: previous | next ] [ Thread: previous | next ]
Date: -- (:)
From: Jan Kybic <kybic@f...>
Subject: Ocaml <-> Matlab interface
Good afternoon,
                I was using Ocamlmex (by Maurice Bremond)
for interfacing between Matlab and Ocaml. This interface is very
elegant, nice to work with and very complete. Unfortunately, I was
getting quite frequent "segmentation faults" from Matlab when trying
to pass matrices there and back. Probably some issues with memory
management between Ocaml and Matlab. I am posting below the relevant excerpts
from my code in case somebody can spot the problem.

Anyway, I have created an alternative Ocaml<->Matlab interface. Matlab
and Ocaml run as separate processes and communicate using Unix named
pipes (created using mkfifo). This is slower and less complete than
Ocamlmex solution but it is nevertheless usable and also quite stable
(no segfaults). The code is very 'alpha' at the moment but if somebody
is interested in using or improving it, just send me an email. I plan
to release the source code when it matures a little.


Jan Kybic

Jan Kybic <>                       tel. +420 2 2435 5721                      ICQ 200569450

To get an array from Matlab:

  let speed_f = match Mex.mxGetData speedm with
        | Mex.FLOAT32 s -> (
              array2_of_genarray s
            with Invalid_argument _ ->
              failwith "Input is not a 2D array." )
        | _ ->  failwith "Input is not float32 (class single)." in

To pass an array to Matlab:

let mxArray_of_floatarray f =
  let n,m = (Array2.dim1 f, Array2.dim2 f) in
  let r = Mex.mxCreateNumericArray [| n ; m |] Mex.DOUBLE_CLASS Mex.REAL in
  let a = Array2.create float64 fortran_layout n m in
  for j = 1 to m do
   for i = 1 to n do
     a.{i,j} <- f.{i-1,j-1} ;
   done ;
 done ;
 Mex.mxSetData r (Mex.FLOAT64 (genarray_of_array2 a)) ;