【问题标题】:Divide data array in more efficient way Matlab以更有效的方式划分数据数组Matlab
【发布时间】:2017-02-02 13:48:54
【问题描述】:

我有一大堆数据(可能有成千上万个值)。此数据是收集在一个数组中的实验结果:

 data = [2.204000000000000
   2.202000000000000
   2.206000000000000
   2.201000000000000
   ...
   ]

我有相同大小的时间数组t

t = [1 2 3 ... 65 66 1 2 3 4 ... 72 73 1 2 3 ... 75]';

这个t 是收集数据的时间。所以t = 1:66 - 是第一个实验,然后t 值再次从1 开始 - 它是2个实验的数据等等。 我想要做的:将数据除以特定的时间间隔:

t<=1
1<t<=4
4<t<=6
t>6

我往这边走

part1 = []; part2 = []; part3 = []; part4 = [];
for ii = 1: size(data,1) 
    if (t(ii)) <=1      % collect all data corresponds to t<=1
        part1 = [part1; ii];
    elseif (t(ii) >1 &&  t(ii) <=4 )
        part2 = [part2; ii];
    elseif (t(ii) >4 &&  t(ii) <=6 )
        part3 = [part3; ii];
    else
        part4 = [part4; ii];
    end
end
data1 = data(part1);
data2 = data(part2);
data3 = data(part3);
data4 = data(part4);

效果很好,但速度很慢,因为:

  1. 我无法预先分配 part1 part2 part3 part4 - 我不知道它们的大小;
  2. 它使用for循环。

我们可以用更优雅、更快捷的方式来做吗?


现在我有了一个想法,即使用一个元胞数组而不是 4 个不同的元胞数组。现在我使用part{1} part{2} ... part{4}。所以我可以将其预分配为part = cell(4,1);

【问题讨论】:

    标签: arrays matlab for-loop vectorization


    【解决方案1】:

    您可以使用逻辑索引改进您的代码。

    我强烈建议您阅读以下参考资料:


    以下代码使用逻辑索引来执行您想要的操作,无需任何循环,因此无需预先分配任何数组:

    data1 = data(t <= 1);
    data2 = data((t > 1) && (t <= 4));
    data3 = data((t > 4) && (t <= 6));
    data4 = data(t > 6);
    

    逻辑索引就像一个红绿灯:它允许数组中值为1 的元素继续运行,同时停止那些值为0 的元素。

    Matlab 在这类任务中非常强大。

    【讨论】:

    • 啊真的,我只是想多了 :) 简单的解决方案!我所有的误解都是因为我在任何地方都使用单元格数组(为了可读性而将其替换为有问题的数字数组)。所以这个t{1,1}(1:end) 等等只是让我的眼睛乱七八糟,我看不到这个:) 谢谢!
    • @Mikhail_Sam 感谢您抽出宝贵时间提供代码的简化版本。是的,正如您所提到的,与元胞数组相比,它对数值数组的混淆要少一些,但它在两者上都运行良好。我用更有趣的链接更新了我的答案,您可能会觉得这些链接对您有所帮助。干杯!
    猜你喜欢
    • 2021-11-06
    • 2013-06-06
    • 2014-12-17
    • 2020-11-19
    • 2018-02-02
    • 2021-01-24
    • 2012-07-18
    • 1970-01-01
    • 2017-09-23
    相关资源
    最近更新 更多