10

ベクトルの累積和を計算するベクトル化された方法を見つけたいのですが、上限と下限があります。

私の場合、入力には 1 と -1 のみが含まれます。この仮定を回答に使用できます。もちろん、より一般的な解決策も歓迎します。

例えば:

x     = [1 1 1 1 -1 -1 -1 -1 -1 -1];
upper = 3;
lower = 0;
s     = cumsum(x)                    %// Ordinary cumsum.
s =
     1     2     3     4     3     2     1     0    -1    -2

y     = cumsumlim(x, upper, lower)   %// Cumsum with limits.
y =
     1     2     3     3     2     1     0     0     0     0
                 ^                       ^
                 |                       |
            upper limit             lower limit

累積和が上限(第 3 要素)に達すると、それ以上増加しなくなります。同様に、累積和が下限 (7 番目の要素) に達すると、それ以上減少しなくなります。for ループ バージョンは次のようになります。

function y = cumsumlim(x, upper, lower)

y = zeros(size(x));
y(1) = x(1);

for i = 2 : numel(x)
    y(i) = y(i-1) + x(i);
    y(i) = min(y(i), upper);
    y(i) = max(y(i), lower);
end

end

あなたはなにか考えはありますか?

4

2 に答える 2