0

構造に編成されたデータセットがあります。多数のセンサーがあり、それぞれに から までの 4 つの読み取り値がaあるdため、構造体には、、、、およびDが含まれます。測定値の分布の外れ値を探しています。データをプロットして制限を選択し、これらの制限外の読み​​取り値を持つセンサー ID を識別して配列に保存するスクリプトを作成しました。D.sensorIDD.aD.bD.cD.d

    aMax = 5;
    aHighIndices = find(D.a>aMax);
    aMin = 0;
    aLowIndices = find(D.a<aMin);
    aHighLength = size(aHighIndices);
    for i = 1:aHighLength
    A_hi(i) = D.sensorID(aHighIndices(i));
    end

これが繰り返されます: a_Hia_Lowb_Hiなど...そして、結果をまとめてパッチします:

outliers = [A_hi; A_low; B_low; B_hi; C_low; C_hi; D_low; D_hi];

これを行うためのより簡潔な方法はありますか?

4

1 に答える 1

3

1.測定値の 各配列 (ベクトル) を 2 回繰り返します。1 回目findは高い外れ値を見つけるため、もう 1 回は低い外れ値を見つけるためです。次の方法で、1回の繰り返しで実行できます。

a_outlier_indices = find(D.a < aMin | D.a > aMax);

2. もう 1 つ: MATLAB で言えば、一般的にforかなりコストがかかるため、MATLAB 構文の組み込み機能を使用して同じ結果を生成してみてください。より具体的には、MATLAB では、インデックスのベクトルを使用して、別のベクトルからサブベクトルを抽出できます。

a_outliers = D.sensorID(a_outlier_indices);

D.a単純にインデックスのベクトルを与えるだけで、目的の外れ値のベクトルが得られます。

3. また、良い実践のためのアドバイス:個別の配列の代わりにベクトルのセル配列に配列aを格納することを検討してください:ループ:dD.readings = {a, b, c, d}thr

thr = {[aMin, aMax]; [bMin, bMax]; [cMin, cMax]; [dMin, dMax]}
outliers = cell(4, 1);
for i = 1:4
   outlier_indices = find(D.readings{i} < thr{i}(1) | D.readings{i} > thr{i}(2));
   outliers{i} = D.sensorID(outlier_indices);
end

これで、セル配列にすべてが含まれますoutliersa外れ値にアクセスするには を使用し、 b外れ値outliers{1}にアクセスするには を使用します。outliers{2}

forもちろん、ループ内の単純な連結により、すべてを (質問のように) 1 つのベクトルにパッチすることができます。

outliers = [outliers, D.sensorID(outlier_indices)];

outliers{i} = ...ステートメントの代わりに。

PS

外れ値を見つけるときに使用したいのは、最小/最大しきい値を使用することだと思います。外れ値を見つける方法は他にもありますが、結果は異なります。

于 2012-05-16T16:44:58.947 に答える