Skip to content

Instantly share code, notes, and snippets.

@sritchie
Created April 27, 2011 19:34
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save sritchie/945001 to your computer and use it in GitHub Desktop.
Save sritchie/945001 to your computer and use it in GitHub Desktop.
(defn sparse-vector
"Takes in a sequence of 2-tuples of the form `<idx, val>` and
generates a sparse vector with each `val` inserted at its
corresponding `idx`. Missing values will be set to the supplied
placeholder."
([size placeholder tuples]
(sparse-vector 0 size placeholder tuples))
([offset size placeholder tuples]
(loop [idx 0
tup-seq tuples
v (transient [])]
(let [[pos val] (first tup-seq)]
(cond (>= idx size) (persistent! v)
(= idx pos) (recur (inc idx) (rest tup-seq) (conj! v val))
:else (recur (inc idx) tup-seq (conj! v placeholder)))))))
(sparse-vector 0 10 0 [[4 1]])
;=> [0 0 0 0 1 0 0 0 0 0]
(defn sparse-vector
"Takes in a sequence of 2-tuples of the form `<idx, val>` and
generates a sparse vector with each `val` inserted at its
corresponding `idx`. Missing values will be set to the supplied
placeholder."
([size placeholder tuples]
(sparse-vector 0 size placeholder tuples))
([offset size placeholder tuples]
(loop [idx 0
tup-seq tuples
v (transient [])]
(let [[pos val] (first tup-seq)
p (- pos offset)]
(cond (>= idx size) (persistent! v)
(= idx pos) (recur (inc idx) (rest tup-seq) (conj! v val))
:else (recur (inc idx) tup-seq (conj! v placeholder)))))))
(sparse-vector 0 10 0 [[4 1]])
No message.
[Thrown class java.lang.NullPointerException]
Restarts:
0: [QUIT] Quit to the SLIME top level
Backtrace:
0: clojure.lang.Numbers.ops(Numbers.java:1364)
1: clojure.lang.Numbers.minus(Numbers.java:128)
2: forma.matrix.utils$sparse_vector.invoke(NO_SOURCE_FILE:1)
3: forma.matrix.utils$eval7239.invoke(NO_SOURCE_FILE:1)
4: clojure.lang.Compiler.eval(Compiler.java:5424)
5: clojure.lang.Compiler.eval(Compiler.java:5391)
6: clojure.core$eval.invoke(core.clj:2382)
7: swank.core$eval922$fn__923.invoke(core.clj:409)
8: clojure.lang.MultiFn.invoke(MultiFn.java:163)
9: swank.commands.basic$eval_region.invoke(basic.clj:48)
10: swank.commands.basic$eval_region.invoke(basic.clj:38)
11: swank.commands.basic$eval1223$listener_eval__1224.invoke(basic.clj:72)
12: clojure.lang.Var.invoke(Var.java:365)
13: forma.matrix.utils$eval7237.invoke(NO_SOURCE_FILE)
14: clojure.lang.Compiler.eval(Compiler.java:5424)
15: clojure.lang.Compiler.eval(Compiler.java:5391)
16: clojure.core$eval.invoke(core.clj:2382)
17: swank.core$eval_in_emacs_package.invoke(core.clj:94)
18: swank.core$eval_for_emacs.invoke(core.clj:241)
19: clojure.lang.Var.invoke(Var.java:373)
20: clojure.lang.AFn.applyToHelper(AFn.java:169)
21: clojure.lang.Var.applyTo(Var.java:482)
22: clojure.core$apply.invoke(core.clj:540)
23: swank.core$eval_from_control.invoke(core.clj:101)
24: swank.core$eval_loop.invoke(core.clj:106)
25: swank.core$spawn_repl_thread$fn__881$fn__882.invoke(core.clj:320)
26: clojure.lang.AFn.applyToHelper(AFn.java:159)
27: clojure.lang.AFn.applyTo(AFn.java:151)
28: clojure.core$apply.invoke(core.clj:540)
29: swank.core$spawn_repl_thread$fn__881.doInvoke(core.clj:317)
30: clojure.lang.RestFn.invoke(RestFn.java:398)
31: clojure.lang.AFn.run(AFn.java:24)
32: java.lang.Thread.run(Thread.java:680)
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment