如何在Matlab中使用日期时间数组进行for-if循环?

时间:2020-08-04 14:35:26

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

我有一个带有日出时间(whole_set_sr)的日期时间数组,一个带有日落小时(whole_set_ss)的日期时间数组,以及一个带有完整日历数据的日期时间数组(tm_whole_date)。它们都具有相同数量的元素,因此位置1应该相对于位置1进行测试,位置2应该使用位置2进行测试,依此类推。

我正在尝试创建一个具有相同数量元素的二进制数组,如果tm_whole_date中的元素> =太阳升起时间(whole_set_sr)AND <=太阳升起时间(whole_set_ss),并且它返回1,并且如果超出这些条件,则为0。

我尝试了以下操作:

    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)。

此外,我需要在整个日期时间tm_whole_date的整个集合中创建一个包含1个值的位置的索引的列表。 (根据索引知道哪些元素符合条件)。

我不知道这里出了什么问题,我将不胜感激。

谢谢!

1 个答案:

答案 0 :(得分:2)

关于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 >= whole_set_srtm_whole_date <= whole_set_ss的比较将不会产生您期望的结果。

通过这种方式在循环和附加到数组上的额外好处是它的速度大大快了。

有了逻辑数组后,获取正确的索引就像使用find

date_indices = find(date_list);