2014-02-07 26 views
6

的向量訪問特定的元素,如果我有一個向量定義爲我如何在載體的Clojure

(def matrix [[1 2 3][4 5 6]]) 

如何用Clojure我在向量的向量訪問隨機元素?我不斷看到人們在網上說,在列表上使用向量的好處之一是您可以隨機訪問,而不必通過列表進行遞歸,但我一直無法找到允許我這樣做的函數。我習慣於在C++中做矩陣[1] [1],它會返回第二個向量的第二個元素。

我堅持不得不通過我的向量一次循環一個元素,還是有更簡單的方法來訪問特定元素?

回答

9

幾乎像你會做它在C++:

user=> (def matrix [[1 2 3][4 5 6]]) 
user=> (matrix 1) 
[4 5 6] 
user=> ((matrix 1) 1) 
5 

由於docs say

載體實現干擾素,用於調用(一個說法,他們假定的)是一個索引,並期待它們本身如同第n個一樣,即矢量是它們指數的函數。

+0

謝謝,我不知道爲什麼我根本就沒想到在該格式嘗試的東西! – user1443362

+3

你也可以使用:(get-in matrix [1 1]) –

+0

@ user1443362而不是接受A.Webb的答案,那會更好。 – bereal

13

向量是關聯的,因此您可以使用get-in來訪問嵌套的向量,例如,矩陣,座標。

(def matrix [[1 2 3] [4 5 6] [7 8 9]]) 

(get-in matrix [1 1]) 
;=> 5 
+2

@ user1443362這是一個更好的答案。 – bereal

2

由於矢量關聯的數據結構,你也可以用得到,在與嵌套指數內到達:

user=> (def matrix [[1 2 3][4 5 6]]) 
user=> (get-in matrix [1 1]) 
5 
3

其他的答案可能是你需要的一切,但如果你做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是否有用取決於你想要做什麼。

1

您可以使用相同的方法來回答火星上面,在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