Clojure创建带有默认值的二维数组

时间:2018-10-02 21:31:17

标签: arrays multidimensional-array clojure

如何在Clojure中使用默认值创建二维数组(矩阵)?

示例:

user=> (double-array-2d 3 4 Double/MIN_VALUE)
[[4.9E-324, 4.9E-324, 4.9E-324, 4.9E-324],
 [4.9E-324, 4.9E-324, 4.9E-324, 4.9E-324],
 [4.9E-324, 4.9E-324, 4.9E-324, 4.9E-324]]

以及以后如何更改呢?

user=> (def arr2d (double-array-2d 3 4 0))
user=> (set! arr2d 1 1 5)
user=> (pprint arr2d)
[[0.0, 0.0, 0.0, 0.0],
 [0.0, 5.0, 0.0, 0.0],
 [0.0, 0.0, 0.0, 0.0]]
nil

3 个答案:

答案 0 :(得分:2)

如果要使用默认值或任何其他序列输入进行初始化,则可以将类型化的数组输入into-array中:

(def arr2d
  (into-array (repeat 3 (double-array 4 Double/MIN_VALUE))))

double-array和其他类型的数组构造函数可以采用默认值或输入序列。

(clojure.pprint/pprint arr2d)
[[4.9E-324, 4.9E-324, 4.9E-324, 4.9E-324],
 [4.9E-324, 4.9E-324, 4.9E-324, 4.9E-324],
 [4.9E-324, 4.9E-324, 4.9E-324, 4.9E-324]]

还有一个make-array函数,您只需为其指定类型和维数即可,但是它没有默认值:

(make-array Double/TYPE 3 2)
=> #object["[[D" 0x3ae2ca60 "[[D@3ae2ca60"]
(def arr2d (make-array Double/TYPE 3 4))

您可以使用aset设置给定索引的值:

(aset arr2d 1 1 5)
=> 5

这已就地改变了数组,并且打印arr2d反映了这一点:

(clojure.pprint/pprint arr2d)
;; [[0.0, 0.0, 0.0, 0.0], [0.0, 5.0, 0.0, 0.0], [0.0, 0.0, 0.0, 0.0]]

答案 1 :(得分:0)

这是一个使用`java.util.Arrays / fill填充每个数组的示例

user> (defn my-array [x y]
        (let [arr (make-array Double/TYPE x y)]
          (doseq [i (range x)]
                 (java.util.Arrays/fill (aget arr i) Double/MIN_VALUE))
          arr))
#'user/my-array

user> (def thing (my-array 3 4))
#'user/thing

user> (doseq [i (range 3)
              j (range 4)]
        (println (aget thing i j)))
4.9E-324
4.9E-324
4.9E-324
4.9E-324
4.9E-324
4.9E-324
4.9E-324
4.9E-324
4.9E-324
4.9E-324
4.9E-324
4.9E-324

答案 2 :(得分:0)

要在Clojure中创建二维数组,可以从here中引用预定义的函数 to-array-2d