我想通过以下与非中心卡方分布相关的规则生成一个长度为 N 的随机序列 x:
x n+1 ~χ ν 2 (λx n )
其中 ν 是表示自由度的给定常数,λ 也是预先指定的,λ 和 x n的乘积是非中心参数,x 1应该是给定的。我编写了以下代码来生成这样的序列和运行时间,x 1 =0.04,ν=0.005,λ=100 和 N=1e5:
tic;
N = 1e5;
x = zeros(1,N);
x(1) = 0.04;
nu = 0.005;
lambda = 100;
for i = 1:N-1
x(i+1) = ncx2rnd(nu,lambda*x(i));
end
toc;
为了说明我的问题,我测试了另一个与上面不同的示例。在这里,我考虑从分布 χ ν 2 (λ)生成 N=1e5 个样本,其中 ν=0.005 和 λ=100:
tic;
N = 1e5;
x = zeros(1,N);
nu = 0.005;
lambda = 100;
for i = 1:N
x(i) = ncx2rnd(nu,lambda);
end
toc;
tic;
N = 1e5;
nu = 0.005;
lambda = 100;
x = ncx2rnd(nu,lambda*ones(1,N));
toc;
这两种方法是等效的。然而,事实证明,不使用 for 循环的第二种方法比第一种方法快得多。两个例子的不同之处在于,在第二个例子中,生成一些样本的规则不需要先前样本的信息,而在第一个例子中不是这样,因此可以同时生成所有样本,而无需使用for循环。基于此,我想知道避免 for-loop 是否会加速代码执行。那么当对先前样本的依赖规则是明确的时,是否会有任何 MATLAB 内置函数来生成第一个示例中所示的随机序列而不使用 for 循环?如果规则是线性的,我知道该函数filter将是一个可能的选择,那么像第一个示例这样的情况呢?