在MATLAB中保存嵌套for循环的输出

时间:2015-08-16 23:21:32

标签: matlab for-loop

我有以下代码,我希望输出矩阵Rpp为(10201,3)。我运行这段代码(需要一点时间)然后我检查Rpp的矩阵大小,我看到(1,3),我尝试了很多东西,我找不到任何正确的方法。代码的逻辑是取6个值(包含4个常数值和2个变量值(从101个值中选择))并对3个不同的i1进行计算,并将每个输出向量3存储在矩阵中(101 * 101 (这两个变量值的对))行和3(对于每个i1)列。

感谢您的帮助

    Vp1=linspace(3000,3500,101);
    Vp2=3850;
    rho1=2390;
    rho2=2510;
    Vs1=linspace(1250,1750,101);
    Vs2=2000;
    i1=[10 25 40];


    Rpp = zeros(length(Vp1)*length(Vs1),length (i1));

    for n=1:length(Vp1)*length(Vs1)
    for m=1:length (i1)
    for l=1:length(Vp1)
        for k=1:length(Vs1)


           p=sin(i1)/Vp1(l);
           i2=asin(p*Vp2);
           j1=asin(p*Vs1(k));
           j2=asin(p*Vs2);
           a=rho2*(1-2*Vs2^2*p.^2)-rho1*(1-2*Vs1(k).^2*p.^2);
           b=rho2*(1-2*Vs2^2*p.^2)+2*rho1*Vs1(k)^2*p.^2;
           c=rho1*(1-2*Vs1(k)^2*p.^2)+2*rho2*Vs2^2*p.^2;
           d=2*(rho2*Vs2^2-rho1*Vs1(k)^2);
           E=b.*cos(i1)./Vp1(l)+c.*cos(i2)/Vp2;
           F=b.*cos(j1)./Vs1(k)+c.*cos(j2)/Vs2;
           G=a-d*(cos(i1)/Vp1(l)).*(cos(j2)/Vs2);
           H=a-d*(cos(i2)/Vp2).*(cos(j1)/Vs1(k));
           D=E.*F+G.*H.*p.^2;
           Rpp=((b.*(cos(i1)/Vp1(l))-c.*cos((i2)/Vp2)).*F-(a+d*((cos(i1)/Vp1(l))).*(cos(j2)/Vs2)).*H.*p.^2)./D
        end
    end
    end
    end

2 个答案:

答案 0 :(得分:1)

试试这个。你2外环没有做任何事情。你从未使用mn所以我杀了那两个循环。此外,您只是在每个循环上覆盖Rpp,因此Rpp的初始化没有做任何事情。我添加了一个index var来将结果分配给我认为是Rpp正确部分的等式。

Vp1=linspace(3000,3500,101);
Vp2=3850;
rho1=2390;
rho2=2510;
Vs1=linspace(1250,1750,101);
Vs2=2000;
i1=[10 25 40];
Rpp = zeros(length(Vp1)*length(Vs1),length (i1));
index = 1;
for l=1:length(Vp1)
    for k=1:length(Vs1)    

        p=sin(i1)/Vp1(l);
        i2=asin(p*Vp2);
        j1=asin(p*Vs1(k));
        j2=asin(p*Vs2);
        a=rho2*(1-2*Vs2^2*p.^2)-rho1*(1-2*Vs1(k).^2*p.^2);
        b=rho2*(1-2*Vs2^2*p.^2)+2*rho1*Vs1(k)^2*p.^2;
        c=rho1*(1-2*Vs1(k)^2*p.^2)+2*rho2*Vs2^2*p.^2;
        d=2*(rho2*Vs2^2-rho1*Vs1(k)^2);
        E=b.*cos(i1)./Vp1(l)+c.*cos(i2)/Vp2;
        F=b.*cos(j1)./Vs1(k)+c.*cos(j2)/Vs2;
        G=a-d*(cos(i1)/Vp1(l)).*(cos(j2)/Vs2);
        H=a-d*(cos(i2)/Vp2).*(cos(j1)/Vs1(k));
        D=E.*F+G.*H.*p.^2;
        Rpp(index,:)=((b.*(cos(i1)/Vp1(l))-c.*cos((i2)/Vp2)).*F-(a+d*((cos(i1)/Vp1(l))).*(cos(j2)/Vs2)).*H.*p.^2)./D;
        index = index+1;
    end
end

结果:

>> size(Rpp)

ans =

       10201           3

答案 1 :(得分:0)

使用for循环的方式是错误的。您正在运行length(Vp1)*length(Vs1) * length (i1) * length(Vp1) * length(Vs1)次的计算。这是正确的方法。我将l更改为lll,因此我不会将其与数字1混淆。在第一个for循环的每次迭代中,您运行length(Vs1)次,并且您需要使用Rpp指定的行号将结果(1X3数组)分配给k+(lll-1)*length(Vp1)

for lll=1:length(Vp1)
    for k=1:length(Vs1)
       p=sin(i1)/Vp1(lll);
       i2=asin(p*Vp2);
       j1=asin(p*Vs1(k));
       j2=asin(p*Vs2);
       a=rho2*(1-2*Vs2^2*p.^2)-rho1*(1-2*Vs1(k).^2*p.^2);
       b=rho2*(1-2*Vs2^2*p.^2)+2*rho1*Vs1(k)^2*p.^2;
       c=rho1*(1-2*Vs1(k)^2*p.^2)+2*rho2*Vs2^2*p.^2;
       d=2*(rho2*Vs2^2-rho1*Vs1(k)^2);
       E=b.*cos(i1)./Vp1(lll)+c.*cos(i2)/Vp2;
       F=b.*cos(j1)./Vs1(k)+c.*cos(j2)/Vs2;
       G=a-d*(cos(i1)/Vp1(lll)).*(cos(j2)/Vs2);
       H=a-d*(cos(i2)/Vp2).*(cos(j1)/Vs1(k));
       D=E.*F+G.*H.*p.^2;
       Rpp(k+(lll-1)*length(Vp1),:)=((b.*(cos(i1)/Vp1(lll))-c.*cos((i2)/Vp2)).*F-(a+d*((cos(i1)/Vp1(lll))).*(cos(j2)/Vs2)).*H.*p.^2)./D;
    end
end