2011-08-17 5 views
9

내가 벡터 조작과 관련된 기본적인 것을 놓치고 있는지 궁금합니다. 의는 다음과 같은 I가 있다고 가정 해 봅시다 :Clojure에서 벡터의 일부를 어떻게 수정합니까?

(def xs [9 10 11 12 13]) 
(def idx [0 2]) 
(def values [1 3]) 

를 내가 matlab에에서 벡터 [1 10 3 12 13]을 반환하려면, 내가 xs(idx) = values를 작성합니다. Clojure에서 이것을 달성하기위한 원시적 인 방법이 있습니까? 지금 당장 다음 함수를 사용하고 있습니다 :

(defn xinto [seq idx val] 
    (apply assoc seq (interleave idx val))) 

고마워요.

+0

이미 제시된 제안 사항 외에는 코드를 제공 할 수 없습니다. 'assoc' _은 적절한 프리미티브이지만 이미 보았 듯이 개별적으로 전달 된 인덱스와 값을 원합니다. 당신은 인덱스 값 쌍의 시퀀스를 빌드하고'apply'를 사용하거나 amalloy와 mikera가 제안한 것처럼'reduce'를 사용하여 재귀 적으로 assoc을 수행 할 수 있습니다. 두포에서 assoc의 다중 인덱스 값 버전은 어쨌든 재귀 적입니다. 나는'reduce' 옵션을 더 관용적이라고 생각할 것이다. –

+0

당신의 솔루션이 거의 최고라고 생각합니다. –

+2

'apply assoc'와'interleave'는 아마도 이전 값에 상관없이 특별히 인덱스를 설정하기를 원할 때 가장 좋은 선택 일 것입니다. 나는 당신이 뭔가 더 복잡한 일을하기를 원할 것이라고 의심하는 대부분의 경우,이 "속임수"는 전혀 작동하지 않을 것입니다. 그래서'reduce'를 사용하는 것이 더 일반적입니다. – amalloy

답변

8

idxvalues을 개념적으로 값에 대한 인덱스의지도 인 두 개의 seq로 분리 했으므로 다소 어색합니다. 당신이 저에게 당신의 데이터 형식의 작은 창조적 수정 허용합니다 그래서 만약 : 당신은 몇 가지 이상한 방법으로 idxvalues가 발생하는 경우

(def x [9 10 11 12 13]) 
(def changes {0 1, 2 3}) 

(defn xinto [v changes] 
    (reduce (fn [acc [k v]] 
      (assoc acc k v)) 
      v 
      changes)) 

(xinto x changes) ;; gets the result you want 

를이 (map list idx values)하고 나중에 그룹을 당신이 할 수있는, 함께 그룹 그들에게 편리 아니에요 그런 다음 내 xinto 구현을 사용하십시오.

+0

여기서'transient','assoc!','persistent!'를 사용해보십시오. – seh

+3

@seh 어, 나도 그럴 수 있겠지만 노력할만한 가치는없는 것 같아. 초기 벡터 또는 변경 사항 집합이 작 으면 과도기로 /에서 전환하는 데 필요한 시간이 하나를 사용하여 얻은 이득보다 큽니다. – amalloy

+0

또는 (지도 목록 idx 값) 대신 (우편 번호 idx 값) – zmila

2

더 나은 것을 찾을 수 없습니다.

코어 시퀀스 함수에는 replace이 있지만 키가 아닌 값에서 작동합니다. 당신이 Clojure의에서 수학 관련 일을하려는 경우

(replace {9 2} x) 

[2 10 11 12 13] 

을 반환 따라서는, 나는 또한 당신이 Incanter에서 봐 제안한다. 그것은 수학적 데이터를 조작하기위한 많은 API를 가지고 있습니다.

3

아마 이것에 대한 reduce을 사용하십시오 :

(reduce 
    (fn [old [i v]] (assoc old i v)) 
    x 
    (map vector idx values)) 

그러나, 당신은 정말이 많은 (matlab에 스타일)을 수행하려는 경우 다음 내가 헬퍼 매크로를 만드는 게 좋을 것/기능 몇 가지를 만들 수 있습니다 벡터 조작을위한 DSL의 종류.

+0

예제 코드를 따르려고했지만 원본 벡터 'x'가 누락 된 것 같습니다. 예제를 명확하게하기 위해 3 가지 인자로 수정했습니다. –

관련 문제