Подтвердить что ты не робот

Матричная транспозиция в clojure

В clojure возможным представлением матрицы является вектор векторов, т.е. [[1 2] [3 4]]. Возможная реализация транспонирования матрицы:

(defn transpose [matrix]
  (loop [matrix matrix, transp [], i 0]
    (if (< i (count (nth matrix 0)))
      (recur matrix 
             (conj transp
                   (vec (reduce concat
                                (map #(conj [] (nth %1 i))
                                     matrix))))
             (inc i))
      transp)))

Может ли кто-нибудь подумать о более идиоматической реализации clojure? например, чтобы избежать повторения этого ужасного цикла?

4b9b3361

Ответ 1

Обычное решение

(defn transpose [m]
  (apply mapv vector m))

Ответ 2

С 2014 года я бы рекомендовал использовать core.matrix для любой числовой работы в Clojure.

Помимо всего прочего, это обеспечивает реализацию всех наиболее распространенных матричных операций:

(use 'clojure.core.matrix)

(transpose [[1 2] [3 4]])
=> [[1 3] [2 4]]