0

この質問は、MATLAB でこの累積合計を実行するにはどうすればよいですか? に関連しています。.

cumsum を実行するために 2 つの条件を使用することは可能ですか? それとも1つの条件だけですか?

編集:

data = [1 22 20;...  %# Initial data
        1 22 22;...
        1 22 20;...
        1 44 11;...
        0 44 12;...
        1 33 99;...
        1 33 20;...
        1 33 50];

2つの条件を満たす累積合計を見つけたい:

% 1) current row in column 1 = 1 && previous row in column 1==1;
% 2) current row in column 2 = previous row in column 2

data(:,4) = cumsum(data(:,3)); % Add a 4th column containing 
                               % the cumulative sum of column 3
index  = diff([0;data(:,1)])> 0 && diff([0;data(:,2); 0])~= 0; 
offset = cumsum(index.*(data(:,4)-data(:,3)));  
data(:,4) = data(:,4)-offset;        
index = (data(:,1) == 0); 
data(index,4) = data(index,3) 

意図した出力:

data = [1 22 20 20   >> 20 + 0
        1 22 20 40   >> 20 + 20
        1 44 11 84   >> 11 + 40
        0 44 12 12   >> 12 + 0
        1 33 99 99   >> 99 + 0
        1 33 20 119  >> 20 + 99
        0 33 50 50   >> 50 + 0

編集: 以下のコードでは、間違った出力が得られました。

index = diff([0;data(:,1)])> 0 & diff([0;data(:,2)])~=0

 1    22    20    20
 1    22    22    42
 1    22    20    62
 1    44    11    73 %this supposed to be 11 not 73 ..
 0    44    12    12
 1    33    99    99
 1    33    20   119
 1    33    50   169
4

2 に答える 2

0

書かれた質問に続いて(あなたが持っている2つの条件を満たすだけで)、次のようなインデックスの式が必要です。

index = data(:,1) & ([0;diff(data(:,2))] == 0);

これは、両方の条件(以下に記載)が満たされる累積合計にのみ適用されることに注意してください。

  1. 列1が1である行
  2. 列2が前の行と一致するか、最初の行である行

私にとって、これは次の出力を生成します

data(index,4) = cumsum(data(index,3))
data =

     1    22    20    20
     1    22    22    42
     1    22    20    62
     1    44    11     0
     0    44    12     0
     1    33    99     0
     1    33    20    82
     1    33    50   132

とはいえ、これでは目的の出力が生成されないため、条件または目的の出力のいずれかが間違っています。

于 2010-08-16T00:45:56.470 に答える
0

私は遅いので、あなたが何をしようとしているのかまだよくわかりません。言葉で説明していただけますか?その際、操作したい配列データの要素の指定と累積和の指定を分けます。Matlab 関数cumsumは条件を取りません。合計するデータを選択するには、Matlab ステートメントを記述する必要があります。最初。

あなたの2番目の条件data(1:end-1)==data(2:end)は、おそらくあなたが望むものではない線形インデックスを使用しているため、私には疑わしいように見えます. 線形索引付けという用語を理解していない場合は、data(4) や data(24) などのいくつかの参照 (つまり、2 次元配列への 1 次元索引) を試してみてください。

だから声明は

index = diff([0;data(:,1)])> 0 && diff([0;data(:,2); 0])~= 0;

エラーが発生します。ここで行う必要があるのは、Matlab を対話的に使用して、実行するステートメントを少しずつ作成することです。そうです

[0;data(:,1)]

あなたが期待する結果を生成しますか?それが何を生み出すか理解していますか?次に同じ質問をする

diff([0;data(:,1)])

そしての

diff([0;data(:,1)])> 0

そして続けてください。ある時点で、Matlab が期待どおりに動作しないことがわかります。これは、期待が間違っているためです。

最後に、絶対に間違っていることの 1 つは、部分式diff([0;data(:,1)])> 0diff([0;data(:,2); 0])~= 0が異なる長さのベクトルを生成することです。

EDIT: 演算子&は、2つの配列で要素ごとに操作されるため、必要なものになる場合があります。

編集 2 : 残念ながら、これ以上お手伝いする時間がないので、プログラムを書き直して、累積合計を構築するデータ配列を明示的にループすることをお勧めします。

于 2010-07-08T09:25:48.857 に答える