Ответ 1
Обычное решение
(defn transpose [m]
(apply mapv vector m))
В 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? например, чтобы избежать повторения этого ужасного цикла?
Обычное решение
(defn transpose [m]
(apply mapv vector m))
С 2014 года я бы рекомендовал использовать core.matrix для любой числовой работы в Clojure.
Помимо всего прочего, это обеспечивает реализацию всех наиболее распространенных матричных операций:
(use 'clojure.core.matrix)
(transpose [[1 2] [3 4]])
=> [[1 3] [2 4]]