如何访问向量clojure向量中的特定元素

时间:2014-02-07 20:12:53

标签: vector clojure

如果我将矢量定义为

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

如何在clojure中访问向量向量中的随机元素?我一直看到人们在网上说,在列表中使用向量的一个好处是你可以获得随机访问,而不必通过列表进行递归,但我无法找到允许我这样做的功能。我习惯于在c ++中我可以做矩阵[1] [1],它会返回第二个向量的第二个元素。

我是不是必须一次通过我的矢量循环一个元素,或者是否有更简单的方法来访问特定元素?

5 个答案:

答案 0 :(得分:13)

向量是关联的,因此您可以使用get-in来访问嵌套向量,例如矩阵,坐标。

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

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

答案 1 :(得分:10)

几乎就像你在C ++中那样:

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

作为docs say

  

向量实现IFn,用于一个参数的invoke(),它们假定它是一个索引并且自己查找就好像是nth,即向量是它们索引的函数。

答案 2 :(得分:3)

由于向量是关联数据结构,您还可以使用get-in通过嵌套索引到达内部:

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

答案 3 :(得分:3)

其他答案可能就是您需要的所有内容,但如果您正在进行大量的二维索引 - 可能还有二维数字结构的其他转换 - 您可能需要查看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是否有用取决于你想做什么,显然。

答案 4 :(得分: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