2013-09-30 82 views
2

使用运行&时间在我的算法上我发现在向整数添加标准偏差时有点慢。首先,我所创建的大整数矩阵:生成随机数...更快的方法?

NumeroCestelli = 5; 

lover_bound = 0; 
upper_bound = 250; 
steps = 10 ; 

Alpha = 0.123 

livello = [lover_bound:steps:upper_bound]; 
L = length(livello); 

[PianoSperimentale] = combinator(L,NumeroCestelli,'c','r'); 
for i=1:L 
    PianoSperimentale(PianoSperimentale==i)=livello(i); 
end 

然后我添加标准偏差(标准差=阿尔法*亩)和误差(秤的)类似这样的:

%Standard Deviation 
NumeroEsperimenti = size(PianoSperimentale,1); 

PesoCestelli = randn(NumeroEsperimenti,NumeroCestelli)*Alfa; 
PesoCestelli = PesoCestelli.*PianoSperimentale + PianoSperimentale; 
random = randn(NumeroEsperimenti,NumeroCestelli); 
PesoCestelli(PesoCestelli<0) = random(PesoCestelli<0).*(Alfa.*PianoSperimentale(PesoCestelli<0) + PianoSperimentale(PesoCestelli<0)); 

%Error 
IncertezzaCella = 0.5*10^(-6); 
Incertezza = randn(NumeroEsperimenti,NumeroCestelli)*IncertezzaCella; 
PesoIncertezza = PesoCestelli.*Incertezza+PesoCestelli; 
PesoIncertezza = (PesoIncertezza<0).*(-PesoIncertezza)+PesoIncertezza; 

是否有快速办法?

+0

你能提供一个你想要产生什么类型的值的简洁描述吗? –

+0

我试图模拟[MultiheadWeigher](http://www.ishidaeurope.com/images/articles/CCW_em.jpg)。这些料斗装满了材料(如面食)。 “PianoSperimentale”行是可能的配置,而不是跳跃者可以设想的,列是跳跃者数量。我需要creare矩阵整数(设置),然后添加StdDev&错误模拟所有的东西:) 这个问题是非常复杂的,所以我希望我很清楚 – gmeroni

+0

你可以发布一个最小的工作示例?所以只包括你想要加速的行,并确保我们有所有的信息来运行它们。在当前的例子中,'combinator'没有被定义,但可能那个部分甚至不相关。 –

回答

1

它,但我敢打赌,消除所有你做的重复计算会导致加速。我试图删除其中的一些:

PesoCestelli = randn(NumeroEsperimenti,NumeroCestelli)*Alfa; 
PesoCestelli = (1+PesoCestelli).*PianoSperimentale; 
random = randn(NumeroEsperimenti,NumeroCestelli); 
idx = PesoCestelli<0; 
PesoCestelli(idx) = random(idx).*(1+Alfa).*PianoSperimentale(idx); 

%Error 
IncertezzaCella = 0.5*10^(-6); 
Incertezza = randn(NumeroEsperimenti,NumeroCestelli)*IncertezzaCella; 
PesoIncertezza = abs((1+PesoCestelli).*Incertezza); 

请注意,我将最后两行减少到一行。

+0

谢谢@DennisJaheruddin,我修正了唯一的错误'PesoIncertezza = abs((1 + Incertezza)。* PesoCestelli);'现在我计算在487.7314而不是531.9824s。 – gmeroni

+1

我想你也可以减少你产生的随机数的数量'random = randn(sum(idx(:)),1);'然后用'random'代替'random(idx)'。 – StrongBad

1

您计算PesoCestelli<0许多次。你可以计算一次并保存价值。您还可以创建一整套随机数字,但只能使用其中的一个子集,其中PesoCestelli<0。您可以通过创建您需要的随机数字来加快速度。

目前尚不清楚什么Alfa是,但如果它是一个标量,而不是

Alfa.*PianoSperimentale(PesoCestelli<0) + PianoSperimentale(PesoCestelli<0) 

,没有足够的信息对我来说,测试它可能会更快做

(1+Alfa).*PianoSperimentale(PesoCestelli<0) 
+0

是的,'alpha是一个标量。添加您的建议我能够将计算时间从531.9824减少到498.7509。 – gmeroni

+0

请注意,当'Alfa'是矩阵时,这应该也会更快。 –