3

プログラミングのアドバイスを探すよりも、MATLABの一般的な質問です。

y = cellfun(@(x)sum(x(:)), Z, 'un', 0);

NaN各セル行列に'と実数の組み合わせがある場合、セルごとにそれらの行列のすべての要素を合計するとNaN、そこに'があるため、常にtotal =が得られますNaNか、それとも無視されて合計されますか?実数。私が尋ねる理由は私が得ているからです:

y = [NaN] [NaN] [NaN]
    [NaN] [NaN] [NaN]
    [NaN] [NaN] [NaN]

セルマトリックス(セル要素)の例は次のようになります。

x{1,1} = NaN 2   3
         4   5   6
         7   8   9

したがって、の最初の要素は次のyようになります。

y{1,1} = 44

どうしてこれを受け取れないのですか?

4

3 に答える 3

7

nansumではなく(統計ツールボックスから)使用する必要がありますsum

統計ツールボックスがない場合は、次の方法でnansum簡単に定義できます。

function x = nansum(array,dim)

if nargin < 2
    if size(array,1) == 1
        dim = 2;
    else
        dim = 1;
    end
end

array(isnan(array)) = 0;

x  = sum(array,dim);

基本的に、問題はsum、入力ベクトルのすべての要素を合計しようとしたことです。これらの要素の1つがNaN全体の合計であるNaN場合(未知のデータを表すと考えることができますNaN-明らかに、データの1つが何であるかがわからない場合は、すべてのデータの合計が何であるかを知ることはできませんデータはどちらかです)。

この関数nansumは欠落しているすべてのデータをゼロとして扱うため、次のコードで期待どおりの結果が得られます。

>> nansum( [NaN 2 3 4 5 6 7 8 9] )
ans =
    44
于 2012-07-02T11:14:05.977 に答える
3

統計ツールボックスがない場合はignoreNan、ファイル交換から使用する必要があります。

   ignoreNan(array,@sum,dim)

あなたの場合、最初にマトリックスの形を変える必要があります:

   ignoreNan(x(:),@sum);

nansumまた、カスタムまたは組み込みを問わず、あらゆる機能に使用できるという意味で、よりも一般的です。

于 2012-07-02T11:18:35.457 に答える
2

:NaNを無視するには、無名関数でコロン( )
~isnan(x):に置き換えて、ベクトルインデックスを使用します。

@(x)sum(x(~isnan(x)))

だからあなたは得る:

y = cellfun(@(x)sum(x(~isnan(x))), Z, 'un', 0);
于 2012-07-02T11:25:42.697 に答える