Clojure создать двумерный массив со значением по умолчанию - PullRequest
0 голосов
/ 03 октября 2018

Как я могу создать двумерный массив (матрицу) с некоторым значением по умолчанию в 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 голосов
/ 03 октября 2018

вот пример использования `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
0 голосов
/ 03 октября 2018

Для создания двумерного массива в Clojure, вы можете обратиться к предопределенной функции " to-array-2d " из здесь .

0 голосов
/ 03 октября 2018

Если вы хотите инициализировать со значением по умолчанию или любым другим вводом последовательности, вы можете подать типизированные массивы в 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]]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...