From: Nicolas N. <Nic...@iw...> - 2005-12-05 13:44:22
|
Jan Rychter <ja...@ry...> writes: > Is there a way to efficiently operate on matrix columns and/or rows? I > often need to extract a column (or a row) and do operations on it, > sometimes storing it right back. Probably, the easiest way for you to go is to call the BLAS routine DCOPY (or similar) with suitable parameters: MATLISP(9): (apropos "dcopy") BLAS::FORTRAN-DCOPY [function] (N DX INCX DY ...) DCOPY [function] (N DX INCX DY ...) If you want generic functions working on every matlisp matrix, you will probably have to write a suitable set of functions yourself. In my app Femlisp (which contains a part written in CL giving basic matlisp functionality) I have written (generic) functions minject ((x standard-matrix) (y standard-matrix) row-off col-off) injecting x into y, and mextract ((x standard-matrix) (y standard-matrix) row-off col-off) extracting y from x. Yours, Nicolas. P.S: Timings: APPLICATION> (time (let ((A (eye 1000)) (x (zeros 1000 1))) (loop repeat 1000 do (mextract A x 0 5)))) ; cpu time (non-gc) 50 msec user, 0 msec system ; cpu time (gc) 10 msec user, 0 msec system ; cpu time (total) 60 msec user, 0 msec system ; real time 54 msec ; space allocation: ; 18,218 cons cells, 8,026,592 other bytes, 0 static bytes NIL compared with: MATLISP(11): (time (let ((a (eye 1000))) (loop repeat 1000 do (extract-column a 5)))) ; cpu time (non-gc) 1,580 msec user, 0 msec system ; cpu time (gc) 90 msec user, 0 msec system ; cpu time (total) 1,670 msec user, 0 msec system ; real time 1,675 msec ; space allocation: ; 1,292,128 cons cells, 41,409,488 other bytes, 0 static bytes NIL |