On Dec 8, 2004, at 7:43 AM, Raymond Toy wrote:
>>>>>> "rif" == rif <ri...@MI...> writes:
>
> rif> Is there any way, in CMUCL, using some implementation-specific
> rif> construct, to create an "aliased array"? Suppose I create a
> rif> double-float array of size 10:
>
> rif> (make-array 10 :element-type 'double-float)
>
> rif> I know I can take it's address, with #'system:vector-sap.
>
> rif> What I want to do is manipulate that address and somehow
> "invert"
> rif> vector-sap to create a new double-float array whose first
> element is
> rif> (for example) the third element of the original array.
>
> rif> I need this because I need to pass matlisp a subset of an
> array. More
> rif> specifically, I want to allocate an n by n+1 array, so that I
> can
> rif> store half of each of two n by n symmetric arrays in n(n+1)
> space
> rif> rather than 2n^2 space. This is a common technique for using
> rif> BLAS/LAPACK, but to get at it, I need to be able to give a
> Fortran
> rif> matlisp routine a way to get at the square n by n matrix that
> "starts
> rif> with the second column" of the n by n+1 matrix, and the way
> the
> rif> interface is defined, it wants actual arrays, not pointers.
> If I can
> rif> somehow create the appropriate array, I don't have to go
> mucking about
> rif> in the internals of matlisp's def-fortran-routine and so
> forth.
>
> Marc has already mentioned displaced arrays. This should work, but
> depends on what you are really trying to do.
Not necessarily. Displaced arrays are good for row-major slices. So
if the matrix where (N + 1 x N), then you could "displace away" the
first row. Unfortunately, FORTRAN is column-major. The only way I see
around this is to transpose the array first, and then displace.
However, that may cause problems for the algorithm at hand.
Isn't this fun? :)
Cheers
--
Marco Antoniotti http://bioinformatics.nyu.edu
NYU Courant Bioinformatics Group tel. +1 - 212 - 998 3488
715 Broadway 10th FL fax. +1 - 212 - 998 3484
New York, NY, 10003, U.S.A.
|