MATLAB Answers

# How can I create a vector that shows the sum of the 60 values before each value of another vector?

3 ビュー (過去 30 日間)
Philippe Corner 2017 年 1 月 13 日
コメント済み: Walter Roberson 2017 年 1 月 13 日
If a have this vector --> x=[0:1:1000] how can i create a vector of length 1000 too.. that is: first value 0, second 0+1.. value #59 from 0 to 59 and when the value is greater than 60 it shows the sum of the 60 values before for example the entry 100 should be from 40 to 100 etc..
##### 1 件のコメント表示非表示 なし
Walter Roberson 2017 年 1 月 13 日
"60 values before" implies that 60 values are to be added. 40 to 100 is 61 values.

サインインしてコメントする。

### 回答 (3 件)

Walter Roberson 2017 年 1 月 13 日
Or you can cumsum() and subtract the value 60-ish earlier in the cumsum
##### 1 件のコメント表示非表示 なし
Walter Roberson 2017 年 1 月 13 日
t = cumsum(zeros(1,60),x);
t(61:end) - t(1:end-60)

サインインしてコメントする。

Star Strider 2017 年 1 月 13 日
I’m not certain a vector is possible, but a matrix approach could be.
Consider the rows of ‘out’:
N = 5; % RowLength (Use: 60)
L = 10; % Vector Length (Use: 1000)
out = hankel(1:N, N:L);
out(2:end,:) = cumsum(out(2:end,:),2);
I used the example with a short vector to illustrate the approach. Experiment to get the result you want.
##### 0 件のコメント表示非表示 -1 件の古いコメント

サインインしてコメントする。

Image Analyst 2017 年 1 月 13 日
Here's a way to do it in one line of code with conv().
out = conv(x, [zeros(1,59), ones(1,60)], 'same')
To prove it, here's a full demo where I compare that method to a simple intuitive for loop to prove that it's the same.
x=[0:1:1000]
kernel = [zeros(1,59), ones(1,60)]
out = conv(x, kernel, 'same')
% Compare with for loop method:
for k = 1 : length(x)
i2 = k;
i1 = max(1, i2 - 59);
outf(k) = sum(x(i1:i2));
end
diffs = outf - out
maxDiff = max(diffs) % Should be 0

サインインしてコメントする。

### Community Treasure Hunt

Find the treasures in MATLAB Central and discover how the community can help you!

Start Hunting!