【问题标题】:Double for loop in MATLAB, storing the informationMATLAB中的双重for循环,存储信息
【发布时间】:2018-08-22 12:52:35
【问题描述】:

我在 MATLAB 中有两个 for 循环。

其中一个 for 循环导致将不同的变量插入到模型中,它们是 43,然后我有 5 个视野。

所以我估计模型 215 次。

我的问题是我想将它存储在 215x5 矩阵中,我有 x5 的原因是我估计 5 个变量,4 个是固定的,另一个来自 for 循环。

我尝试了两种方法,

首先,我创建了一个名为 out 的变量,

out=zeros(215,5);

第一个for循环是,

for i=[1,2,3,4,5];

第二个for循环是,

for  ii=18:60;

18:60 是我使用 XLS 读取定义变量的方式,例如它们以 (data:,ii) 的形式插入到模型中。

我尝试以两种方式存储数据,我想存储包含五个估计值的 OLS

首先,

out(i,:)=OLS;

此方法会创建一个 5 x 5 矩阵,其中包含每个层位 (18:60) 之一的估计值。

第二,

out(ii,:)=OLS;

这将存储每个变量 (18:60) 的变量,仅在一个范围内。

我想要一个矩阵来存储我的每个 (18:60) 在每个视野中的所有估计 OLS。

小例子

clear;

for i=[1,2,3,4,5];
    K=i; 
    for  ii=18:60
        x=[1,2,3,i,ii];
        out(i,:)=x;       
    end
end

所以变量 out 将存储1 2 3 5 60

我希望变量存储所有的组合

即

1 2 3 1 1
1 2 3 1 2
  ...
1 2 3 5 60

谢谢

【问题讨论】:

  • 请显示minimal reproducible example。将OLS 替换为rand(5,5)。代码的文字描述很难理解,特别是当你可以显示代码的时候!但是,现在看起来你有 2 个循环,大小为 45*5=215,每个循环调用 OLS,大小为 25。所以你需要 215x25,不是吗?
  • 我会努力的,谢谢。
  • 我添加了一个我认为还可以的例子!告诉我
  • 你能澄清一下你在文本中使用 5x5 矩阵的意思吗? x 是 1x5,不是 5x5
  • 请不要使用i 和ii。那只是要求混淆。为什么不ii 和jj?

标签: matlab for-loop


【解决方案1】:

最简单的解决方案是使用 3D 矩阵:

for jj=[1,2,3,4,5];
    K=jj;
    for ii=18:60
        x=[1,2,3,jj,ii];
        out(ii-17,jj,:)=x;       
    end
end

如果您现在重塑 out 矩阵,您将得到与 etmuse 答案中的第一个块相同的结果:

out = reshape(out,[],size(out,3));

(注意我用jj替换了i。i和ii太相似了,不能同时使用,这会导致混淆。循环索引最好使用不同的字母。另外,i可以使用,但它也是内置虚数 sqrt(-1)。所以我更喜欢使用ii 而不是i。)

【讨论】:

    【解决方案2】:

    正如您所发现的,仅使用一个循环变量来索引输出会导致大部分结果被覆盖,只留下相关循环的最终迭代的结果。

    有两种方法可以创建索引变量。

    1-您可以使用自变量,在循环之前初始化并在内部循环结束时递增。

    kk=1; 
    for i=1:5
        for ii=18:60
            %calculate OLC
            out(kk,:)=OLC;
            kk = kk+1;
        end 
    end
    

    2-使用i和ii的计算

    kk = i + 5*(ii-18)  
    

    (和以前一样在循环中使用,没有增量)

    【讨论】:

    • 感谢@AnderBiguri,在我的最小示例中,第一个选项似乎很好。
    • @AnderBiguri 谢谢,我换了个方式,我把i 和ii 放在计算中,忘了包括更高的起始值
    • 尽量不要使用 i 作为循环索引,因为它会覆盖 MATLAB 的虚数单位并且可能会导致难以找到错误。
    • 您还可以使用 MATLAB 内置函数 sub2ind 从 i 和 ii 计算 kk。
    • 请注意,第一个块和第二个块产生不同的输出顺序,因为 MATLAB 按列存储数据。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-02-03
    • 2020-03-09
    • 1970-01-01
    • 1970-01-01
    • 2013-03-29
    • 1970-01-01
    相关资源
    最近更新 更多