2016-05-11 36 views
2

Zum Beispiel Nehmen, ich habe folgenden verschachtelten Vektor:Clojure: ein verschachteltes Vektor-Format zu einem abgeflachten Vektor

[[[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]]] 

Und ich habe folgenden abgeflachte Vektor:

(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) 

ich das abgeflachte will Vektor, der in einen verschachtelten Vektor umgewandelt werden soll, der der gleichen Struktur wie der oben dargestellte verschachtelte Vektor folgt. Gibt es eine Kernfunktion in Clojure oder eine Bibliothek, die das tut? Ich habe einige Ideen, wie ich dieses Problem lösen kann, aber alle scheinen sehr ineffizient zu sein, und diese Operation wird mit großen Vektoren verwendet werden.

Vielen Dank im Voraus.

Antwort

8

Das war eine lustige Frage zu beantworten, denn es ist eines der wenigen Male, wenn ich denke, dass die Verwendung eines Reißverschlusses die Dinge leichter macht statt härter. Die Idee ist, einfach einen Vektor-Zip des verschachtelten Vektors zu machen, um die gewünschte Struktur darzustellen, und zip/next wiederholt darauf zu nennen; Immer wenn wir zu einem Knoten kommen, der ein Blatt ist, ersetzen wir seinen Wert durch den nächsten aus der Eingabesequenz.

Beachten Sie, dass davon ausgegangen wird, dass in der verschachtelten Struktur genau so viele Elemente vorhanden sind wie in der abgeflachten Liste. Wenn das nicht der Fall ist, werden Sie wahrscheinlich einen Fehler bekommen, wer weiß.

(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

Vielen Dank! Ich werde über Reißverschlüsse lesen. Sie sehen interessant aus. – amherag