2017-01-25 15 views
0

私は以下のような単純な行列を用意しています:(実際に作業している行列は674x11で、単純にすべて '1'要素ではありません)。列の開始点を説明する累積行列を作成する

a = 

    1 1 1 NaN NaN 
    1 1 1 NaN NaN 
    1 1 1 1 NaN 
    1 1 1 1 1 
    1 1 1 1 1 

数値要素が異なる行の各列から始まるという事実を説明する累積行列を作成したいと思います。私は、各列の最初の数値要素の上にあるNaN値をその行の平均値に置き換えて、これを達成したいと思います。

ので、代わりの:

cumsum(a)= 

    1 1 1 NaN NaN 
    2 2 2 NaN NaN 
    3 3 3 1 NaN 
    4 4 4 2 1 
    5 5 5 3 2 

私が達成したいものがある:

要素(2,4)の平均値である
cumsum(a) = 

    1 1 1 NaN NaN 
    2 2 2 2 NaN 
    3 3 3 3 3 
    4 4 4 4 4 
    5 5 5 5 5 

(2,1:3)と要素(3,5)はa(3,1:4)の平均値です。

+0

でそれをフォローアップすることができますcumsum操作

% Get the rows of each NaN value bool = isnan(a); [row,col] = find(bool); % Compute the mean value of each row rowmeans = nanmean(a, 2); % Replace the NaN values with their row means a(bool) = rowmeans(row); % Perform the cumulative sum result = cumsum(a); 

とそれをフォローアップすることができます*すべての* NaN値は出力にありますか? – Suever

+0

あなたの例に問題があります。それは '要素(2,4)はcumsum(a)(2,1:3)の平均ですか? 'ではありませんか? – rahnema1

+0

実際、問題を考えて、あなたは正しいです。要素(2,4)は、cumsum(a)(2,1:3)の平均値でなければなりません。 –

答えて

1

nanmeanを使用すると、各行の平均値(NaNの値を無視して)を計算できます。 findを使用して、それぞれがNaNである行を識別し、値をその行の平均で置き換えます。その後、我々はあなたが交換したいですかあなたはその後NaN値として初期NaN値のままにしたい場合は、あなたが

result(bool) = NaN; 
+0

完璧に動作します!どうもありがとう! –

関連する問題