我是Mathematica的新手,我有一件事情有困难。我有这个表生成10 000次13个数字(12个数字+ 1这是一个起始数字)。我需要从所有10 000个第13个数字创建一个直方图。我希望这很清楚,很难解释。
这是表格:
F = Table[(Xi = RandomVariate[NormalDistribution[], 12];
Mu = -0.00644131;
Sigma = 0.0562005;
t = 1/12; s = 0.6416;
FoldList[(#1*Exp[(Mu - Sigma^2/2)*t + Sigma*Sqrt[t]*#2]) &, s,
Xi]), {SeedRandom[2]; 10000}]
以下直方图的结果可能是一个表格,它将所有第13个数字都带到一个表格 - 而不是创建直方图非常容易。也许用“选择”?或许你知道解决这个问题的其他方法。
答案 0 :(得分:2)
您可以使用Part
或(根据您需要的部分)访问列表的不同部分,使用一些更专业的命令,例如First
,Rest
,{{1和(你需要的那个)Most
。如评论中所述,Last
或Histogram[Last/@F]
可以正常使用。
虽然这不是你问题的一部分,但我想指出一些你可以为你的具体问题做的事情,这将极大地加速它。您定义了Histogram[F[[All,-1]]]
,Mu
等10,000次,因为它们位于Sigma
命令中。您也在重新计算Table
120,000次,即使它是常量,因为您将其放在Mu - Sigma^2/2)*t + Sigma*Sqrt[t]
内的FoldList
内。
在我的机器上:
Table
这个替代方案快十倍:
F = Table[(Xi = RandomVariate[NormalDistribution[], 12];
Mu = -0.00644131;
Sigma = 0.0562005;
t = 1/12; s = 0.6416;
FoldList[(#1*Exp[(Mu - Sigma^2/2)*t + Sigma*Sqrt[t]*#2]) &, s,
Xi]), {SeedRandom[2]; 10000}]; // Timing
{4.19049, Null}
我将F = Module[{Xi, beta}, With[{Mu = -0.00644131, Sigma = 0.0562005,
t = 1/12, s = 0.6416},
beta = (Mu - Sigma^2/2)*t + Sigma*Sqrt[t];
Table[(Xi = RandomVariate[NormalDistribution[], 12];
FoldList[(#1*Exp[beta*#2]) &, s, Xi]), {SeedRandom[2];
10000}] ]]; // Timing
{0.403365, Null}
用于本地常量,With
用于Module
(Table
)中重新定义的其他内容,或者是基于局部常量的计算( Xi
)。 This question on the Mathematica StackExchange将有助于说明何时使用beta
与Module
与Block
的对比。 (我鼓励您进一步探索Mathematica StackExchange,因为现在大多数Mathematica专家都在这里。)
对于您的特定代码,并不真正需要使用With
。不要使用Part
,只需使用FoldList
即可。它仅保留折叠中的最终数字,这与Fold
输出中的最后一个数字相同。所以你可以试试:
FoldList
以这种方式计算FF = Module[{Xi, beta}, With[{Mu = -0.00644131, Sigma = 0.0562005,
t = 1/12, s = 0.6416},
beta = (Mu - Sigma^2/2)*t + Sigma*Sqrt[t];
Table[(Xi = RandomVariate[NormalDistribution[], 12];
Fold[(#1*Exp[beta*#2]) &, s, Xi]), {SeedRandom[2];
10000}] ]];
Histogram[FF]
甚至比以前的版本快一点。在我的系统上FF
报告0.377秒 - 但是0.4秒的这种差异几乎不值得担心。
因为您使用Timing
设置种子,所以很容易验证所有三个代码示例都会产生完全相同的结果。
答案 1 :(得分:0)
让我的评论回答:
Histogram[Last /@ F]