从表中获取数据时删除if语句

时间:2013-05-17 11:13:18

标签: matlab if-statement vectorization

我有下表

       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 个答案:

答案 0 :(得分:1)

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将列出符合条件的元素的索引,因此您可以修改其他向量中的元素。

答案 1 :(得分:1)

或者您可以使用逻辑索引,绕过需要使用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;