Wolfram mathematica 将一维列表转换为三维列表

Wolfram mathematica 将一维列表转换为三维列表,wolfram-mathematica,Wolfram Mathematica,我有一个将一维列表转换为三维列表的函数,但同时当第二维度和第三维度索引相等时,它会放置零,而不是输入列表中的值: 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[](++)函数 我认为这可能有效:

我有一个将一维列表转换为三维列表的函数,但同时当第二维度和第三维度索引相等时,它会放置零,而不是输入列表中的值:

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[](++)函数

我认为这可能有效:

convert[l_] := Insert[Partition[Partition[l, 3], 4], 0, 
                      Flatten[Table[{j, i, i}, {j, 4}, {i, 4}], 1]]
也许有更精明的人可以帮助摆脱分区[分区结构]

HTH!

这里有一个使用的替代方案(ab),但它并不消除索引变量和增量的需要:

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

n
如何在
表中定义
迭代器?@rcollyer我已经在我的问题中添加了n赋值,请看中给出的解决方案,遗憾的是,使用嵌套的
Partition
调用还没有替代方法(请参阅以获得通用解决方案)。另外,我建议
ReplacePart[…,{uu,I\uu,I}->0]
您不需要创建零件规格列表,而可以使用一个简单的模式来代替插入。@Michael谢谢您的指示。真不好意思,我已经投票支持了您的答案…但忘记了。关于替换零件[]建议,我找不到一个优雅的方法来使用它。请随意编辑我的答案或发布另一个答案(插入非常笨拙)@belisarius,字面意思是,
ReplacePart[Partition[Partition[…],…],{,I,I}->0]
可以。模式匹配零件规格第二和第三个元素相等的所有元素,但无需指定实际零件规格值。@Michael已删除。无尸体,无谋杀:)