34 lines
1.0 KiB
Clojure
34 lines
1.0 KiB
Clojure
(ns sekai.math.vectors)
|
|
|
|
(defn vecn->m "Convert a vector to an m-element vector." [m v]
|
|
(vec (take m (into v (repeat (- m (count v)) 0)))))
|
|
|
|
(defn components [vecs]
|
|
(vec (map (fn [idx] (map #(nth % idx) vecs))
|
|
(range (count (first vecs))))))
|
|
|
|
(defn comp-reduce [op vecs]
|
|
(vec (map #(reduce op %) (components vecs))))
|
|
|
|
(defn manip-scalar
|
|
"Manipulate Vectors by Scalar and Operation."
|
|
[op s vecs]
|
|
(map #(op % (repeat (count %) s)) vecs))
|
|
|
|
(defn dist "Distance between two Vectors."
|
|
[v1 v2]
|
|
(reduce + (map #(abs (- %1 %2)) v1 v2)))
|
|
|
|
(defn add "Add Vectors." [& vecs] (comp-reduce + vecs))
|
|
(defn sub "Subtract Vectors." [& vecs] (comp-reduce - vecs))
|
|
(defn mult "Multiply Vectors." [& vecs] (comp-reduce * vecs))
|
|
(defn div "Divide Vectors." [& vecs] (comp-reduce / vecs))
|
|
|
|
(defn mult-s "Multiply Vectors by Scalar"
|
|
[s & vecs] (manip-scalar mult s vecs))
|
|
|
|
(defn div-s "Divide Vectors by Scalar"
|
|
[s & vecs] (manip-scalar div s vecs))
|
|
|
|
(defn dot "Dot Product" [& vecs] (reduce + (apply mult vecs)))
|