如何在 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
如果要使用默认值或任何其他序列输入进行初始化,可以将类型化数组馈送到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]]
要在 Clojure 中创建二维数组,您可以从这里引用预定义的函数">to-array-2d"。
下面是一个使用'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