How to count how many x are greater than (x>0.2, 03 and 0.4) in a specific time?
조회 수: 1 (최근 30일)
이전 댓글 표시
Hi Everybody,
I need to know how many (x>0.2,0.3&0.4)occurred at each hour. First, count it to make me able tabulate it (i.e. in time between 5-6, we observed 5 event(x>0.2) and so on) and then plot it as a bar. Please assume, x and y are defined as a column data in .xls format.
x y
0.05 10
0.1 10.1 (1 min)
0.02 10.2
0.2 10.3
0.012 10.4
. .
. .
. .
0.2 11
Thank you in advance,
댓글 수: 6
Image Analyst
2013년 3월 18일
You'll have to read them in as text then and parse them into two separate numbers.
채택된 답변
Cedric
2013년 3월 18일
편집: Cedric
2013년 3월 18일
The following could be a solution..
>> x = rand(1,1e3)/2 ; % Fake x, for the example.
>> y = sort(rand(1,1e3)*23.99) ; % Fake y, for the example.
Build a cell array of distributions
>> bins = 0.05 : 0.1 : 0.45 ;
>> dists = arrayfun(@(h) hist(x(floor(y)==h), bins), 0:23, ...
'UniformOutput', false) ;
Test..
>> size(dists)
ans =
1 24
>> dists{1} % Distribution for the period [0-1h[.
ans =
6 6 9 12 6
>> dists{12} % Distribution for the period [11-12h[.
ans =
3 12 4 7 5
so for the period [11-12h[, 3 values are in the range [0,0.1[, 12 in the range [0.1, 0.2[, etc..
Note: you can achieve the same thing using a more basic approach, that you would have to put in a loop..
>> id_hr = y >= 11 & y < 12 ; % Index of y values (hrs) in the range 11-12h.
>> sum(x(id_hr) < 0.1) % Count # of corresponding x values below 0.1.
ans =
3
here we find the 3 that we found above as 1st element of dists{12}.
댓글 수: 6
Ara
2020년 9월 27일
편집: Ara
2020년 9월 27일
Hi Cedric,
You wrote a FOR loop in my code. How to get rid of the loop and read data for one day of interest only without going to a circles again and again.
- I would like to write my CV in Latex. Can you help me or do you have a template of it so that I can use it?
If I find the answer of this question, I will be the happiest woman in this World.
Please tell me how to correct it?
Best,
Ara
추가 답변 (1개)
Cedric
2013년 3월 18일
You're welcome!
Well, at this point you should build a test dataset just to check, e.g.
>> s4 = [0.21, 0.21, 0.21, 0.32, 0.45, 0.45, 0.25] ;
>> time = [1.1, 1.2, 1.3, 1.4, 1.5, 1.6, 2] ;
so there should be [3, 1, 2] associated with period [1-2h[, and [1, 0, 0] associated with period [2-3h[.
>> myHist = @(v) [sum(v>0.2 & v<=0.3), sum(v>0.3 & v<=0.4), sum(v>0.4)] ;
>> dists = arrayfun(@(h) myHist(s4(floor(time)==h)), 0:23, ...
'UniformOutput', false) ;
>> dists{1} % [0-1h[
ans =
0 0 0
>> dists{2} % [1-2h[
ans =
3 1 2
>> dists{3} % [2-3h[
ans =
1 0 0
It seems to be working. Then, using your dataset, you can check manually what happens with the period 5-6h. I show you here with the period 1-2h:
>> id_time = time >= 1 & time < 2 % Flag relevant times.
id_time =
1 1 1 1 1 1 0
this is a vector of logicals that we use then for indexing s4
>> s4_selection = s4(id_time)
s4_selection =
0.2100 0.2100 0.2100 0.3200 0.4500 0.4500
as you can see, these are the elements of s4 that correspond to a time in the range 1-2h[. Now we test myHist on this set of values
>> myHist(s4_selection)
ans =
3 1 2
It seems to be working.. let's check manually that the first count is correct
>> s4_selection > 0.2 & s4_selection <= 0.3
ans =
1 1 1 0 0 0
again, vector of logicals flagging relevant elements; counting them just means summing the vector of logicals (there is a conversion to numeric)
>> sum(s4_selection > 0.2 & s4_selection <= 0.3)
ans =
3
So it's working. Now ARRAYFUN repeats the same kind of operations with the small difference that instead of checking whether time is greater than h and smaller than h+1 for h=0:23, we test whether floor(time)==h.
Hope it helps; let me know if you are having troubles using this material!
댓글 수: 15
Ara
2020년 9월 22일
편집: Ara
2020년 9월 27일
Hi Dr. Cedric Wannaz,
Thank you for providing useful explanation and the best solution back in 2013.
I still read through your code, programming and all you tought me about MATLAB and it is very useful so thanks again for being helpful all the time. However, I wish to contact you as I amfacing some questions about MATLAB programming and I need to send it to your email address. I wrote to your email address as you previuosly provided for me but I guess you no longer check your email!!!
I need to install Mozilla File the one that you have asked me to use in Australia. How can I install that file again?
I have some more questions and I wish to email it to you to discuss more details about MATLAB solution and I need to send the code to you but I could not find your emal address in your profile. Would you mind to provide your email address in your profile or here so that I can send my questions along with my code to you? You have my email address so you can write back to me in any of my email.
Thanks.
Ara
참고 항목
카테고리
Help Center 및 File Exchange에서 Satellite Mission Analysis에 대해 자세히 알아보기
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!