Удаление операторов if при получении данных из таблицы
У меня есть следующая таблица
nc a b
0.9 <= nc 0.33 -0.45
0.5 <= nc < 0.9 0.95 -0.75
0.1 <= nc < 0.5 2.2 -0.97
nc < 0.1 1.18 -0.77
Это говорит о том, что если наблюдаемый облачный покров находится между указанными диапазонами, то значения a и b приведены в виде значений, представленных в таблице. Я написал некоторый код в Matlab, который должен возвращать эти значения, учитывая вектор значений NC:
nc = [0.1, 0.6, 0.5 ,0.2, 0.9];
a = nan(length(nc),1); % pre-allocate arrays
b = nan(length(nc),1);
for i = 1:length(nc)
if nc(i) >= 0.9;
ai = 0.33;
bi = -0.45;
elseif nc(i) >= 0.5 & nc(i) < 0.9
ai = 0.95;
bi = -0.75;
elseif nc(i) >= 0.1 & nc(i) < 0.5
ai = 2.2;
bi = -0.97;
elseif nc(i) < 0.1
ai = 1.18;
bi = -0.77;
end
a(i) = ai;
b(i) = bi;
end
Тем не менее, это кажется очень долгим способом сделать это. Кроме того, этот код в конечном итоге будет добавлен в ряд других функций, и я немного обеспокоен тем, что большое количество операторов if и цикл for в целом замедляют работу. Может ли кто-нибудь прокомментировать это или предложить более быстрый способ (если это полезно) сделать это?
2 ответа
Петли в matlab медленные. Вы можете улучшить свое решение, векторизовав операцию:
nc = [0.1, 0.6, 0.5 ,0.2, 0.9];
a = 2.2 * ones(length(nc),1); % by default in the 0.1-0.5 range
b = -0.97 * ones(length(nc),1);
f = find(nc >= 0.9);
a(f) = 0.33; b(f) = -0.45;
f = find(nc >= 0.5 & nc < 0.9);
a(f) = 0.95; b(f) = -0.75;
f = find(nc < 0.1);
a(f) = 1.18; b(f) = -0.77;
find
будет перечислять индексы элемента, которые соответствуют критериям, так что вы можете изменить элементы в других векторах.
Или вы можете использовать логическое индексирование, минуя необходимость использования find
функция:
nc = [0.1, 0.6, 0.5 ,0.2, 0.9];
a = 2.2 * ones(length(nc),1); % by default in the 0.1-0.5 range
b = -0.97 * ones(length(nc),1);
a(nc >= 0.9) = 0.33; b(nc >= 0.9) = -0.45;
a(nc >= 0.5 & nc < 0.9) = 0.95; b(nc >= 0.5 & nc < 0.9) = -0.75;
a(nc < 0.1) = 1.18; b(nc < 0.1) = -0.77;