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

Vector 如何访问向量clojure中的特定元素,vector,clojure,Vector,Clojure,如果我有一个向量定义为 (def matrix [[1 2 3][4 5 6]]) 在clojure中,如何访问向量向量中的随机元素?我经常看到人们在网上说,在列表上使用向量的好处之一是,你可以随机访问,而不必在列表中递归,但我还没有找到允许我这样做的函数。我习惯于C++,在这里我可以做矩阵[1 ] [1 ],它会返回第二向量的第二元素。 我是不是一次只能在向量中循环一个元素,还是有更简单的方法来访问特定元素?就像在C++中一样: user=> (def matrix [[1 2 3][

如果我有一个向量定义为

(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
作为:

向量实现IFn,用于一个参数的invoke(),它们假定该参数是一个索引,并在自身中查找,就好像在第n个参数之前一样,即向量是其索引的函数


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

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

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

由于向量是关联数据结构,因此也可以使用“获取”来访问嵌套索引的内部:

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

其他答案可能就是您所需要的,但是如果您经常做2D索引,可能还需要对2D数字结构进行其他转换,您可能需要查看库。在具有不同性能特征的不同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
库中实现:)


谢谢,我不知道为什么我甚至没有想过尝试这种格式的东西!您还可以使用:(进入矩阵[1])@user1443362而不是接受A.Webb的答案,它更好。@user1443362这是一个更好的答案。
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