Удаление операторов 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;
Другие вопросы по тегам