2016-05-11 7 views
2

К примеру, я следующая вложенной вектор:Clojure: Применить вложенный векторный формат уплощенного вектор

[[[0.582198689235419 -0.34713183143727 0.4685311493624731] 
    [-0.38928013774079284 -0.5901700383677557 -0.37573234072157] 
    [0.6716356761877877 -0.19645167952721243 -0.5700686091940252]] 
[[0.0027162308840597005 -0.4483592764429284 -0.4766278022217257 -0.2724018313051576] 
    [-0.2765881229144672 -0.8030656496255356 -0.16159395457031567 -0.27432324260043084] 
    [-0.6154630466545907 -0.60573539482247 0.4417814561800192 -0.5559788990464504] 
    [0.6194560094536031 -0.3663074359460578 -0.5704311251195602 0.7194827876969362]]] 

И я следующий сплюснутый вектор:

(0.5366343712173423 
-0.816449781850872 
-0.16066485785704843 
0.9816561233924161 
-0.09646744313584676 
-0.2619662625757997 
-0.9946004265996822 
-0.14096299956754854 
0.579260850612288 
-0.827601452607939 
-0.24934665032374648 
-0.42272393175707873 
0.11239245249400165 
-0.29878238708035043 
-0.61522274672097 
0.8298721730401472 
0.5016214138116059 
0.11633537727916243 
-0.0631891708267196 
-0.26569217599364303 
0.20900664784109668 
0.2005869506108401 
-0.2658279978034501 
0.3383997403318165 
-0.09353513546647907) 

Я хочу уплощенный вектор, который должен быть преобразован во вложенный вектор, который следует той же структуре, что и вложенный вектор, представленный выше. Есть ли основная функция в Clojure или библиотека, которая это делает? У меня есть некоторые идеи, как решить эту проблему, но все они кажутся очень неэффективными, и эта операция будет использоваться с большими векторами.

спасибо, что заранее.

ответ

8

Это был интересный вопрос для ответа, потому что это одно из самых немногих случаев, когда я думаю, что использование молнии облегчает жизнь, а не труднее. Идея состоит в том, чтобы просто сделать вектор-zip вложенного вектора, представить желаемую структуру и повторно называть zip/next on it; всякий раз, когда мы добираемся до узла, который является листом, мы заменяем его значение на следующий из входной последовательности.

Обратите внимание, что это предполагает, что во вложенной структуре точно так же много элементов, как в сплющенном списке; если это не так, вы, вероятно, получите ошибку, которая знает.

(require '[clojure.zip :as z]) 

(defn replace-values [structure values] 
    (loop [z (z/vector-zip structure) 
     values (seq values)] 
    (cond (not values) (z/root z) 
      (z/branch? z) (recur (z/next z) values) 
      :else (recur (-> z 
          (z/replace (first values)) 
          (z/next)) 
         (next values))))) 

user> (replace-values '[[[0.582198689235419 -0.34713183143727 0.4685311493624731] 
         [-0.38928013774079284 -0.5901700383677557 -0.37573234072157] 
         [0.6716356761877877 -0.19645167952721243 -0.5700686091940252]] 
         [[0.0027162308840597005 -0.4483592764429284 -0.4766278022217257 -0.2724018313051576] 
         [-0.2765881229144672 -0.8030656496255356 -0.16159395457031567 -0.27432324260043084] 
         [-0.6154630466545907 -0.60573539482247 0.4417814561800192 -0.5559788990464504] 
         [0.6194560094536031 -0.3663074359460578 -0.5704311251195602 0.7194827876969362]]] 
         '(0.5366343712173423 
         -0.816449781850872 
         -0.16066485785704843 
         0.9816561233924161 
         -0.09646744313584676 
         -0.2619662625757997 
         -0.9946004265996822 
         -0.14096299956754854 
         0.579260850612288 
         -0.827601452607939 
         -0.24934665032374648 
         -0.42272393175707873 
         0.11239245249400165 
         -0.29878238708035043 
         -0.61522274672097 
         0.8298721730401472 
         0.5016214138116059 
         0.11633537727916243 
         -0.0631891708267196 
         -0.26569217599364303 
         0.20900664784109668 
         0.2005869506108401 
         -0.2658279978034501 
         0.3383997403318165 
         -0.09353513546647907)) 

[[[0.5366343712173423 -0.816449781850872 -0.16066485785704843] 
    [0.9816561233924161 -0.09646744313584676 -0.2619662625757997] 
    [-0.9946004265996822 -0.14096299956754854 0.579260850612288]] 
[[-0.827601452607939 -0.24934665032374648 -0.42272393175707873 0.11239245249400165] 
    [-0.29878238708035043 -0.61522274672097 0.8298721730401472 0.5016214138116059] 
    [0.11633537727916243 -0.0631891708267196 -0.26569217599364303 0.20900664784109668] 
    [0.2005869506108401 -0.2658279978034501 0.3383997403318165 -0.09353513546647907]]] 
+0

Спасибо! Я прочту про молнии. Они выглядят интересными. – amherag

 Смежные вопросы

  • Нет связанных вопросов^_^