From: Jefferson P. <jp...@cs...> - 2002-06-25 08:41:28
|
Raymond Toy wrote: >>>>>>"Jefferson" == Jefferson Provost <jp...@cs...> writes: >>>>> > > Jefferson> I'm not sure. The short answer is that I would love to have it better > Jefferson> optmized, but if it's not a priority for you guys, I understand. > > If you can, please try the CVS version. I've put in an optimized > version that should run as fast as a Fortran version should (on > CMUCL). > > I'd be interested to know if it's fast enough for you. Yes it's quite fast. Multiplying two NxN matrices is still a little slower than the outer product of two N-length vectors (which should also be O(N^2) operations) -- but this is probably from going out of cache on the large matrices, while the smaller vectors will stay in cache. As I mentioned before, I had changed my code so I didn't need to call M.* as often, but that was a sub-optimal solution. But, I realized that my main use of M.* was to "mask" a matrix, i.e. set a bunch of elements to 0.0 using another matrix as a guide: (m.*! mask x). So I wrote a special function just to do that masking. It's MUCH faster, since it does no multiplication at all... (defmethod mmask! ((a real-matrix) (mask real-matrix)) (let* ((nxm (number-of-elements a)) (aa (store a)) (bb (store mask))) (declare (type fixnum nxm) (type (real-matrix-store-type (*)) aa bb) (optimize (speed 3) (safety 0))) (dotimes (k nxm a) (declare (type fixnum k)) (let ((b-val (aref bb k)) ) (declare (type real-matrix-element-type b-val) (:explain :calls :types :boxing)) (when (zerop b-val) (setf (aref aa k) 0.0d0)))))) J. |