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

如果要使用默认值或任何其他序列输入进行初始化,可以将类型化数组馈送到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

最新更新