Advertisement
Guest User

Untitled

a guest
Feb 7th, 2018
174
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 1.37 KB | None | 0 0
  1. (defmethod mult ((m1 matrix-r) (m2 matrix-r))
  2. (if (not (= (number-of-cols m1) (number-of-rows m2)))
  3. (error "Can't perform matrix multiplication")
  4. (let* ((elements-m1 (elements m1)) (elements-m2 (elements m2))
  5. (n (number-of-cols m1))
  6. (n-rows (number-of-rows m1))
  7. (n-cols (number-of-cols m2))
  8. (m (make-instance 'matrix-r :number-of-rows n-rows :number-of-cols n-cols))
  9. (elements-m (elements m))
  10. (width (lane-width m1))
  11. (r-lane (make-array width :element-type 'double-float))
  12. (c-lane (make-array width :element-type 'double-float))
  13. (sum 0.0d0))
  14. (declare
  15. (type fixnum n-rows n-cols n width)
  16. (type (simple-vector) elements-m1 elements-m2 elements-m)
  17. (type (simple-array double-float (4)) r-lane c-lane)
  18. (type double-float sum)
  19. (optimize (debug 0) (safety 0) (speed 3)))
  20. (loop for i fixnum from 0 below n-rows do
  21. (loop for j fixnum from 0 below n-cols do
  22. (setf sum 0.0d0)
  23. (loop for k fixnum from 0 below (number-of-lanes m1) do
  24. (setf r-lane (aref elements-m1 k))
  25. (setf c-lane (aref elements-m2 k))
  26. (loop for l fixnum below 4 do
  27. ;;(incf sum (* (aref elements-m1 (+ k (the fixnum (* i n))))
  28. ;;(aref elements-m2 (+ j (the fixnum (* k n)))))))
  29. (incf sum (* (aref r-lane l) (aref c-lane l)))))
  30. (setf (aref (aref elements-m 0) 0) sum)))
  31. m)))
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement