2010-07-08 77 views
0

這個問題與How can I perform this cumulative sum in MATLAB?。相關。MATLAB如何執行滿足兩個條件的cumsum?

是否可以使用TWO條件來執行cumsum?或只是一個條件?

編輯:

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 
+0

你的代碼產生了什麼錯誤?如果您不告訴我們,我們會發現(更多)難以診斷您的問題。而你的數據樣本也會有幫助。 – 2010-07-08 08:38:22

+0

???操作數到||和&&運算符必須可以轉換爲邏輯 標量值。 – Jessy 2010-07-08 08:56:15

+0

看起來真的是你想要一種分段累積總和,也就是說,每次第2列的累積和開始變化 - 這是正確的嗎? – 2010-08-16 00:39:03

回答

0

我很慢,還沒有真正理解你在做什麼。你能用文字來形容它嗎?當你這樣做時,分開你想要操作的數組數據的哪些元素的規格以及累加和的規格Matlab函數cumsum不採用任何條件,你必須編寫Matlab語句來選擇你想要的數據先總和。

你的第二個條件data(1:end-1)==data(2:end)看起來可疑,因爲他們使用線性索引,這可能不是你想要的。如果您不理解術語線性索引嘗試嘗試一些參考(如數據(4)和數據(24)),即將一維索引轉換爲二維數組。

所以聲明

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不會做你期望的 - 這是因爲你的期望是錯誤的。

最後,有一點是肯定錯誤的是,子表達式diff([0;data(:,1)])> 0diff([0;data(:,2); 0])~= 0產生具有不同長度的向量。

編輯:運算符&可能是你想要的,因爲它將在你的兩個數組上操作元素。

編輯2:恐怕我沒有更多時間來幫助您解決這個問題,所以我建議您重寫程序以顯式循環構建累積和的數據數組。

+0

謝謝。其實我想找到第1列中的第1行和第2列中的當前行=第2列中的前一行的累計和 – Jessy 2010-07-08 09:55:27

+0

@Jessy:我不明白你的評論。你想總結哪些列,以及你想匹配哪些列?他們全部 ? – 2010-07-08 10:01:11

+0

對於混淆感到抱歉。我改變了輸出。我想要總結的列是第3列,我想匹配第1列和第2列。第1列中的當前行=第1列中的當前行,第2列中的當前行=第2列中的上一行。 – Jessy 2010-07-08 10:53:34

0

按照你的問題書面(只是滿足你有兩個條件),你需要爲索引的表達式是這樣的:

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 

那說,這不會產生所需輸出的輸出,所以無論你的條件和所需的輸出是錯誤的。