在Clojure中旋转列表矩阵列表
一般来说,我对Clojure和函数式编程是新手。我不知道如何以一种实用的方式处理这个问题 我有以下矩阵:在Clojure中旋转列表矩阵列表,clojure,matrix,Clojure,Matrix,一般来说,我对Clojure和函数式编程是新手。我不知道如何以一种实用的方式处理这个问题 我有以下矩阵: (def matrix [[\a \b \c] [\d \e \f] [\g \h \i]]) 我想把它转换成这样(逆时针旋转): 我已经把这些元素按正确的顺序排列好了。如果我能以这种方式收集字符串中的数据,我就可以用分区将其拆分。但是我很确定doseq走错了路: (doseq [i [0 1 2]] (doseq [row matr
(def matrix [[\a \b \c]
[\d \e \f]
[\g \h \i]])
我想把它转换成这样(逆时针旋转):
我已经把这些元素按正确的顺序排列好了。如果我能以这种方式收集字符串中的数据,我就可以用分区将其拆分。但是我很确定doseq走错了路:
(doseq [i [0 1 2]]
(doseq [row matrix]
(println (get (vec row) i))))
我已经尝试过嵌套映射调用,但一直被它卡住。在Clojure中构建字符串或以更好的方式处理此问题的正确方法是什么?直接从rosettacode获取解决方案:
(vec(应用映射向量矩阵))
要了解正在发生的事情,请考虑:
(map vector [\a \b \c] [\d \e \f] [\g \h \i])
这将与任意的矩阵维度很好地配合,尽管它不适合大量的数字压缩,因为你会考虑使用基于Cujure的基于java的矩阵操作库。
< P>你想要达到的效果听起来像。我建议(apply map list matrix)
; => ((\a \d \g) (\b \e \h) (\c \f \i))
它有什么作用
(apply map list '((\a \b \c) (\d \e \f) (\g \h \i)))
相当于
(map list '(\a \b \c) '(\d \e \f) '(\g \h \i))
它取三个列表中每个列表的第一个元素,调用列表,然后取第二个元素,调用列表。。。返回以这种方式生成的所有列表的序列
在ClojureDocs上可以找到两个和的更多示例。这里有一种方法:
(def transposed-matrix (apply map list matrix))
;=> ((\a \d \g) (\b \e \h) (\c \f \i))
(doseq [row transposed-matrix]
(doall (map println row)))
这将产生与原始文件相同的输出(打印
matrix
的列)。您可以使用core.matrix
非常轻松地执行此类矩阵操作。特别是,已经有了一个转置
函数,它可以完全满足您的需要:
例如:
(use 'clojure.core.matrix)
(def matrix [[\a \b \c]
[\d \e \f]
[\g \h \i]])
(transpose matrix)
=> [[\a \d \g]
[\b \e \h]
[\c \f \i]]
(use 'clojure.core.matrix)
(def matrix [[\a \b \c]
[\d \e \f]
[\g \h \i]])
(transpose matrix)
=> [[\a \d \g]
[\b \e \h]
[\c \f \i]]