2016-05-11 56 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/next;每当我们到达一个叶节点时,我们就用输入序列中的下一个替换它的值。

请注意,这里假定嵌套结构中的项目与平展列表中的项目完全相同;如果情况并非如此,你可能会得到某种错误,谁知道。

(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