【问题标题】:Generating random numbers...Faster way?生成随机数...更快的方法?
【发布时间】:2023-03-22 20:41:01
【问题描述】:

在我的算法中使用 Run & Time 我发现将标准差添加到整数有点慢。首先我创建了大整数矩阵:

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

然后我添加标准偏差 (sigma = alpha * mu) 和误差(称重),如下所示:

%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;

有更快的方法吗?

【问题讨论】:

  • 您能否简要说明您要生成的值类型?
  • 我正在尝试模拟MultiheadWeigher。那些料斗里装满了材料(如意大利面)。 PianoSperimentale 的行是料斗可以假设的可能配置,列是料斗编号。我需要用整数(设置)创建一个矩阵,然后添加 StdDev 和错误来模拟所有东西:) 问题非常复杂,所以我希望我很清楚
  • 你能发布一个最小的工作示例吗?因此,只包括您想要加速的行,并确保我们拥有运行它们的所有信息。例如,在当前示例中,combinator 没有定义,但可能该部分甚至不相关。
  • @DennisJaheruddin 不幸的是,我无法制作一个更简单的工作示例(真正的算法要复杂得多)。 Combinator 是一个函数,你可以找到它here。我需要知道是否有什么东西可以加速 StdDev 和错误部分,或者可能是 for i=1:L 部分。

标签: matlab random


【解决方案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);

请注意,我将最后两行缩减为一行。

【讨论】:

  • 感谢@DennisJaheruddin,我修复了唯一的错误PesoIncertezza = abs((1+Incertezza).*PesoCestelli);,现在我用 487.7314 而不是 531.9824s 计算。
  • 我认为您还可以减少生成random = randn(sum(idx(:)), 1); 的随机数的数量,然后只使用random 而不是random(idx)
【解决方案2】:

您多次计算PesoCestelli&lt;0。您可以只计算一次并保存价值。您还创建了一组完整的随机数,但只使用其中的一个子集PesoCestelli&lt;0。您可以通过只创建所需数量的随机数来加快速度。

不清楚Alfa是什么,但如果是标量,而不是

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

这样做可能会更快

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

【讨论】:

  • 是的,`alpha 是一个标量。添加您的建议,我能够将计算时间从 531.9824 减少到 498.7509。
  • 请注意,当Alfa 是矩阵时,这也应该更快。
猜你喜欢
  • 2010-10-26
  • 2013-03-26
  • 2018-11-11
  • 2022-10-04
  • 1970-01-01
  • 1970-01-01
  • 2017-01-21
  • 2011-02-12
  • 2013-10-12
相关资源
最近更新 更多