Effacer les filtres
Effacer les filtres

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

1 vue (au cours des 30 derniers jours)
aditi
aditi le 29 Juin 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... :(

Réponse acceptée

Roger Stafford
Roger Stafford le 29 Juin 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 commentaires
Roger Stafford
Roger Stafford le 30 Juin 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 le 1 Juil 2013
Thanx a lot again Roger...it was vry helpful... :-)

Connectez-vous pour commenter.

Plus de réponses (2)

Roger Stafford
Roger Stafford le 29 Juin 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 commentaire
aditi
aditi le 29 Juin 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

Connectez-vous pour commenter.


Jan
Jan le 29 Juin 2013
Modifié(e) : Jan le 29 Juin 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 commentaires
Jan
Jan le 30 Juin 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 le 1 Juil 2013
thnxx a lot Jan...its working now... :-)

Connectez-vous pour commenter.

Catégories

En savoir plus sur Large Files and Big Data dans Help Center et File Exchange

Tags

Community Treasure Hunt

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

Start Hunting!

Translated by