check the repeated values...count them and find mean
조회 수: 4 (최근 30일)
이전 댓글 표시
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... :(
댓글 수: 0
채택된 답변
Roger Stafford
2013년 6월 29일
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
Roger Stafford
2013년 6월 30일
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.
추가 답변 (2개)
Roger Stafford
2013년 6월 29일
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'.
Jan
2013년 6월 29일
편집: Jan
2013년 6월 29일
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
Jan
2013년 6월 30일
@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.
참고 항목
카테고리
Help Center 및 File Exchange에서 NaNs에 대해 자세히 알아보기
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!