Azzera filtri
Azzera filtri

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

1 visualizzazione (ultimi 30 giorni)
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... :(

Risposta accettata

Roger Stafford
Roger Stafford il 29 Giu 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 Commenti
Roger Stafford
Roger Stafford il 30 Giu 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 il 1 Lug 2013
Thanx a lot again Roger...it was vry helpful... :-)

Accedi per commentare.

Più risposte (2)

Roger Stafford
Roger Stafford il 29 Giu 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 Commento
aditi
aditi il 29 Giu 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

Accedi per commentare.


Jan
Jan il 29 Giu 2013
Modificato: Jan il 29 Giu 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 Commenti
Jan
Jan il 30 Giu 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 il 1 Lug 2013
thnxx a lot Jan...its working now... :-)

Accedi per commentare.

Categorie

Scopri di più su Large Files and Big Data in Help Center e File Exchange

Tag

Community Treasure Hunt

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

Start Hunting!

Translated by