如何在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
答案 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 ” 。