2017-06-08 6 views
1

MATLABでゼロの行列と各行の行列を累積する必要がありますが、それ以上の行列がない場合は停止する必要があります。私が開始した場合の例、:MATLABで累積合計を実行するがゼロ値を維持する方法は?

A = [0 0 0 0 0 1 1 1 1 1 0 0 0; 
    0 0 0 1 1 1 1 1 1 1 0 0 0; 
    0 0 0 0 0 0 0 1 1 0 0 0 0]; 

私は結果が欲しい:

B = [0 0 0 0 0 1 2 3 4 5 0 0 0; 
    0 0 0 1 2 3 4 5 6 7 0 0 0; 
    0 0 0 0 0 0 0 1 2 0 0 0 0]; 

私はcumsumを使用する場合は、値の追加を続行し、別の結果得られます:

B = [0 0 0 0 0 1 2 3 4 5 5 5 5; 
    0 0 0 1 2 3 4 5 6 7 7 7 7; 
    0 0 0 0 0 0 0 1 2 2 2 2 2]; 

してくださいを誰かが何か提案しているのであれば、私は何か似たものを見つけることができません(私はいくつかのかなり大きい行列を持っています)。

+0

この質問は、コードベースであるため、スタックオーバーフローに移行する必要があります。 – Jon

答えて

4

行ごとに複数の文字列がある場合(その可能性がある場合)は、どのように処理するかによって2つの解決策が考えられます。新しい文字列に遭遇するたびに累積合計をリセットする場合は、より複雑なソリューションを使用します。

  • 簡単な解決策(1つの文字列、あるいは全くCUMSUMリセット:あなたがもののそれぞれの新しい文字列をリセットするには、累積合計をしたくない、またはあなただけのこれまでの行ごとに1つの文字列を持っている、シンプルなソリューションを使用する場合):

    B = cumsum(A, 2); 
    B(~A) = 0; 
    
    B = 
    
        0  0  0  0  0  1  2  3  4  5  0  0  0 
        0  0  0  1  2  3  4  5  6  7  0  0  0 
        0  0  0  0  0  0  0  1  2  0  0  0  0 
    
  • をコンプレックス溶液(各文字列のCUMSUMをリセット):レッツが言うあなたが累積和を実行することができ、その後、logical indexゼロに戻るのエントリを設定するようA(特にそのnegation)を使用しますあなたは、このような(最後の行に注意してください)として、行あたりのものの複数の文字列を持つことができます。この場合

    A = 
    
        0  0  0  0  0  1  1  1  1  1  0  0  0 
        0  0  0  1  1  1  1  1  1  1  0  0  0 
        0  0  0  1  1  0  0  1  1  0  0  0  0 
    

    、我々はものの各文字列の末尾に累積和の値を取ることができ、私たちの累積合計から差し引くそして、cummaxを適用し、新しいマトリックスでそれらを配置します。この場合、簡単な解決策を適用する

    B = cumsum(A, 2); 
    index = find([zeros(size(A, 1), 1) diff(A, 1, 2)] == -1); 
    C = zeros(size(B)); 
    C(index) = B(index); 
    B = B-cummax(C, 2); 
    
    B = 
    
        0  0  0  0  0  1  2  3  4  5  0  0  0 
        0  0  0  1  2  3  4  5  6  7  0  0  0 
        0  0  0  1  2  0  0  1  2  0  0  0  0 
                   ^-- sum resets 
    

    はなり代わり、収率:

    B = 
    
        0  0  0  0  0  1  2  3  4  5  0  0  0 
        0  0  0  1  2  3  4  5  6  7  0  0  0 
        0  0  0  1  2  0  0  3  4  0  0  0  0 
                   ^-- no reset 
    
-1

Aの累計とAのゼロの位置を求め、累計のこれらの位置でゼロを置き換えます。

A = [0 0 0 0 0 1 1 1 1 1 0 0 0; 
    0 0 0 1 1 1 1 1 1 1 0 0 0; 
    0 0 0 0 0 0 0 1 1 0 0 0 0]; 

B = cumsum(A,2) ; 
B(A==0) = 0 ; 
関連する問題