【问题标题】:Save to array in for loop, with steps - Matlab在for循环中保存到数组,步骤 - Matlab
【发布时间】:2015-05-13 13:06:37
【问题描述】:

好的,这有点难以解释,但我有一个包含数据的长 .txt 文件(只有一列)。它可能看起来像这样:

data=[18
32
50
3
19
31
48
2
18
33
51
4]

现在,每四个值(例如 18、19、18)代表相同的物理量,只是来自不同的测量值。现在,我希望 Matlab 取每四个值并将其放入数组 X=[18 19 18] 中,对于其他数量也是如此。

到目前为止,我的解决方案如下所示:

for i=1:3;
     for j=1:4:12;
        X(i)=data(j);
     end
end

...在这个例子中,因为每个数量有三个(因此i=1:3),总共有12个数据点(因此j=1:4:12,以4为单位)。 data 只是加载的数据点列表(这工作正常,我可以在命令窗口中测试它 - 例如data(2)=32)。

这样做的问题是,我的数组结果像 X=[18 18 18] - 即只有最后一次迭代被放入数组中

当然,最后,我想为所有点都这样做;将第 2 个、第 6 个和第 10 个数据点保存到 Y 等等。但我猜这只是有更多的for-loops。

我希望这个问题有意义。我想这是一个容易解决的问题。

【问题讨论】:

    标签: matlab for-loop


    【解决方案1】:

    你为什么不做呢?

    >> X = data(1:4:end)
    X =
    
       18
       19
       18
    
    >> Y = data(2:4:end)
    Y =
    
       32
       31
       33
    

    【讨论】:

    • 我根本不知道执行这样的步骤的可能性。谢谢!我想这是最简单的解决方案。谢谢! :)
    • @NielsMøller 我建议在您的情况下使用reshape 而不是这个,请参阅其他两个解决方案
    • 我想两者都可以很好地满足我的目的。我会看看在我的实际数据分析中什么是最强大的,无论如何谢谢!
    【解决方案2】:

    您可以重塑数据,然后将其拆分为不同的变量,或者只知道每一列是不同的变量(我现在假设每次测量发生的次数相同,即 length(data) 是 @ 的倍数987654322@)

    data = reshape(data, 4, []).';
    

    如果你愿意,现在就来

    X = data(:,1);
    Y = data(:,2);
    %// etc...
    

    但您也可以将其保留为 data 全部放在一个变量中,因为调用 data(:,1) 几乎不比 X 更麻烦。


    现在,您应该为此使用for-loops,但我要解决您的循环有什么问题以及如何使用循环来解决这个问题,纯粹是为了解释逻辑.你有一个嵌套循环:

    for i=1:3;
         for j=1:4:12;
            X(i)=data(j);
         end
    end
    

    现在您希望ij 将各自向前推进一个迭代。所以当i==1 然后j==1,当i==2 然后j==5 等等,但这根本不是发生的事情。为了更好地理解发生了什么,我建议您在每次迭代时打印出变量:

    disp(sprintf('i:  \tj:'));
    for i=1:3;
         for j=1:4:12;
            disp(sprintf('   %d\t   %d',i,j));
         end
    end
    

    打印出来

    i:      j:
       1       1
       1       5
       1       9
       2       1
       2       5
       2       9
       3       1
       3       5
       3       9
    

    你想要的是

    disp(sprintf('i:  \tj:'));
    for i=1:3;
         disp(sprintf('   %d\t   %d',i,4*i-3));
    end
    

    哪个输出:

    i:      j:
       1       1
       2       5
       3       9
    

    适用于您的问题:

    %// preallocation!
    X = zeros(size(data,1)/4, 1)
    for i=1:3
        X(i)=data(i*4 - 3);
    end
    

    或者您也可以单独保留ij 的计数:

    %// preallocation!
    X = zeros(size(data,1)/4, 1)
    i = 1;
    for j=1:4:end;
        X(i)=data(j);
        i = i+1;
    end
    

    【讨论】:

    • 第二次大声笑 :) 你更快了 +1
    • 其实你上次是 ;) 也为你 +1!
    • 感谢您解释问题所在!我明白了……我希望他们跳在一起……当然他们没有。 +1 :)
    • 无论如何我都删除了我的,以避免重复两次相同的答案。
    【解决方案3】:

    为了完整起见,您自己的解决方案应该已经阅读

     i = 0;
     for j=1:4:12;
        i = i+1;
        X(i)=data(j);
     end
    

    am304 的回答当然是更好的做法。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-07-28
      • 2021-08-01
      • 2014-04-30
      • 1970-01-01
      • 2023-03-19
      • 1970-01-01
      相关资源
      最近更新 更多