1

こんにちは私はMatlab(PDS(:、39))に値の列があります。この列はさまざまなものでフィルタリングされ、有効な行の場合は0、無効な行の場合は-1の2つの個別のフラグ付け列(PDS(:、[41 81]))があります。有効なデータの平均を取得しています。平均が0を超える場合は、この値を無効にして、平均が特定の値(この場合は0.2)を下回るまで平均を再度取得します。これが私のコードです:

% identify the VALID values
U1 = (PDS(:,81)==0);
F1 = (PDS(:,41)==0);

% only calculate using the valid elements
shearave = mean(PDS(U1&F1,39));

while shearave > 0.2
    clear im
    % determine the largest shear value overall for filtered and
    % non-flagged
    [c im] = max(PDS(U1&F1,39));
    % make this value a NaN
    PDS(im,39)=NaN;
    % filter using a specific column and the overall column
    PDS(im,41)=-1;
    F1 = (PDS(:,41)==0);
    % calculate shear ave again using new flagging column - remove the ";" so I can see        the average change
    shearave = mean(PDS(U1&F1,39))
end

Matlabが提供する出力は次のとおりです。

シアーブ=

0.3032

シアーブ=

0.3032

シアーブ=

0.3032

ループは、新しい有効なデータで再評価されていません。この問題を解決するにはどうすればよいですか?休憩を使用する必要がありますか、それとも続行する必要がありますか?または、おそらく別のタイプのループですか?助けてくれてありがとう。

4

2 に答える 2

2

ループを使用する必要はありません。次のようにします。

データを並べ替えます。

m=PDS(U1&F1,39);
[x isort]=sort(m); 

次に、ソートされたベクトルの累積平均を計算します。

y = cumsum(x)./[1:numel(x)]';

次に、0.2で切り捨て、見つかったインデックスを使用して必要な値を取得します...

ind=find(y<=0.2);
values_needed=m(isort(ind));
于 2013-01-13T22:16:20.340 に答える
0

列39の値を繰り返し置き換えますNaN。ただし、meanは無視されませんNaNが、代わりにNaN新しい平均として返されます。あなたは少しの実験でこれを見ることができます:

>> mean([3, 4, 2, NaN, 4, 1])
ans = NaN

したがって、shearave < 0.2決してなりませんtrue

于 2013-01-13T22:16:09.300 に答える