Tôi muốn tìm một cách được vectorized để tính tổng tích lũy của một vectơ, nhưng với giới hạn trên và dưới.cumsum với giới hạn trên và dưới?
Trong trường hợp của tôi, đầu vào chỉ chứa 1 và -1. Bạn có thể sử dụng giả định này trong câu trả lời của bạn. Tất nhiên, một giải pháp tổng quát hơn cũng được chào đón.
Ví dụ:
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
Khi tổng tích lũy đạt đến giới hạn trên (ít yếu tố thứ 3), nó sẽ không tăng nữa. Tương tự như vậy, khi tổng tích lũy đạt đến giới hạn dưới (ở phần tử thứ 7), thì nó sẽ không giảm nữa. Phiên bản cho vòng lặp sẽ giống như sau:
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
Bạn có ý tưởng nào không?
Tôi hoàn toàn không hiểu đầu ra ví dụ bạn đã thấy. Bạn có thể tiết lộ chi tiết hơn và giải thích cách bạn đạt được sản lượng mong muốn của mình không? Làm thế nào chính xác làm giới hạn trên và dưới đi vào chơi với chức năng "' cumsum' "của bạn? – rayryeng
Liệu 'x' chỉ chứa' 1's' và '-1's'? – Divakar
@BenW hoặc chỉ định giới hạn về những gì 'x' có thể chứa hoặc chọn một đại diện hơn' x'. Đầu tiên, nó có giá trị lớn hơn '1' bên trên và/hoặc dưới giới hạn, có vi phạm cùng giới hạn nhiều lần và quan trọng nhất là đề cập Divakar, nếu' x' có thể chứa các số khác, vui lòng bao gồm một số – Dan