我有下表
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循环会降低速度。任何人都可以评论这个或建议更快的方式(如果有用)这样做?
答案 0 :(得分:1)
循环很慢。您可以改进矢量化操作的解决方案:
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;