Wolfram mathematica For loop更改四维表的值

Wolfram mathematica For loop更改四维表的值,wolfram-mathematica,Wolfram Mathematica,我希望你能帮我做点什么 我有一张桌子: InitialMatrix[x_, y_, age_, disease_] := ReplacePart[Table[Floor[Divide[dogpopulation/cellsno,9]], {x}, {y}, {age}, {disease}], {{_, _, 1, _} -> 0, {_, _, 3, _} -> 6}]; 我试图设置一个条件,将表中的所有值更改为sumthing else,根据一个值,我尝试: list

我希望你能帮我做点什么

我有一张桌子:

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

  ReplacePart[Table[Floor[Divide[dogpopulation/cellsno,9]], {x}, {y}, {age}, {disease}], 
{{_, _, 1, _} ->  0, {_, _, 3, _} -> 6}];
我试图设置一个条件,将表中的所有值更改为sumthing else,根据一个值,我尝试:

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]]]]]]]

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

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/Flatten.html

由于这似乎是你第二次尝试提出一个涉及非常复杂的For循环的问题,我要强调的是,在Mathematica中,如果你在Fortran或C中使用For或Do循环,那么你几乎不需要For或Do循环。当然,绝大多数列表的构造都不需要。桌上工作。也可以使用列表函数(我知道你知道)和NestList、FoldList和Array等命令

您可能还会发现本教程很有用。

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

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];
InitialTable[x,y,z,w]:
MapAt[g,ReplacePart[
初始矩阵[3,3,3,3]+
替换零件[
表[If[RandomReal[]>psurvival,-1,
0], {3}, {3}, {3}, {3}], {{_, _, 1, _} -> 0, {_, _, 2, _} -> 
0}], {{_, _, 1, 2} -> 0, {_, _, 1, 3} -> 0}], 
展平[表[{i,j,3,l},{i,x},{j,y},{l,w}],2];
g[x_]:=If[x<0,0,x];

此信息已在此处发布(显然是由其他用户发布的):。我建议用户尝试我对该问题的回答。好吧,不是同一个问题,但现在用户意识到为什么他自己的答案没有给他想要的。是的。。。这是真的。。另一个用户是我的一个朋友,他试图帮助我解决我的问题,他就是那个回复你的人,但由于我对结果不满意,我决定用我的帐户再次发布。我试过你之前说的,但我对你的一个建议有点困惑好吧,很公平。知道你想解决什么样的问题会有帮助。非常感谢,我也对代码survivalFn[n_Integer?Positive,p_?Positive,steps_Integer?Positive]/;pIf我想在这个新矩阵中添加一些值,我们在这里有MapAt[g,InitialMatrix[3,3,3],Flatten[Table[{I,j,3,k},{I,3},{j,3},{k,3}],2]],例如在g[6]我想有一个条件,如果这个条件为真,那么我想在这个特定元素中添加一些值。。现在我做的是:New[x,y,z,w]:=InitialMatrix[x,y,z,w]+ReplacePart[Table[If[RandomReal[]>psurvival,-1,0],{x},{y},{z},{w}],{,{,{,{,},1,}->0,{,{,},2,}->0};你以前建议过,但是哪种方法更好?我不能用600个字符回答这两个问题,所以我会在回答你的第一个评论时,在另一个问题上再贴一个答案。我将回答第二条注释作为对这个问题的补充回答。您的代码所做的是在所有情况下将原始矩阵的元素{,1,2}和{,1,3}设置为零:它发生在第二个ReplacePart函数之外。这真的是你想要的吗?你可以用楼层功能来代替。然后根据伯努利分布函数递减其他变量(参见我对另一个问题的另一个答案)。您的MapAt函数只是强制要求人口永远不会为负。您可以使用天花板功能来实现此目的(天花板[#,0]&)。无论如何,这不是你最初问的问题。非常感谢,我会试试你说的:)@Verbeia你能在上查看我的另一个问题吗?我想你是唯一可以帮助我的人。。。我一整天(今天和昨天)都在努力想办法,但我做不到!!如果可以,请帮助我
MapAt[g, InitialMatrix[3, 3, 3, 3], 
Flatten[Table[{i, j, 3, k}, {i, 3}, {j, 3}, {k, 3}], 2]]
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];