Finding frequency of values in an array

62 次查看(过去 30 天)
Hi there
I have a 128x128x16 double array. Firstly, I would like to get the total number of values < zero in this array. Then, i would like to get the sum of the frequency of occurance of each value in this array. The array name is Phase.
thanks

采纳的回答

Star Strider
Star Strider 2019-7-23
One approach:
negPhase = nnz(Phase < 0); % Number Of Values < 0
[uPhase,ia,ic] = unique(Phase);
tally = accumarray(ic, 1);
freqOccurrence = [uPhase, tally]; % Frequency Of Occurrenct Of Each Value
If you do not want the results sorted (since the unique function does this by default), use:
[uPhase,ia,ic] = unique(Phase, 'stable');
instead. The rest of the code is unchanged. (Note that this will conform to the MATLAB linear matrix indexing convention, so it will be a column vector, not a matrix.)
  5 个评论
Leyla Elyasizad
Leyla Elyasizad 2023-7-26
Hey Guys
Thanks for your helpful comments but I tried both unique & tabulate for double values with 4 decimal places (0.0202, 0.0031,.....) and with both functions I get two 0.0031 with differenct occurence!
Do you have any idea why this happens?
Dyuman Joshi
Dyuman Joshi 2023-7-26
@Leyla Elyasizad, because both numbers do not appear to be the same. See below -
%Assign 0.3
y = 0.3
y = 0.3000
%Value st
sprintf('%0.42f', y)
ans = '0.299999999999999988897769753748434595763683'
When trying to compare floating point numbers, it is better to use a tolerance.
y = 0.12230455
y = 0.1223
sprintf('%0.42f', y)
ans = '0.122304549999999997988986422114976448938251'
%Set tolerance of 10^-6
tol = 1e-6;
%%Comparison
%Using equality
isequal(y,0.12330455)
ans = logical
0
%Using a tolerance
abs(y-0.12230455)<tol
ans = logical
1
With the same idea in mind, try uniquetol instead of unique

请先登录,再进行评论。

更多回答(1 个)

dipanka tanu
dipanka tanu 2020-5-1
can you use tabulate operator of matlab ?

Community Treasure Hunt

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

Start Hunting!

Translated by