Wolfram mathematica 不保存变量

Wolfram mathematica 不保存变量,wolfram-mathematica,mathematical-optimization,Wolfram Mathematica,Mathematical Optimization,我尝试执行这个嵌套循环,但它不起作用。它不是在每个阶段保存结果。但如果我用Print[]替换listInitial,我会发现所有的更改都已完成 有什么建议吗 For[b = 1, b < 4, b = b + 1, For[a = 1, a < 4, a = a + 1, For[x = 1, x < 4, x = x + 1, For[z = 1, z < 4, z = z + 1, listInitial = If[Random[] > p

我尝试执行这个嵌套循环,但它不起作用。它不是在每个阶段保存结果。但如果我用Print[]替换listInitial,我会发现所有的更改都已完成

有什么建议吗

For[b = 1, b < 4, b = b + 1,
 For[a = 1, a < 4, a = a + 1,
  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], {b, a, x, z} -> 
        InitialMatrix[3, 3, 3, 3][[b]][[a]][[x]][[z]] - 1], 
      InitialMatrix[3, 3, 3, 3], {b, a, x, z} -> 
       InitialMatrix[3, 3, 3, 3][[b]][[a]][[x]][[z]]]]]]]

listInitial // TableForm

我认为您需要将结果分配给initialMatrix以查看ReplacePart的结果,如中所示

In[27]:= A={1 ,2 };
A=ReplacePart[A,1->99];
A

Out[29]= {99,2}

我认为你的问题是你希望替换部分改变初始矩阵。事实并非如此。它确实更改了InitialMatrix的一个无名副本,并将其作为结果返回,然后将其分配给listInitial。后者在每次循环迭代时都会被一个新值覆盖,因此最后它只包含最后一次替换的结果。此时所有变量均等于3,最后一次替换如下所示:

InitialMatrix[3, 3, 3, 3], {3, 3, 3, 3}->InitialMatrix[3, 3, 3, 3][[3]][[3]][[3]][[3]]]
这实际上什么也做不了。最终结果是listInitial,其中包含您开始使用的内容

编辑
我刚刚发现If语句的第二个参数显然是为ReplacePart的第二个实例格式化的,这里缺少了它,

我怀疑您是否需要一个四重嵌套for循环。如果我正确理解了你的代码,你有一个3*3*3*3张量,如果某个随机数高于某个阈值,你想将每个元素的初始值减少1。我假设InitialMatrix是您已经正确定义的函数,而不是某个对象

这肯定会奏效:

InitialMatrix[3,3,3,3] + Table[If[RandomReal[]>psurvival,-1,0],{3},{3},{3},{3} ]
在版本8中,您可以将表函数替换为

-RandomVariate[BernoulliDistribution[1-psurvival], {3,3,3,3}]
如果张量总是n*n*n*n,那么你可以写一个小函数:

decrementInitial[n_Integer?Positive,p_?Positive]/; p<=1. :=
InitialMatrix[n,n,n,n] + Table[If[RandomReal[]>p,-1,0],{n},{n},{n},{n} ]
如果您想要重写初始矩阵,因为您想要在多个步骤中迭代生存函数,那么使用纯函数这样的方法适用于版本8

survivalFn[n_Integer?Positive,p_?Positive,steps_Integer?Positive]/; p<=1. :=
Nest[# + RandomVariate[BernoulliDistribution[1-p], {n,n,n,n}]& , 
InitialMatrix[n,n,n,n], steps]
或对于8之前的版本:

survivalFn[n_Integer?Positive,p_?Positive,steps_Integer?Positive]/; p<=1. :=
Nest[# - Table[If[RandomReal[]>p,-1,0],{n},{n},{n},{n} ]& , 
InitialMatrix[n,n,n,n], steps]
你问这个问题的方式告诉我,这就是你最终想要做的

根据用户825366的要求提供附加材料

我不确定你到底想知道关于这个函数的什么,但是让我们来看一些事情。首先是伯努利分布函数。报告说:

伯努利分布给出了概率为p的值x=1,概率为1-p的值x=0

你想要概率为0的psurvival和概率为1-psurvival的-1,所以本质上你有-BernoulliDistribution[1-psurvival]

接下来,嵌套函数请参见。这需要一些函数,将其应用于初始值(在本例中为InitialMatrix[3,3,3,3]),然后再次将其应用于第一次迭代的结果,并迭代适当的步数

在要嵌套的函数的定义中,通常使用纯函数。您应该阅读文档,然后


希望能有帮助。

谢谢大家。我找到了这个解决方案: 我认为这是最简单的一个,它正在发挥作用

SetAttributes[myFunction, Listable]
myFunction[x_] := 
 If[Random[] > psurvival, If [x - 1 < 0 , x , x - 1], x]
 myFunction[InitialMatrix[3, 3, 3, 3]] // TableForm

我用这个方法来解决这个问题

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

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

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

你确定吗?它所做的与你在问题中所做的完全不同。例如,在这里您调用Random[]64次,而在这里只调用了1次。为什么只有一次?对于每个x,函数都被调用。所以我想又叫了64次!从结果来看,这至少是我发现的!这是假设您的新函数列表替换了您之前的整个列表,您暗示调用了.x,但Random[]没有。在早期版本中,对于张量中的不同元素,Random[]可以是不同的。在新版本中,每个元素都是相同的。试试我上面的版本,看看效果如何。伙计,对不起,我太粗鲁了。我没有在这里发布关于mathematica的任何其他问题。我发这个是为了帮助一个朋友。从我的其他问题可以看出,我是一名程序员,但我也喜欢数学。如果我很粗鲁,我再次道歉。谢谢你的回答。你所花的时间,但这正是它应该工作的。我在一本书中找到了这个解决方案作为例子。