When you pass it directly to c-code, maybe you can completely bypass the
array and convert
matrix -> flarray -> flvector -> cpointer
the last 3 conversions should be blazing fast but i guess that won't
matter much for 16 elements.
Neil, can you nevertheless tell me more about the expected performance of
the first one?
Here is a sample code (it was surprisingly easy to integrate ffi into TR)
Tobias
;; --------------------------
#lang typed/racket/base
(require math)
(require/typed ffi/unsafe
[#:opaque CPointer cpointer?]
[flvector->cpointer (FlVector -> CPointer)]
[#:opaque CType ctype?]
[_double CType]
[ptr-ref (CPointer CType Exact-Nonnegative-Integer -> Any)])
(define dim 4)
(define m (build-matrix dim dim
(lambda: ([i : Integer]
[j : Integer])
(->fl (+ (* i dim) j)))))
(define flv (flarray-data (array->flarray m)))
(define cp (flvector->cpointer flv))
(for/list: : (Listof Any) ([i (flvector-length flv)])
(ptr-ref cp _double i))
On Mon, 21 Jan 2013 20:42:51 +0100, Neil Toronto <neil.toro...@gmail.com>
wrote:
On 01/21/2013 02:48 AM, Pierpaolo Bernardi wrote:
Hello,
what's the most convenient way to convert between math/matrices and
FFI/arrays?
To reduce the scope of the question, at the moment I'm only interested
in conversions from and to the following FFI types:
(_array _double 3 3)
(_array _double 3)
(_array _double 2 3)
From the FFI docs, it looks like you need to construct either:
1. A vector of vectors for foreign functions that accept an
(_array/vector type m n).
2. A flat vector with elements in row-major order for foreign functions
that accept an (_array type m n) or (_array type m).
For #1, use `matrix->vector*', and for #2, use `matrix->vector'. I don't
know whether you can pass the vectors returned from these functions
directly to foreign functions. I wouldn't be surprised.
If you're working in Typed Racket and you need this to be fast, do the
conversions to and from vectors in Typed Racket. Currently, passing
matrices across the contract boundary makes element access very slow. :/
Neil ⊥
____________________
Racket Users list:
http://lists.racket-lang.org/users
____________________
Racket Users list:
http://lists.racket-lang.org/users