Asked by Adam
on 28 Oct 2017

Dear all;

I have three data sets: This is just an example...

data1=[1 5 3 4 2 0 1 2 8 2 10 2 1]; %

data2=[1 10 ....................]

data3=[4 3 .....................]

I would like to sum by a step of 2 ,3 4 etc.. along data1 file. That means data1 becomes now:

data1_2 =[6 7 2 3 10 12] % sum of 2 numbers

data_3 =[9 6 11 14] % sum of three numbers, the last number 1 is not included

data_4 =[13 5 22] % the last number 1 is again not included

data_5 =[15 13] % the last numbers 2 and 1 are not included

I did it and it works..

But I want to improve it to do the following:

Continue the sum calculation till the same length of the original data is reached. That means:

data1_2 =[6 7 2 3 10 12 12 10 3 2 7 6]; % sum from left to right and then the right to the left till the desired length is reached

The result should be in case of summing 3 numbers for example like this:

data1_3=[9 6 11 14 13 12 3 12 9 6 1 14]

Here is my code:

##########################################

for i=1:1:length(data1); % sum of events

step=floor(length(data1)./i);

for j=1:1:step

start_idx=i*(j-1)+1;

end_idx=i+start_idx-1;

Sum_data1(i,j)=sum(data1(start_idx:end_idx));

end

end

#################################

Thanks you gentlemen for your helps…

Cheers

Answer by Cedric Wannaz
on 28 Oct 2017

Edited by Cedric Wannaz
on 28 Oct 2017

Accepted Answer

Interestingly, the following seems to produce what you are looking for:

>> expandSum = @(x,n) sum(reshape(cell2mat(arrayfun(@(k)rot90(data1(1:n*floor(numel(data1)/n)), 2*(k-1)), 1:n, 'Unif', 0)), n, [])) ;

and with this function defined:

>> expandSum(data1, 2)

ans =

6 7 2 3 10 12 12 10 3 2 7 6

>> expandSum(data1, 3)

ans =

9 6 11 14 14 11 6 9 9 6 11 14

>> expandSum(data1, 4)

ans =

13 5 22 22 5 13 13 5 22 22 5 13

Of course, it may not be that useful given like this as an big ugly one-liner, so here was the thought process:

- Q: Are we able to flip/merge the data automatically based on the number of repetitions? A: Yes using ROT90 and setting the number of rotations as twice (multiple of 180) the repetition index minus one (so the first is not rotated).
- Q: Are we able to build a cell array of these rotated vectors? A: Yes using ARRAYFUN implicitely iterating from 1 to the number of repetitions (which should be the size of groups for summation).
- Q: Are we able to concatenate all rotated vector horizontally without developing as a CSL (necessary for a call to HORZCAT)? A: Yes using CELL2MAT.
- Q: Are we able to sum over groups of size n? A: Yes reshaping first the whole thing in a n x m array and summing over dim 1.

PS: I don't guarantee that it is really working in all situations, you'll have to understand and test if you want to follow this approach.

Jan
on 15 Nov 2017

@Adam: What is the answer to "does this produce an adequate output"?

Adam
on 15 Nov 2017

Yes. it does... The last thing which I have to test now is the randomness. I want to do the same calculation but in a random way. For example. from the previous calculation we get for 2: data1=[1 5 3 4 2 0 1 2 8 2 10 2 1]; %

>> expandSum(data1, 2)

ans =

6 7 2 3 10 12 12 10 3 2 7 6

Now instead of summing 2 (3, 4,...350) numbers successively, the sum should be performed in a random way... Any hints will be greatly welcome...Thanks again

Adam
on 16 Nov 2017

Sign in to comment.

Opportunities for recent engineering grads.

Apply Today
## 0 Comments

Sign in to comment.