Вы неправильно понимаете, как логическое индексирование работает в MATLAB, но, кроме этого, у вас есть правильная идея.
Выражение (Minute(1) | Minute(2) | Minute(3) | Minute(4))
будет делать логическое or
для скалярных элементов. Поскольку все они ненулевые (и скаляры), результат всегда равен 1. Поскольку ваша минута редко равна 1, вероятно, ничего не будет выбрано.
Выражение Data.ensemble(:, 5) == Month
создает логический массив с тем же количеством элементов, что и строк в Data.ensemble
. Некоторые из элементов могут быть 0, если данных больше, чем показано в примере. Это выражение, вероятно, дало вам предупреждение, так как логическое значение полученного массива неоднозначно:
- Вы можете установить его на 1, если какой-либо элемент 1
- Вы можете установить его на 0, если любой элемент равен 0
- Вы можете установить его в 1, если массив просто не пустой
- Любой другой критерий, который имеет смысл в контексте ...
Даже если бы конечное условие вышло 1, выражение Temperature = Data.ensemble(:, 10)
просто установило бы Temperature
на весь 10-й столбец.
Вместо этого вы хотите применить исправленную версию этого оператора if
к каждой отдельной строке данных. Хитрость заключается в том, чтобы использовать логический массив для кодирования вашего состояния, а затем использовать этот логический массив в качестве индекса:
month_is_12 = (Data.ensemble(:, 5) == Month);
minute_is_good = ismember(Data.ensemble(:, 8), Minute);
ismember
проверит каждый элемент 8-го столбца относительно массива Minute
, чтобы определить, соответствует ли он любому из элементов. Это эквивалентно выполнению
minute_is_good = ((Data.ensemble(:, 8) == Minute(1)) | (Data.ensemble(:, 8) == Minute(2)) | (Data.ensemble(:, 8) == Minute(3)) | (Data.ensemble(:, 8) == Minute(4)));
Не только ismember
выглядит лучше, но и позволяет вам изменять размер Minute
без необходимости изменять ваш фактический код.
Теперь вам не нужно if
, чтобы получить нужные данные:
Temperature = Data.endemble(month_is_12 & minute_is_good);