how can i create a loop or function

I have an Excel sheet with many columns and rows.
Say column “y” has serval “groups” of the same numbers but the groups are any length, I want to find the length of each group of the same numbers then use that information to sum the value of a vector in column “k” The following code works, for the 1st three groups but there are 20+ groups in the column and I need to find a more efficient way to get the answer
[numbers, strings, raw] = xlsread('BCT2.csv');
colk= numbers(:,11);
coly =numbers(:,25);
cf=coly;
EI=colk;
z=cf-cf(1); %%subtracts the first value from vector cf
idx = find(z<=0);
x=length(idx);
y=1:x;
A=sum(EI(y));
v=x+1;% the new starting point
z=cf-cf(v);
idx = find(z<=0); % indices
x1=length(idx);
d=x1-x;
ya=1:d;
B = sum(EI(ya))-A;
v2=x1+1;
z=cf-cf(v2);
idx = find(z<=0); % indices
x2=length(idx);
d1=x2-x1;
ya=1:d1;
C = sum(EI(ya))-B;

 Respuesta aceptada

Stephen23
Stephen23 el 19 de Mayo de 2015
Editada: Stephen23 el 19 de Mayo de 2015
An easy way to detect groups of values is using diff and cumsum.
Then you could use accumarray, which is intended for exactly this kind of operation. Here is a simple example, where each run of identical digits in A is used to sum the values in B (e.g. the first run of A (the nines) sum the first B values [1,2,3] to give six:
>> A = [9,9,9,1,2,2,1,1]';
>> B = [1,2,3,4,5,6,7,8]';
>> X = cumsum([1;0~=diff(A)]);
>> accumarray(X,B)
ans =
6
4
11
15
If you would prefer to group by value rather then by runs of one values, then you can use unique:
>> [C,~,Y] = unique(A);
>> accumarray(Y,B)
ans =
19
11
6
>> C
C =
1
2
9
Note in this case the ones are summed together, even though they occur in two different runs in A.

Más respuestas (0)

Categorías

Más información sobre Entering Commands en Centro de ayuda y File Exchange.

Productos

Etiquetas

Preguntada:

el 19 de Mayo de 2015

Editada:

el 19 de Mayo de 2015

Community Treasure Hunt

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

Start Hunting!

Translated by