【问题标题】:How to make a for - if loop using datetime arrays in matlab?如何在 matlab 中使用 datetime 数组创建 for - if 循环?
【发布时间】:2020-11-24 16:26:30
【问题描述】:

我有一个包含日出时间 (whole_set_sr) 的日期时间数组、一个包含日落时间 (whole_set_ss) 的日期时间数组和一个包含整个日历数据 (tm_whole_date) 的日期时间数组。它们都具有相同数量的元素,因此位置 1 应针对位置 1 进行测试,位置 2 应与位置 2 进行测试,依此类推..

我正在尝试创建一个具有相同数量元素的二进制数组,如果 tm_whole_date 中的元素 >= 太阳升起时间 (whole_set_sr) 并且

我尝试了以下方法:

    date_list = [];
date_indexes = [];
numel(whole_date)

for i = 1:numel(tm_whole_date)
    if (tm_whole_date(i,1) >= whole_set_sr(i,1)) && tm_whole_date(i,1) <= whole_set_ss(i,1)
            bin_x = 1
    else
        bin_x = 0
    end

    date_list(i) = bin_x
end

当应该有满足条件的值并返回 1 时,它给了我一个充满零的数组 (date_list)。

另外,我需要创建一个列表,其中包含 1 个值在整个 datetime tm_whole_date 集合中的位置索引。 (根据索引了解哪些元素符合标准)。

我不知道这里出了什么问题,非常感谢一些帮助。

谢谢!

【问题讨论】:

    标签: arrays matlab datetime for-loop if-statement


    【解决方案1】:

    MATLAB 的绝妙之处在于您可以在不循环的情况下对整个数组进行操作。

    after_sunrise = tm_whole_date >= whole_set_sr;
    before_sunset = tm_whole_date <= whole_set_ss;
    date_list = after_sunrise & before_sunset;
    

    应该是所有你需要得到一个逻辑数组(真假数组/0和1)

    或者在一行中:

    date_list = tm_whole_date >= whole_set_sr  & tm_whole_date <= whole_set_ss;
    

    确保whole_set_srwhole_set_ss 实际上包含整个日期时间,否则tm_whole_date &gt;= whole_set_srtm_whole_date &lt;= whole_set_ss 比较不会产生您期望的结果。

    与循环和附加到数组相比,这种方式的额外好处是它快得多

    获得逻辑数组后,获取正确的索引就像使用 find 一样简单

    date_indices = find(date_list);
    

    【讨论】:

    • 非常感谢!它以更简单的方式解决了我的问题。
    猜你喜欢
    • 2013-09-16
    • 2012-09-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-08-11
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多