在Matlab中更快的指数计算

时间:2017-02-06 19:47:49

标签: matlab performance exp

我有以下代码需要计算3D矩阵的指数。它工作正常,但我想知道是否有更快的速度。 (它目前需要超过2秒。如果可能,我试图让它在半秒内运行。)

Result = zeros(200,50,300);
for i=1:30
   delta = i*randn(200,50,300);
   X = exp(1i*2*pi*delta);
   Result = Result + X;
end

任何帮助将不胜感激。 提前谢谢。

1 个答案:

答案 0 :(得分:2)

首先,我不认为这个计算序列可以更快地完成。以下可能会快一点,但肯定不是你想要的数量:

dim    = [200,50,300]; % given
N      = prod(dim);    % total number of samples
M      = 30;           % number of iterations in for-loop
phase  = bsxfun(@times, randn(N,M), [1:M]); % scaled phases
Result = reshape(sum(exp(1i*2*pi*phase),2), dim); % sum of exp and reshape

编辑1 开始:

正如@horchler在下面的评论中所指出的,这种方法实际上比R2016b上的原始方法慢。他还建议使用更快的随机生成方案,我试过并观察到了显着的改进。通过消除一些临时变量也可以获得类似的改进量。

s = RandStream('dsfmt19937','Seed',1);
for i=1:30
    Result = Result + exp(1i*2*pi*i*randn(s,200,50,300));
end

我在R2016b的各个优化阶段的时序结果如下:

  • 原始代码:4.3 s
  • 我的原始提案:4.5 s
  • 简单随机数生成的原始代码:3.8 s
  • 上面删除了临时变量:3.2 s

其他随机数生成方案,例如shr3cong,也可以尝试进一步加快速度。

编辑1 :结束

另一种方法: 让我建议一种不同的方法,以不同的方式产生所需的输出,但它具有相同的统计特性 作为你的输出。

Result = sqrt(15) * (randn(200,50,300) + 1i*randn(200,50,300));

我们现在试着证明这一点。首先,我们可以争辩说,由于输出是30个随机过程的总和,通过中心极限定理(CLT),输出将是高斯分布的。 CLT仅适用于松散意义,因为30不是无限的,并且进程不是相同分布的。但正如我们将很快看到的那样,它仍然是一个非常好的近似值。此外,由于超过30个独立复数的总和,实数和虚数项也是独立的。我不打算在这里证明这一点,但我们会做一些统计检查。

一旦我们确定了独立的高斯分布,分析变得更加简单。高斯分布可以仅通过两个参数来定义:均值和方差。让我们单独估算一下:

意思是:由于阶段是随机分布的并覆盖了比2*pi大得多的区域,因此实数和虚数项的均值为0.

方差:大随机相位分布的正弦/余弦方差为0.5。因此,30个正弦/余弦之和的方差为15.这就是公式中sqrt(15)项的原因。

统计分析: 为了验证所有上述假设和近似值是否合理,我们进行一些统计分析。

首先,让我们检查分布:

figure;
xGrid = (-15 : 0.1 : 15);
histogram(real(Result(:)), xGrid, 'Normalization','pdf', 'EdgeColor', 'None');
hold on;
plot(xGrid, normpdf(xGrid, 0, sqrt(15)), 'r', 'LineWidth', 2);
legend({'Simulated histogram', 'Gaussian pdf'});
title('Distribution of the real term');

enter image description here

虚数项的直方图(此处未显示)也看起来相同。该测试验证了具有零均值和15方差的高斯分布假设。

最后,让我们检查实际和虚构术语之间的独立性。

covar = cov(real(Result(:)), imag(Result(:)));
disp(covar);
%   14.9968    0.0036
%    0.0036   14.9936    

可以注意到两件事:(1)如前所述,实数和虚数项的方差均约为15.(2)实数和虚数项之间的协方差与个体方差相比要小得多。这支持了他们独立的论点。