的向量訪問特定的元素,如果我有一個向量定義爲我如何在載體的Clojure
(def matrix [[1 2 3][4 5 6]])
如何用Clojure我在向量的向量訪問隨機元素?我不斷看到人們在網上說,在列表上使用向量的好處之一是您可以隨機訪問,而不必通過列表進行遞歸,但我一直無法找到允許我這樣做的函數。我習慣於在C++中做矩陣[1] [1],它會返回第二個向量的第二個元素。
我堅持不得不通過我的向量一次循環一個元素,還是有更簡單的方法來訪問特定元素?
的向量訪問特定的元素,如果我有一個向量定義爲我如何在載體的Clojure
(def matrix [[1 2 3][4 5 6]])
如何用Clojure我在向量的向量訪問隨機元素?我不斷看到人們在網上說,在列表上使用向量的好處之一是您可以隨機訪問,而不必通過列表進行遞歸,但我一直無法找到允許我這樣做的函數。我習慣於在C++中做矩陣[1] [1],它會返回第二個向量的第二個元素。
我堅持不得不通過我的向量一次循環一個元素,還是有更簡單的方法來訪問特定元素?
幾乎像你會做它在C++:
user=> (def matrix [[1 2 3][4 5 6]])
user=> (matrix 1)
[4 5 6]
user=> ((matrix 1) 1)
5
由於docs say:
載體實現干擾素,用於調用(一個說法,他們假定的)是一個索引,並期待它們本身如同第n個一樣,即矢量是它們指數的函數。
向量是關聯的,因此您可以使用get-in
來訪問嵌套的向量,例如,矩陣,座標。
(def matrix [[1 2 3] [4 5 6] [7 8 9]])
(get-in matrix [1 1])
;=> 5
@ user1443362這是一個更好的答案。 – bereal
由於矢量關聯的數據結構,你也可以用得到,在與嵌套指數內到達:
user=> (def matrix [[1 2 3][4 5 6]])
user=> (get-in matrix [1 1])
5
其他的答案可能是你需要的一切,但如果你做2D索引很多 - 可能還有其他2D數字結構轉換 - 您可能需要查看core.matrix庫。在具有不同性能特徵的不同core.matrix實現之間切換通常是單行更改。其中一個實現由對Clojure向量的操作組成。這裏是你會怎麼做雙索引中core.matrix:
user=> (use 'clojure.core.matrix)
nil
user=> (def m (matrix [[1 2 3][4 5 6]]))
#'user/m
user=> (mget m 1 1)
5
對於特定的操作,core.matrix提供沒有特別的優勢。如果你想通過矩陣迭代生成一個新的,這裏是做到這一點的一種方法:
user=> (emap inc m)
[[2 3 4] [5 6 7]]
當然它不是很難做到這一點與核心Clojure的功能。顯然,core.matrix是否有用取決於你想要做什麼。
您可以使用相同的方法來回答火星上面,在clojure.core
庫中實現to-array-2d
:)
user> (def a (to-array-2d [[1 2 3][4 5 6]]))
#'user/a
user> (alength a)
2
user> (alength (aget a 0))
3
user> (aget a 0 0)
1
user> (aget a 0 1)
2
user> (aget a 0 2)
3
user> (aget a 1 0)
4
user> (aget a 2 0)
ArrayIndexOutOfBoundsException
謝謝,我不知道爲什麼我根本就沒想到在該格式嘗試的東西! – user1443362
你也可以使用:(get-in matrix [1 1]) –
@ user1443362而不是接受A.Webb的答案,那會更好。 – bereal