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 が表に示されている値として与えられることを示しています。nc 値のベクトルを指定すると、これらの値を返す必要があるいくつかのコードを matlab に記述しました。

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

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 に答える