用于循环以更改四维表的值

时间:2011-07-01 22:15:00

标签: wolfram-mathematica

我希望得到你的帮助,

我有一张表:

InitialMatrix[x_, y_, age_, disease_] :=

  ReplacePart[Table[Floor[Divide[dogpopulation/cellsno,9]], {x}, {y}, {age}, {disease}], 
{{_, _, 1, _} ->  0, {_, _, 3, _} -> 6}];

我试图设置一个条件来将表中的所有值更改为其他值,根据值,我试过:

listInitial={};

For[a = 1, a < 4, a++,

 For[b = 1, b < 4, b++,

  For[x = 1, x < 4, x = x + 1,

   For[z = 1, z < 4, z = z + 1,

 listInitial =

 If[Random[] > psurvival, 

      ReplacePart[ InitialMatrix[3, 3, 3, 3], {a, b, x, z} -> 
        InitialMatrix[3, 3, 3, 3][[a]][[b]][[x]][[z]] - 1], 

      InitialMatrix[3, 3, 3, 3], {a, b, x, z} -> 
       InitialMatrix[3, 3, 3, 3][[a]][[b]][[x]][[z]]]]]]]

但它只改变了我的表的最后一部分,最后我决定使用以下代码而不是for循环,

SetAttributes[myFunction, Listable]

myFunction[x_] := 
 If[Random[] > psurvival, If [x - 1 < 0 , x , x - 1], x]

 myFunction[InitialMatrix[3, 3, 3, 3]] // TableForm

但现在我想更改表格中的特定部分,例如我想要所有部分 {__,__,3,_}改变我尝试用MapAt选择范围,但我认为我需要做一个循环,我不能,任何人都可以帮助我吗?

For[x = 1, x < 4, x++,
  listab[MapAt[f, InitialMatrix[3, 3, 3, 3], {x, 3, 3}]//TableForm]]

2 个答案:

答案 0 :(得分:3)

如果您查看MapAt的文档,您将看到使用第三个参数的各种设置可以在张量的不同深度处理多个元素。还要注意使用Flatten的第二个参数。我认为这就是你要找的东西。

MapAt[g, InitialMatrix[3, 3, 3, 3], 
Flatten[Table[{i, j, 3, k}, {i, 3}, {j, 3}, {k, 3}], 2]]

http://reference.wolfram.com/mathematica/ref/MapAt.html http://reference.wolfram.com/mathematica/ref/Flatten.html

由于这似乎是你第二次尝试提出一个涉及非常复杂的For循环的问题,我可以强调你在Mathematica中几乎从不需要For或Do循环会使用一个,比如Fortran或C.当然不适用于大多数列表的构建。表工作。像Listable函数(我知道你知道)和NestList,FoldList和Array这样的命令也是如此。

您可能还会发现本教程很有用。 http://reference.wolfram.com/mathematica/tutorial/SelectingPartsOfExpressionsWithFunctions.html

答案 1 :(得分:1)

我使用以下代码作为答案,我不确定是否是最佳解决方案,但它有效!!

InitialTable[x_, y_, z_, w_] := 

  MapAt[g,ReplacePart[
   InitialMatrix[3, 3, 3, 3] + 
    ReplacePart[
     Table[If[RandomReal[] > psurvival, -1, 
       0], {3}, {3}, {3}, {3}], {{_, _, 1, _} -> 0, {_, _, 2, _} -> 
       0}], {{_, _, 1, 2} -> 0, {_, _, 1, 3} -> 0}], 
  Flatten[Table[{i, j, 3, l}, {i, x}, {j, y}, {l, w}], 2]];

g[x_] := If[x < 0, 0, x];