Wolfram mathematica 通过添加每次迭代的previus值并对初始值进行子结构,将表中的零件替换n次
我有下面的嵌套表Wolfram mathematica 通过添加每次迭代的previus值并对初始值进行子结构,将表中的零件替换n次,wolfram-mathematica,Wolfram Mathematica,我有下面的嵌套表 (myinputmatrix = Table[Nest[function, myinputmatrix[[i]][[j]], myinputmatrix[[i]][[j]][[2]][[2]] + myinputmatrix[[i]][[j]][[3]][[2]]], {i, Dimensions[myinputmatrix][[1]]}, {j, Dimensions[myinputmatrix][[2]]}]) // TableForm fq[k_?N
(myinputmatrix = Table[Nest[function, myinputmatrix[[i]][[j]],
myinputmatrix[[i]][[j]][[2]][[2]] +
myinputmatrix[[i]][[j]][[3]][[2]]], {i,
Dimensions[myinputmatrix][[1]]}, {j,
Dimensions[myinputmatrix][[2]]}]) // TableForm
fq[k_?NumericQ] := Count[RandomReal[{0, 1}, k], x_ /; x < .1]
function[x_List] := ReplacePart[
x, {{2, 1} -> x[[2]][[1]] - #1,
我的问题是,我只想添加上面粗体部分中的#1,而不仅仅是新的#1,我希望它为n次(嵌套函数次)添加所有的#1
如果我尝试这个函数
function[x_List] := ReplacePart[
x, {{2, 1} -> x[[2]][[1]] - #1, {2, 2} -> #1,
{3, 1} -> x[[3]][[1]] - #2, {3, 2} -> #2}] &[fq[x[[2]][[1]]],
fq[x[[2]][[1]]]];
因此,我有fq[k]的最后一个值.我想用0替换我表中的那个部分,但不起作用,因为我在嵌套列表中使用了它,我还想从我的初始表中减去那个部分,但我不确定哪种方法是最好的,我的想法是否正确。有人能帮我吗?如果我可以重申这个问题,希望c为我自己澄清这个问题。在
嵌套中的每次迭代中,您都不想添加当前(随机)的来自fq
的输出,但它的当前值和所有过去值的累积。但由于随机输出在每次迭代时都取决于输入矩阵,因此需要在同一次迭代中计算矩阵的随机数和当前值。
如果不是这样,你可以使用折叠
按照Sasha的建议重新启动fq
编辑,并进行一些类型检查,以避免输入错误的问题:
fq[k_Integer?Positive]:=RandomVariate[BinomialDistribution[k,.1]]
您可能需要添加一些其他错误检查代码。根据您的要求,类似这样的代码也可以
fq[0]:= 0;
fq[k_Real?Positive]:=RandomVariate[BinomialDistribution[Round[k],.1]]
您需要函数
将随机数作为参数。编辑1和2我已更改此函数的语法,以显式使用参数,而不是函数中原始问题的匿名函数。这应该避免一些语法错误。还请注意,我使用了“NumericQ
”而不是将“Real
”作为rv1
和rv2
参数的类型,因为它们可以在Nest
迭代开始时为整数
function[x_List, rv1_?NumericQ, rv2_?NumericQ] := ReplacePart[
x, {{2, 1} -> x[[2]][[1]] - rv1, {2, 2} -> rv1,
{3, 1} -> x[[3]][[1]] - rv2, {3, 2} -> rv2}]
然后使用With
将当前随机数作为局部常数传递给Nest
函数,该函数用于包含矩阵和随机变量累积的列表。我使用了myoutputmatrix
,因为我真的不喜欢一直重写现有表达式的想法。这只是我自己。不w、 另一件事是,您需要设置迭代次数n
。我已经将其设置为5,但如果您愿意,可以将其设置为函数中的参数(见下文)
第一个
存在,因为最后你只需要矩阵,而不是随机变量的累积
outputmatrix[input_List, n_Integer?Positive] /;
Length[Dimensions[input]] == 4 :=
Table[First[
Nest[With[{rv = fq[#1[[1]][[2]][[1]]]}, {function[#1[[1]], rv,
rv + #1[[2]]], rv + #1[[2]]}] &, {input[[i]][[j]], 0}, n]],
{i, Dimensions[input][[1]]}, {j, Dimensions[input][[2]]}]
outputmatrix[myinputmatrix, 10] // TableForm
编辑我现在已经检查过了,并且它运行了,但是请注意,输出中可能会出现负数,这不是您想要的,我不这么认为。我只是想提醒您注意一个事实,fq[k]
从BinomialDistribution[k,1/10]生成一个随机变量
,这是一种非常低效的方式。因此,您可以将fq
替换为fq[k.]:=随机变量[BinomialDistribution[k,.1]]
@Sasha我做fq是为了生成随机数的次数您的fq
实现通过某种程序模拟随机变量。我声称此随机变量具有与二项分布相同的概率分布[k,0.1]
。事实上,您可以通过在v8中评估DistributionItemSet[Table[fq[10],{10^4}],BinomialDistribution[10,0.1]
来说服自己。如果您最终将对该随机变量进行平均(即计算期望值),然后您可以将您的fq
替换为任何其他具有相同属性的代码distribution@Sasha非常感谢,我会检查:)谢谢你的回复。正如您所说,可能存在一些语法错误,即使我尝试了也无法更正。你能试着修一下吗?。顺便说一句,如果我正确理解了你在课文中所说的话,我想这就是我需要的。诺娜,对不起。将我提供的三位代码中的每一位放入笔记本的单独单元格中,并按顺序计算它们。哪个单元格出现语法错误?错误消息是什么?它是橙色的细胞支架还是别的什么?我现在正在工作,手头没有Mathematica安装,因此没有这些信息很难解决问题。今晚我可以看一下,但是我们有一位客人来了。错误在最后一位,我的输入矩阵正在被评估。问题是括号,但通过纠正我认为是问题的地方,我会犯更多的错误。我给你发了一张照片,可能比我的英文好:PI无法上传图片,对不起。我在我的google doc帐户中有它,如果你不想让我了解你的电子邮件,就没有必要检查它。很抱歉。现在再试一次-我想我在With[{},…]部分发现了错误。通常情况下,我使用特殊的双括号来表示列表部分,所以当我错过了结束方括号时,我会选择。
(myoutputmatrix = Table[ First[Nest[With[{rv=fq[#1[[1]][[2]][[1]] ]},
{function[#1[[1]],rv, rv+#1[[2]] ],rv+#1[[2]] }]&,
{ myinputmatrix[[i]][[j]], 0 }, 5]],
{i, Dimensions[myinputmatrix][[1]]}, {j,
Dimensions[myinputmatrix][[2]]}]) // TableForm
outputmatrix[input_List, n_Integer?Positive] /;
Length[Dimensions[input]] == 4 :=
Table[First[
Nest[With[{rv = fq[#1[[1]][[2]][[1]]]}, {function[#1[[1]], rv,
rv + #1[[2]]], rv + #1[[2]]}] &, {input[[i]][[j]], 0}, n]],
{i, Dimensions[input][[1]]}, {j, Dimensions[input][[2]]}]
outputmatrix[myinputmatrix, 10] // TableForm