3

NaN関数呼び出しで 's' を処理する方法が matlab に組み込まれているかどうか疑問に思っていました。より具体的には、 を含むベクトルの平均を取得しようとしてNaNいます。たとえば、R

> x = c(1,2,3,4,NA)
> mean(x)
[1] NA
> mean(x,na.rm=TRUE)
[1] 2.5

Matlabでこれに匹敵するものは1行にありますか(私は自分の関数を書きたくないしNaN、平均を計算する前に を見つけるためにループする必要もありません)。

また、統計ツールボックスにアクセスできないため、nanmean().

4

4 に答える 4

3

のようなことができますmean(x(~isnan(x)))。必要に応じて、このようなラッパーをたくさん書いて、startup.m ファイルに入れることもできます。

于 2013-02-04T19:10:49.620 に答える
2

私はこれがうまくいくと思います:

mean(x(isfinite(x)));
于 2013-02-04T19:12:36.220 に答える
2

マトリックスはどうですか?

Karthik V が示唆するように、

mean(x(~isnan(x)))

ベクトルで機能します。ただし、n 行 m 列の行列があり、場合によっては NaN を破棄して行/列単位の平均を計算したい場合は、for ループを実行する必要があります。

サンプルシナリオ

次の形式のデータ マトリックスを想像してください。

A = [1 0 NaN; 0 3 4; 0 NaN 2]

A =
 1     0   NaN
 0     3     4
 0   NaN     2

歩留まりmean(A(~isnan(A))):

ans =

1.4286

これは、論理インデックスが行列を効果的にベクトルに「フラット化」するためです。

ループ ソリューション (列ごとの平均)

列ごとの平均を計算すると仮定すると、ループ ソリューションは次のようになります。

% Preallocate resulting mean vector
nCols = size(A, 2);
mu = zeros(1, nCols);

% Compute means
for col = 1:nCols
    mu(col) = mean(A(~isnan(A(:, col)), col));
end

その結果:

mu =

0.3333    1.5000    3.0000

ループ ソリューション (行単位の平均)

行ごとの平均を計算すると仮定すると、ループ ソリューションは次のようになります。

% Preallocate resulting mean vector
nRows = size(A, 1);
mu = zeros(nRows, 1);

% Compute means
for row = 1:nRows
    mu(row) = mean(A(row, ~isnan(A(row, :))));
end

その結果:

mu =

0.5000
2.3333
1.0000
于 2014-10-06T15:22:40.573 に答える