I have similar code.

I think it boils down to the fact that CMUCL does not have  
multidimensional specialized arrays.

Looks like a worthwhile project to me for anybody with time .... :)

Cheers

Marco



On Thursday, Mar 4, 2004, at 09:45 America/New_York, [EMAIL PROTECTED]  
wrote:

> All,
>
> 1.  I frequently have a need to extract a SUB-ARRAY from an ARRAY.
>     In Matlab parlance I would have written something like
>     A(:,1:4:30,:) for a RANK 3 array.
>
> 2.  The code, SUB-ARRAY, works but is woefully slow.
>
>     a.  My attempts at various DECLARE options resulted in no change.
>     b.  My attempts at re-writting the SUB-ARRAY selection code only
>       make things worse by a factor of 5 or more.
>
> 3.  If anyone has some pointers as to what I might try, I'd sure  
> appreciate
>     it.  The details are below.
>
> tnx in advance
>
> mike
>
> ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
> ;;; The basic function is below.  My test case is an
> ;; (ARRAY (COMPLEX SINGLE-FLOAT) (201 360 18))
> ;; (SUB-ARRAY ARRAY :ALL (ISEQ 0 10 359) :ALL) results in
> ;;
> ;;      Consed    |   Calls   |    Secs   | Sec/Call  | Bytes/C.  |  
> Name:
> ;;     
> -----------------------------------------------------------------------
> ;;      1,042,152 |         1 |    50.650 |  50.65000 | 1,042,152 |  
> SUB-ARRAY
> ;;      5,209,984 |   130,248 |     0.810 |   0.00001 |        40 |  
> AREF
> ;;      5,338,584 |         1 |     0.040 |   0.04000 | 5,338,584 |  
> CARTESIAN-PRODUCT
> ;;             80 |         1 |     0.000 |   0.00000 |        80 |  
> TRANSLATE-INDEX-SPECS
> ;;          1,752 |         2 |     0.000 |   0.00000 |       876 |  
> ISEQ
> ;;     
> -------------------------------------------------------------------
> ;;     11,592,552 |   130,253 |    51.500 |           |           |  
> Total
>
>
> (defun sub-array (array &rest index-specs)
>   "
>   SYNTAX
>   ======
>   (SUB-ARRAY ARRAY INDEX0-SPEC INDEX1-SPEC ... )
>
>   INPUT
>   -----
>   ARRAY      An ARRAY of rank N
>   INDEX-SPEC There must be one INDEX-SPEC for each dimension of ARRAY
>              One of the following:
>              (ISEQ START STEP STOP)
>              :ALL    Expands to (ISEQ 0 1 (ARRAY-DIMENSION ARRAY I))
>              :EVEN   Expands to (ISEQ 0 2 (ARRAY-DIMENSION ARRAY I))
>              :ODD    Expands to (ISEQ 1 2 (ARRAY-DIMENSION ARRAY I))
>
>   OUTPUT
>   ------
>   ARRY    A new array made up of the specified entries of ARRAY."
>
>   ;; Idiot check
>   (unless (= (array-rank array) (length index-specs))
>     (error "Insufficient INDEX-SPECIFICATION for given ARRAY."))
>
>   (multiple-value-bind (array-indexes array-dims)
>       (apply #'translate-index-specs array index-specs)
>
>     (let* (
>        (new-array (make-array array-dims
>                               :element-type (array-element-type array)))
>        ;; and create a displaced array
>        (new-array-displaced (make-array (array-total-size new-array)
>                                         :element-type (array-element-type array)
>                                         :displaced-to new-array)))
>
>       ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;                             
>  
>       ;; now populate and return the new-array
>       ;; I FEEL THAT THE PROBLEM HAS TO BE RIGHT HERE
>       ;; I've tried eliminating the APPLY and using
>       ;; ROW-MAJOR-AREF on an array displaced to ARRAY...but no help
>       (dotimes (n (array-total-size new-array) new-array)
>       (setf (aref new-array-displaced n)
>             (apply #'aref array (nth n array-indexes)))))))
>
>
--
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.


Reply via email to