2012-04-27 2 views
18

행렬의 가능한 표현은 벡터의 벡터, 즉 [[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의 구현에 더 관용적 생각할 수 있습니까? 예를 들어이 무시 무시한 루프가 재발하지 않도록하려면?

+2

? 다양한 행렬 연산이 필요하다면 영감의 원천이 될 수 있습니다 - https://github.com/liebke/incanter/wiki/matrices – sw1nn

답변

55

일반적인 솔루션은 내가 Clojure의 어떤 수치 일을 core.matrix를 사용하는 것이 좋습니다 것, 2014 년

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

입니다.

무엇보다도

,이 모든 가장 일반적인 행렬 연산의 구현을 제공합니다 : 당신은 주문 술사에 대해 알아

(use 'clojure.core.matrix) 

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

나는 core.matrix가 당신에 의해 작성되었다고 언급해야한다고 생각합니다. 그것을 추천하려고합니다. – amalloy

+9

그가 추천하는 네임 스페이스에 "clojure.core"라는 단어가 앞에 붙는 좀 더 적절한 사실을 저자에게 제공하는 것이 좋습니다. – ctpenrose

+1

이것은 유효한 답변입니다. 나는 포기가 그것을 향상시킬 수있는 방법을 보지 못했다. ... 아마도 이것은 관용적 인 클로저가 아닐지 모르지만 최적화 된 라이브러리는 행렬 작업에 관용적입니다. – muhuk