在clojure中人烟稀少的多维向量?

sto*_*age 4 clojure

我正试图在Clojure中创建一个人口稀少的多维向量,但我正在反对我的知识极限.

我有一个集合x,我遍历,我想创建一个大小的多维向量(count x)(count x).大多数单元格都是空的,但在x和y轴匹配的每个点(例如,(1 1),(2 2),(3 3)等),我需要运行一个函数来查看是否应该在该空间中放置一个值.

在程序语言中,它将是这样的:

for (i = 0; i < length(x); i++) {
    for (j = 0; j < length(x); j++) {
        if (i == j && testReturnsTrue(x[i])) {
            table[i][j] = (list x[i])
        }
        else {
            table[i][j] = ()
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

但我无法理解如何在Clojure中完成这项工作.我尝试使用嵌套的for comprehensions和嵌套的循环重复结构,但我无法工作.

或者,我可以创建一个具有正确大小的可变表,将其全部初始化为空列表,然后在检查每个元素时设置值x,但是我希望尽可能保持表不可变.

ama*_*loy 11

使用hashmap?不需要矢量,它不能稀疏.此外,这个必要的解决方案看起来也不稀疏 - 浪费内存储存数以万计的空单元格.也许是这样的:

(let [indexed (map-indexed vector xs)]
  (reduce (fn [m [i x]]
            (if (test? x)
              (assoc-in m [i i] x)
              m))
          {}
          indexed))
Run Code Online (Sandbox Code Playgroud)