MatLab中最有效的多重“循环”

时间:2016-02-12 17:46:40

标签: matlab loops

我想对依赖于两个参数的统计过程进行多次模拟。我想模拟这些参数的多种组合。我正在尝试不同的方法但是我最终得到了太多的向量,或者只是最后一个向量的循环。

为简单起见,我的统计过程示例将是一个取决于rhosigma的AR(1)。

我将发布两个代码:

  • 第一个是错的(因为它只保存了最后的实现 我的循环)但我认为这是在告诉我要做什么
  • 第二部作品虽然“太长”而且不太专业

第一个代码:错误,但是说

%Parameters and random walk process
rho=linspace(0.1,0.9,5);
sigma=linspace(0.1,1,5)';
T=100;
epsilon=randn(T+1,1); 

%Interval for rhos and sigmas
rho_step=(rho(3)-rho(1))/3
sigma_step=(sigma(3)-sigma(1))/3


for rho=0.1:rho_step:0.95
    for sigma=0.001:sigma_step:0.4
        y=ones(T+1,1);  
        for i=2:T
     y(i)=exp(rho*log(y(i-1))+sigma*epsilon(i));
        end
    end
end

第二个代码:有效,但效率不高

%Parameters and random walk process
rho=linspace(0.1,0.9,5);
sigma=linspace(0.1,1,5)';
T=100;
epsilon=randn(T+1,1); 

%Interval for rhos and sigmas
rho_step=(rho(3)-rho(1))/5
sigma_step=(sigma(3)-sigma(1))/5

i=1;
for rho=0.1:rho_step:0.95
    r(1,i)=rho;
    j=1;
    for sigma=0.001:sigma_step:0.4
        s(j,1)=sigma;
        y=ones(T+1,1);  
        for k=2:T
            y(k)=exp(rho*log(y(k-1))+sigma*epsilon(k));
        end
        if i==1
            s1(:,j)=y;
        elseif i==2
            s2(:,j)=y;
        elseif i==3
            s3(:,j)=y;
        elseif i==4
            s4(:,j)=y;
        elseif i==5
            s5(:,j)=y;
        end
        j=j+1;

    end
    i=i+1;
end

任何人都有更有效的方法吗?我期待着提示:)

2 个答案:

答案 0 :(得分:0)

如果我理解正确,您希望对rhosigma的所有组合进行网格搜索,然后产生不同的y

在这种情况下,我建议使用combvec。好的一点是,这个代码很容易概括出更多参数的组合ifneedbe(但要注意组合爆炸;))。

%Param Init
rho=linspace(0.1,0.9,5);
sigma=linspace(0.1,1,5)';
T=100;
epsilon=randn(T+1,1); 

rho_step=(rho(3)-rho(1))/5
sigma_step=(sigma(3)-sigma(1))/5

k=2:T;

rhos=0.1:rho_step:0.95;
sigmas=0.001:sigma_step:0.4;


%generate all combinations of input vectors:
V = combvec(rhos,sigmas); 

res = [];


%gridsearch
for i = 1:size(V,2);
    y=ones(T+1,1);

    rho = V(1,i);
    sigma = V(2,i);
    for k=2:T
        y(k) = exp(rho*log(y(k-1))+sigma*epsilon(k));
    end

    %store result along with parameters
    res(i).y = y;
    res(i).rho = rho;
    res(i).sigma = sigma;

end

最佳, 星

答案 1 :(得分:0)

按照@excaza的建议,让我们使用与之前相同的初始化参数和间隔,但让我们有一个3D结果而不是长循环:

for j=1:5
    for i=1:5
        y=ones(T+1,j,i);  
        for k=2:T
            y(k,j,i)=exp(rho(j)*log(y(k-1,j,i))+sigma(i)*epsilon(k));
        end
    end
end