2012-04-05 59 views
0

我是Mathematica的新手,我遇到了一件困难。我有这张桌子,产生10 000次13个数字(12个数字+1是一个起始数字)。我需要从所有10万个13号码创建一个直方图。我希望这很清楚,很难解释。如何从Mathematica中的FoldList创建的表中选择最后一列数字

这是表:

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个号码的表的表的结果 - 比这将是很容易的创建一个直方图。也许用“选择”?或者,也许你知道其他方法来解决这个问题。

+1

这是你想要的东西:'直方图[尾/ @ F]'? – mohit6up 2012-04-05 13:21:46

+0

Thx很多 - 我设法找到K = F [[All,13]]但是这样好多了,thx! – seniorita 2012-04-05 13:39:00

+0

'F [[All,-1]]'也可以。 – Heike 2012-04-05 13:53:48

回答

2

可以使用Part访问列表的不同部分或(取决于你所需要的零件)一些较专门的命令,如FirstRestMost和(一个你需要的)Last。正如评论中指出的,Histogram[Last/@F]Histogram[F[[All,-1]]]将正常工作。

虽然这不是你的问题的一部分,但我想指出一些你可以为你的具体问题做些事情,这会加速它的速度。您正在定义Mu,Sigma等10,000次,因为它们在Table命令中。您也重新计算 120,000次,即使它是一个常数,因为它在Table内的FoldList内。

在我的机器:

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)或者是基于局部常数的计算(beta)。 This question on the Mathematica StackExchange将有助于解释何时使用Module而不是BlockWith。 (我鼓励你进一步探索Mathematica StackExchange,因为大部分Mathematica专家现在都在这里进行讨论。)

对于你的特定代码,使用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甚至比以前的版本快一点。在我的系统Timing报告0.377秒 - 但从0.4秒这样的差异是不值得担心的。

enter image description here

因为你设置与SeedRandom种子,很容易验证,所有三个代码示例产生相同的结果。

0

使我的评论答案: Histogram[Last /@ F]

相关问题