2010-11-02 31 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}]] 
]