在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

一般来说,我对Clojure和函数式编程是新手。我不知道如何以一种实用的方式处理这个问题

我有以下矩阵:

(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]]