Clojure 循环移位嵌套向量
给定一个嵌套向量aClojure 循环移位嵌套向量,clojure,clojure-contrib,Clojure,Clojure Contrib,给定一个嵌套向量a [[1 2 3] [4 5 6] [7 8 9]] 我的目标是循环移动行和列 如果我第一次考虑单排班次,我预计 [[7 8 9] [1 2 3] [4 5 6]] 在这种情况下,第三行映射到第一行 这是由代码实现的 (defn circles [x i j] (swap-rows x i j)) 有投入 (circles [[1 2 3] [4 5 6] [7 8 9]] 0 1) 但是,我不确定如何进一步移动列。理想情况下,我希望添加到函数循环中,并且能够
[[1 2 3] [4 5 6] [7 8 9]]
我的目标是循环移动行和列
如果我第一次考虑单排班次,我预计
[[7 8 9] [1 2 3] [4 5 6]]
在这种情况下,第三行映射到第一行
这是由代码实现的
(defn circles [x i j]
(swap-rows x i j))
有投入
(circles [[1 2 3] [4 5 6] [7 8 9]] 0 1)
但是,我不确定如何进一步移动列。理想情况下,我希望添加到函数循环中,并且能够移动行或列。虽然我不确定对于每一个班次选择是否有两个不同的功能是最简单的
(defn circles [xs i j]
(letfn [(shift [v n]
(let [n (- (count v) n)]
(vec (concat (subvec v n) (subvec v 0 n)))))]
(let [ys (map #(shift % i) xs)
j (- (count xs) j)]
(vec (concat (drop j ys) (take j ys))))))
例如:
(circles [[1 2 3] [4 5 6] [7 8 9]] 1 1)
;= [[9 7 8] [3 1 2] [6 4 5]]
根据您希望执行此操作的频率,输入向量的大小和要应用的移位(使用)可能有意义clojure.core.rrb vector/catvec
是相关函数(您也可以使用clojure.core.rrb vector/subvec
进行切片,但实际上这里可以使用clojure.core
中的常规subvec
,因为catvec
将执行其自身的转换)。您还可以使用:
在
core.matrix
中有一个名为rotate
的函数(通常用于通用数组/矩阵操作)
rotate
的第二个参数用于选择要旋转的标注(0表示行,1表示列)
班次定义在哪里?我经常看到它,但在任何地方都找不到它的定义?@octopusgrabbus在这段代码中,它是由
letfn
表单引入的一个局部函数–(letfn[(shift…)…)
。谢谢你的解释。如果(def v[1 2 3 4])
,那么(rest(conj v(first v))
等于[2 3 4 1]
。不能解决您的整个问题,但可能是一个起点。
(defn circle-drop [i coll]
(->> coll
cycle
(drop i)
(take (count coll))
vec))
(defn circles [coll i j]
(let [n (count coll)
i (- n i)
j (- n j)]
(->> coll
(map #(circle-drop i %))
(circle-drop j))))
(circles [[1 2 3] [4 5 6] [7 8 9]] 2 1)
;; => [[8 9 7] [2 3 1] [5 6 4]]
(use 'clojure.core.matrix)
(def A [[1 2 3] [4 5 6] [7 8 9]])
(rotate A 0 1)
=> [[4 5 6] [7 8 9] [1 2 3]]
(rotate A 1 1)
=> [[2 3 1] [5 6 4] [8 9 7]]