Wolfram mathematica 根据相同的随机值更改表中的两个不同部分

Wolfram mathematica 根据相同的随机值更改表中的两个不同部分,wolfram-mathematica,Wolfram Mathematica,我试图每次根据一个随机变量更改表中的两行,例如,如果一个随机数>0.5,则更改其中一行的值为+1,另一行的值为-1,否则什么也不做。我尝试了以下代码,但我感到困惑,有人能帮我吗 InitialMatrix[3, 3, 3, 3] + MapAt[f, MapAt[g, Table[0, {3}, {3}, {3}, {3}], Flatten[Table[{i, j, 1, k}, {i, 3}, {j, 3}, {k, 3}], 2]], Flatten[Table[{

我试图每次根据一个随机变量更改表中的两行,例如,如果一个随机数>0.5,则更改其中一行的值为+1,另一行的值为-1,否则什么也不做。我尝试了以下代码,但我感到困惑,有人能帮我吗

InitialMatrix[3, 3, 3, 3] + 
  MapAt[f, MapAt[g, Table[0, {3}, {3}, {3}, {3}],

    Flatten[Table[{i, j, 1, k}, {i, 3}, {j, 3}, {k, 3}], 2]], 
   Flatten[Table[{i, j, 2, k}, {i, 3}, {j, 3}, {k, 3}], 2]] // TableForm

f[x_] := If[RandomReal[] > 0.5, g[x] = If[x > 0, x - 1, x]; 
  If[g[x] > 0, x + 1, x], x]
非常感谢

编辑:更改的要求

我有一个四维表,我想改变其中的值

我的桌子是空的

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

  ReplacePart[ Table[Floor[Divide[dogpopulation/cellsno,  9]], 
    {x}, {y}, {age},  {disease}], {{_, _, 1, _} ->   0, {_, _, 3, _} -> 6}];
我试图每次根据一个随机变量更改每个子矩阵中的前2行

例如,我希望如果一个随机数>0.4,则将第一行中的第一个元素的值更改为+1,将第二行中的第一个元素的值更改为-1,否则保持该值不变


我想用不同的随机数检查第一行中的每个元素,如果条件为真,则同时更改第一行和第二行。我可以这样做吗?

这个答案上有“我在工作时没有Mathematica检查语法”的提示

f[mylist_List, rowPlus_Integer, rowMinus_Integer] := 
  Module[{temp = mylist},
    If[1 <= rowPlus <= Length@temp && 1 <= rowMinus <= Length@temp,
      If[ RandomChoice[{True, False}], 
        temp[[rowPlus]]++;
        temp[[rowMinus]]--];
      Return@temp,
    (*else*)
       Print@"Wrong row value"; Abort[]]]

a = IdentityMatrix[3]
a = f[a, 1, 2]
(*
{{2, 1, 1}, {-1, 0, -1}, {0, 0, 1}}
*)
a = IdentityMatrix[3]
a = f[a, 1, 2]
(*
{{1, 0, 0}, {0, 1, 0}, {0, 0, 1}}
*)
@贝里萨里乌斯的回答非常有效,更加优雅,几乎可以肯定比我的更有效。但是,使用
ArrayFlatten
命令()或
Join
命令(),您可能会发现一种更容易理解的替代方法

第一个选项假设您想要问题中的代码所要求的内容,而不是文本中所述的内容。然后,您将使用以下内容:

nonisFunction[mylist_List,firstrowsub_?VectorQ, 
secondrowsub_?VectorQ,cutoff_Real]/; Length[Dimensions[mylist]]==4  :=
Table[
If[RandomReal[]>cutoff, 
    Join[{firstrowsub},{secondrowsub},Drop[mylist[[i,j]],2] ],
    mylist[[i,j]] ], 
    {i,Dimensions[mylist][[1]]}, {j,Dimensions[mylist][[2]]} ]
这样可以有效地将每个子矩阵重新缝合在一起,如果超过截止值,则每次替换两行时都会替换子矩阵,如果未超过截止值,则保留子矩阵

如果您希望增加和减少两行(即文本问题而不是您提供的代码),那么类似的解决方案只需要添加,而不是加入
Join
。因为
Plus
可列表的
,所以它应该在每个子矩阵的行上遍历要添加的向量

nonisFunction[mylist_List,cutoff_Real]/; Length[Dimensions[mylist]]==4  :=
Table[
mylist[[i,j]] +
 If[RandomReal[]>cutoff, {1,-1,0,0}, {0,0,0,0} ],
    {i,Dimensions[mylist][[1]]}, {j,Dimensions[mylist][[2]]} ]
这种基于表的编程风格更像您习惯的过程式编程风格(对于循环,四次嵌套
),但它更有效,我得出的结论是,您更有可能理解代码

编辑:在评论中回答诺尼问题的补充材料 要运行此代码(以上面的第二个示例函数作为此过程的示例),首先要通过将上述代码复制并粘贴到Mathematica笔记本中来定义函数。然后定义输入矩阵并为其命名。e、 g

myinputmatrix = RandomInteger[{10,100},{4,4,4,4}];
最后,使用适当的参数调用
nonisFunction

nonisFunction[myinputmatrix,0.4]

如果这没有帮助,我推荐视频教程

这感觉很像你的最后一个问题。什么是
InitialMatrix
?这是我自己的表格,在mathematica上没有什么,它只是我给它起的一个名字it@noni您的编辑完全改变了问题的含义,使我的答案无法使用。以后,请保持原来的问题不变,并在最后添加一个编辑部分,以便将来的读者能够理解为什么有些答案是错误的there@noni-你为什么键入Divide[dogproduction/cellsno,9]而不是(dogproduction/cellsno)/9?非常感谢你的回答,但由于我是mathematica的新手,你能解释一下这是怎么回事吗?@user如果你把问题集中在一段代码上,我可以解释一下。Mathematica是一个相当复杂的野兽,可以解释那里发生的一切。你应该先阅读帮助文档,然后问你不懂的问题。我还能问你什么?这里有RandomChoice[True,False],然后是temp[rowPlus]++temp[[rowPlus]]——这意味着每次randomchoise为True时,它都会更改每行中的所有元素。。在我的例子中,我想检查一个随机数是否大于0.4(例如),如果大于0.4,我想在第一行中加1,从第二行中减去1,但不是同时对一行中的所有元素。。我可以这样做吗?非常感谢您的回复。很抱歉删除了我之前的问题!!我试着用你的代码做一个四维表,但我做不到。你能帮我吗?另外,你能给我解释一下这个代码是什么吗[1非常感谢您的回答,并请原谅我愚蠢的问题:我如何运行此代码?我想我理解它的意思,但我无法运行它。我是Mathematica的新手,我正在努力解决所有问题…再次感谢您非常感谢!!谢谢!!我检查了您的代码,我认为如果一个数字大于一个随机数,那么它就会改变将第一行的所有元素的值设为+1,将第二行的所有元素的值设为-1。我们可以对该行的每个元素而不是子矩阵的整行执行此操作吗?我的意思是,如果子矩阵中的一行是{2,3,4,5},而第二行是{1,2,3,4}[如果随机数>0.4,{2+1,(如果随机数>0.4,3+1,3),如果(random>0.4,4+1,4),…}第二行{2(如果第一行中的元素为3},3(如果第一行中的第二元素为4,3)…这是可能的,但我正在工作,午餐时间已经结束(澳大利亚时间).所以我最早要到今晚才能帮你。我想如果你能自己做这个练习会更好。这基本上是我在上面答案中的两个案例的合并。如果你花时间去理解你试图首先解决的问题,你会在第一时间从某人那里得到答案(模拟不同地点的人口)然后问一个适当的问题。非常感谢,我将尝试用mys来做
myinputmatrix = RandomInteger[{10,100},{4,4,4,4}];
nonisFunction[myinputmatrix,0.4]