Ocaml <> Matlab interface
 Jan Kybic
[
Home
]
[ Index:
by date

by threads
]
[ Message by date: previous  next ] [ Message in thread: previous  next ] [ Thread: previous  next ]
[ Message by date: previous  next ] [ Message in thread: previous  next ] [ Thread: previous  next ]
Date:  20090204 (12:41) 
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. Yours, Jan Kybic   Jan Kybic <kybic@fel.cvut.cz> tel. +420 2 2435 5721 http://cmp.felk.cvut.cz/~kybic ICQ 200569450 To get an array from Matlab: let speed_f = match Mex.mxGetData speedm with  Mex.FLOAT32 s > ( try 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.{i1,j1} ; done ; done ; Mex.mxSetData r (Mex.FLOAT64 (genarray_of_array2 a)) ; r