0

我有下表

       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 循环通常会减慢速度。任何人都可以对此发表评论或建议一种更快的方法(如果有用的话)吗?

4

2 回答 2

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;
于 2013-05-17T11:46:17.120 回答
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将列出与条件匹配的元素的索引,因此您可以修改其他向量中的元素。

于 2013-05-17T11:40:17.180 回答