2 ;V Basic vector/tuple operations, V
3 ;V they behave like the normal V
4 ;V lisp math functions. V
6 (defun tuple-addn (&rest vecs
)
7 (apply #'mapcar
#'+ vecs
))
9 (defun tuple-n2addn (u v
)
10 (do ((u-rem u
(cdr u-rem
))
11 (v-rem v
(cdr v-rem
)))
12 ((or (not u-rem
) (not v-rem
)) u
)
13 (incf (car u-rem
) (car v-rem
))))
15 (defun tuple-subtrn (&rest vecs
)
16 (apply #'mapcar
#'- vecs
))
18 ;V Take 2 vectors and destructively V
19 ;V modify /u/ to reflect its V
20 ;V difference with vector /v/ V
21 (defun tuple-n2subtrn (u v
)
22 (do ((u-rem u
(cdr u-rem
))
23 (v-rem v
(cdr v-rem
)))
24 ((or (not u-rem
) (not v-rem
)) u
)
25 (decf (car u-rem
) (car v-rem
))))
27 (defun scalar-tuple-multn (k u
)
28 (mapcar (lambda (ui) (* k ui
)) u
))
30 (defun tuple-scalar-divisn (u k
)
31 "The vector /u/ divided by scalar /k/"
33 (mapcar (lambda (ui) (/ ui k
)) u
)))
35 ;V Exact same as above function but V
36 ;V destructively modifies vector /u/.V
37 (defun tuple-scalar-ndivisn (u k
)
39 (do ((tail u
(cdr tail
)))
41 (rplaca tail
(/ (car tail
) k
)))))
43 (defun tuple-magnitude (u)
44 "Find the magnitude of a vector /u/"
46 ;V Sum the squares of the vector's elements.V
47 (mapc (lambda (ui) (incf s
(expt ui
2))) u
)
48 (sqrt s
)));-> Return the sum's square root.
50 ;V Euclidean inner product.V
56 ;V Quick cross product, all elems V
57 ;V passed individually for speed. V
58 (defun qcross3 (a b c d e f
)
63 (defun tuple-cross3 (a b
)
65 #'qcross3
(values-list a
)
68 ;V Projection of u onto v.V
69 (defun tuple-proj (u v
)
70 (declare (inline dot-prod
))
76 ;V Orthojection - orthogonal component V
77 ;V to the projection of u onto v. V
78 (defun tuple-orth (u v
)
79 (tuple-subtrn u
(tuple-proj u v
)))