check the repeated values...count them and find mean

2 visualizaciones (últimos 30 días)
aditi
aditi el 29 de Jun. de 2013
I have suppose 2 columns as follows:
1 22
2 44
1 88
5 100
7 200
2 600
8 45
9 76
7 24
4 54
what i want is: like 1 is repeated 2 times...now add the respective values from column 2 i.e 22 and 88 and add them and divide by 2(because 1 is occuring 2 times)..and do it for all values of column 1..i.e
1 (22+88)/2
2 (44+600)/2
5 (100)/1
7 (200+24)/2
8 (45)/1
9 (76)/1
4 (54)/1
please help me...i m stuck up with this problem... :(

Respuesta aceptada

Roger Stafford
Roger Stafford el 29 de Jun. de 2013
The 'tm' you show in your code has only one column. When you write tm(:,2), matlab will complain. It looks as if you intended to join 'tm' and 's' together to form a two-columned 'tm'. Either that, or the code I wrote should use tm and s instead of tm(:,1) and tm(:,2), respectively.
  6 comentarios
Roger Stafford
Roger Stafford el 30 de Jun. de 2013
This is a quote from Mathworks' documentation for 'accumarray': "val can also be a scalar whose value is repeated for all the rows of subs". The 'val' here refers to the second argument in 'accumarray'. In your case it was the number 1, so a 1 is repeated for each of the elements in 'ix' in order to count the number of occurrences of each distinct number in 'ix', which is needed for computing the mean.
Jan is correct that you could use the function "@mean" instead of the method I gave. I didn't mention it to you because I wanted the code's algorithm to be easier to understand.
aditi
aditi el 1 de Jul. de 2013
Thanx a lot again Roger...it was vry helpful... :-)

Iniciar sesión para comentar.

Más respuestas (2)

Roger Stafford
Roger Stafford el 29 de Jun. de 2013
Call your first array 'a' and the second 'b'.
[u,~,ix] = unique(a(:,1));
b = [u,accumarray(ix,a(:,2))./accumarray(ix,1)];
These are arranged in order of ascending unique values from the first column of a. If you want them in the order first encountered, you need to use the second argument of 'unique'.
  1 comentario
aditi
aditi el 29 de Jun. de 2013
Hey roger...thanx a lot for replying... I am new to MATLAB...so please could you explain me the above two commands... where are we adding the common values respective values from array 1's second column

Iniciar sesión para comentar.


Jan
Jan el 29 de Jun. de 2013
Editada: Jan el 29 de Jun. de 2013
One accumarray() call is enough:
A = [1 22; ...
2 44; ...
1 88; ...
5 100; ...
7 200; ...
2 600; ...
8 45; ...
9 76; ...
7 24; ...
4 54];
B = accumarray(A(:,1), A(:,2), [], @mean)
I'm not new to Matlab. But this is the first time I could apply accumarray successfully.
  4 comentarios
Jan
Jan el 30 de Jun. de 2013
@aditi: No, you do not need the unique command. And when you run "my code" you do not get this error message. You get the error, when the first column contain values, which are not positive integers. But your example did not show such values. So obvious your example was a too strong simplification. In this case you need.
[dum1, dum2, index] = unique(zz(:,1));
sm = accumarray(index, zz(:,2), [], @mean)
This is very similar to Roger's code, it only let accumarray perform the calculation of the mean, while Roger's accumarray builds the sum and divides by the number of occurrences determined by a second accumarray.
aditi
aditi el 1 de Jul. de 2013
thnxx a lot Jan...its working now... :-)

Iniciar sesión para comentar.

Categorías

Más información sobre NaNs en Help Center y File Exchange.

Etiquetas

Community Treasure Hunt

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

Start Hunting!

Translated by