Как сделать for - if l oop с использованием массивов datetime в Matlab? - PullRequest
1 голос
/ 04 августа 2020

У меня есть массив datetime с часом восхода (whole_set_sr), массив datetime с часом заката (whole_set_ss) и массив datetime с партиями с данными всего календаря (tm_whole_date). Все они имеют одинаковое количество элементов, поэтому позиция 1 должна быть проверена на позицию 1, позиция 2 должна быть проверена с позицией 2 и т. Д.

Я пытаюсь создать двоичный массив с таким же количество элементов, в которых он возвращает 1, если элемент в tm_whole_date равен> = час восхода солнца (whole_set_sr) И <= час захода солнца (whole_set_ss), и 0, если он находится вне этих условий. </p>

Я попытался сделать следующее:

    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

Он дает мне массив (date_list), полный нулей, когда должны быть значения, отвечающие условию и возвращающие 1.

Кроме того, я нужно создать список с индексами позиций 1 значений во всем наборе datetime tm_whole_date. (чтобы узнать на основе индексов, какие элементы соответствуют критериям).

Я не знаю, что здесь не так, и был бы очень признателен за помощь.

Спасибо!

1 Ответ

2 голосов
/ 04 августа 2020

Гениальность 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_sr и whole_set_ss действительно содержат все datetime, потому что в противном случае сравнения tm_whole_date >= whole_set_sr и tm_whole_date <= whole_set_ss не дадут чего вы ожидаете.

Дополнительный бонус этого способа по сравнению с циклом и добавлением в массив состоит в том, что он намного намного быстрее.

Как только у вас есть логический массив , получить истинные индексы так же просто, как использовать find

date_indices = find(date_list);
...