* Ocaml <-> Matlab interface
@ 2009-02-04 12:41 Jan Kybic
2009-02-05 14:48 ` [Caml-list] " Maurice Bremond
0 siblings, 1 reply; 2+ messages in thread
From: Jan Kybic @ 2009-02-04 12:41 UTC (permalink / raw)
To: caml-list
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.{i-1,j-1} ;
done ;
done ;
Mex.mxSetData r (Mex.FLOAT64 (genarray_of_array2 a)) ;
r
^ permalink raw reply [flat|nested] 2+ messages in thread
* Re: [Caml-list] Ocaml <-> Matlab interface
2009-02-04 12:41 Ocaml <-> Matlab interface Jan Kybic
@ 2009-02-05 14:48 ` Maurice Bremond
0 siblings, 0 replies; 2+ messages in thread
From: Maurice Bremond @ 2009-02-05 14:48 UTC (permalink / raw)
To: Jan Kybic; +Cc: caml-list
Hello,
>I am posting below the relevant excerpts
>from my code in case somebody can spot the problem.
Unfortunately, if I try one of the two tests (*1*) and (*2*) below, I
cannot reproduce your segfault (ocamlmex 2.1.0 and my Matlab version
is 7.7.0.471 (R2008b))
What you can do is :
- run these two tests
(simply replace example/camlp5o/hello.ml by each of them)
for (*1*) at the Matlab prompt :
>> for i = 1:10000; hello(hello(hello(hello(single([1:1000,1:1000])))));end
(the goal is to trigger the caml gc several times without calling
it explicitly)
(*2*) :
>> for i = 1:1000; hello; end
- if you have not already ran the test suite :
make test
and at Matlab prompt :
>> cd <ocamlmexdir>/test
>> api('check')
Everything should be ok.
- put some Gc.full_major() in your MEX-files to see if a crash occurs
(it should not!).
Other hints :
- if you use Matlab callbacks (Mex.mexCallMATLAB) you can have some
segmentation violations if you call Matlab function with a wrong
number of arguments (I think this is a Matlab problem that cannot
be prevented) see (*3*)
- any interruption during Mex.mexCallMATLAB may be fatal to the
Matlab session.
- if you do not use specific Matlab callbacks, maybe have a try with
Octave (>=3.0) (./configure BASE=OCTAVE; make ; make install)
- I had segv problems with an old version of Matlab (<= ~R2006x).
Please, mail me directly about this (there is no ocamlmex user list)
and if you can, send me a full segv example.
>Matlab and Ocaml run as separate processes and communicate using Unix
>named pipes (created using mkfifo)
This sounds like the Matlab engine api :
http://www.mathworks.com/access/helpdesk/help/techdoc/index.html?/access/helpdesk/help/techdoc/matlab_external/f29148.html
A limited binding to the Matlab engine api is in ocamlmex, under
src/eng. It has not really been tested and maybe it can be improved.
Maurice Bremond
Examples:
(*1*)
open Bigarray
let _ =
Mex.mexRegister (function
| a when Array.length(a) > 1 || Array.length(a) = 0 -> [| |]
| a -> let speedm = a.(0) in
match Mex.mxGetData speedm with
| Mex.FLOAT32 s ->
(try
let x = array2_of_genarray s in
let dims = Mex.mxGetDimensions speedm in
let r = Mex.mxCreateNumericArray [| dims.(0) ; dims.(1) |]
Mex.SINGLE_CLASS Mex.REAL in
Mex.mxSetData r (Mex.FLOAT32 s);
[| r |]
with Invalid_argument _ ->
failwith "Input is not a 2D array.")
| _ -> failwith "Input is not float32 (class single).")
(*2*)
open Bigarray
let _ =
Mex.mexRegister (function
| [| |] ->
let n,m = 1000,1000 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} <- float_of_int (i+j) ;
done ;
done ;
Mex.mxSetData r (Mex.FLOAT64 (genarray_of_array2 a)) ;
[| r |]
| _ -> failwith "bad args")
(*3*)
(* segmentation violation *)
let _ =
mexRegister
(function
[| a; b; c |] ->
mexCallMATLAB 3 [| (mexCallMATLAB 4 [| a; |] "plus").(0); c |]
"mtimes"
| _ -> raise (Failure "bad args"))
^ permalink raw reply [flat|nested] 2+ messages in thread
end of thread, other threads:[~2009-02-05 14:49 UTC | newest]
Thread overview: 2+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2009-02-04 12:41 Ocaml <-> Matlab interface Jan Kybic
2009-02-05 14:48 ` [Caml-list] " Maurice Bremond
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox