2010-11-02 30 views
3

我有函數,一維列表轉換爲3D名單,但在第二和第三維度指數是相等的,同時它的地方,而不是從輸入列表中的值爲零:轉換1D名單3D名單

n = 4 

input = Table[RandomInteger[5], {i, 1, 48}] 

convert[l_] := Table[If[i == j, 0, l[[index++]]], {s, 1, 4}, {i, 1, n}, {j, 1, n}] 

output = convert[input] 

我想擺脫Increment [](++)函數。

+0

在'Table'迭代器是如何定義的'N'? – rcollyer 2010-11-02 19:27:31

+0

@rcollyer我已將n個作業添加到我的問題中 – Max 2010-11-02 20:53:07

+1

另請參見http://stackoverflow.com/q/3807976/421225 – Simon 2010-11-02 21:21:52

回答

1

我想這可能工作:

convert[l_] := Insert[Partition[Partition[l, 3], 4], 0, 
         Flatten[Table[{j, i, i}, {j, 4}, {i, 4}], 1]] 

也許有人更精明可以幫助擺脫分區[分區討厭的建設。

HTH!

+2

中給出的解決方案可悲的是,還沒有替代使用嵌套的「分區」調用(參見[「Mathematica中的平展逆」](http://stackoverflow.com/questions/3807976/inverse-of-flatten-in-mathematica/3808284),至少) – 2010-11-02 21:18:14

+1

另外,我建議'ReplacePart [...,{_,i_,i _} - > 0]'而不是'Insert',則不需要構建partspecs列表,但可以使用簡單模式。 – 2010-11-02 21:20:59

+0

@Michael謝謝你的指點。對我來說,我已經投票了你的答案...並忘了它。關於ReplacePart []建議,我沒有找到一個優雅的方式來使用它。請隨時編輯我的答案或張貼另一個(插入非常笨拙) – 2010-11-02 22:02:28

1

下面是一個使用SparseArray替代(AB),但是它並沒有消除對指標變量,增量的需求:

convert[l_] := Module[{q=1}, 
    Normal[SparseArray[{{_,i_,i_} -> 0, {i_,j_,k_} :> l[[q++]]}, {3, 4, 4}]] 
]