loop for finding a threshold and change corresponding number
2 vues (au cours des 30 derniers jours)
Afficher commentaires plus anciens
hi, i have a dataset in the form [2000x730], where my variable of interest is 730. i want to use the loop and find the following equation.
aa=(data)-min(data)/max(data)+min(data);
which i already did with following code:
[m,n]=size(data);
% aa=zeros(m,n);
for i=1:m;
aa(i,:)=(data(i,:)-min(data(i,:)))/(max(data(i,:))-min(data(i,:)));
end
in second part since i have output file aa[2000x730]. i want to find the number where my data meets the required threshold i-e 0.76,
any idea how to loop for it,
regards and thnx in advance
1 commentaire
Guillaume
le 9 Jan 2017
Whichever version of matlab, you're using the loop in your example is totally unnecessary.
In r2016b:
aa = (data - min(data, [], 2)) ./ (max(data, [], 2) - min(data, [], 2));
Prior to R2016b:
aa = bsxfun(@rdivide, bsxfun(@minus, data, min(data, [], 2)), max(data, [], 2) - min(data, [], 2));
Réponse acceptée
Guillaume
le 9 Jan 2017
As per my comment to the question, the loop you've shown is unnecessary:
aa = (data - min(data, [], 2)) ./ (max(data, [], 2) - min(data, [], 2)); %in R2016b
I'm assuming that you want to find where aa first crosses the threshold for each row. If not, see ImageAnalyst's answer.
[r, c] = find(aa >= 0.76)
crossthreshold = accumarray(r, c, [size(aa, 1), 1], @min)
Plus de réponses (1)
Image Analyst
le 8 Jan 2017
Why loop? Why not do it vectorized in a single line:
atOrAboveThreshold = aa >= 0.76;
5 commentaires
Image Analyst
le 9 Jan 2017
The code I gave you was vectorized. atOrAboveThreshold is a logical vector of 1 or 0 depending on if the element is above or below the threshold. If you want a count of the number above, you can do
numAbove = sum(atOrAboveThreshold);
If you want to extract only the numbers above or below the threshold you can do
aaAbove = aa(atOrAboveThreshold);
aaBelow = aa(~atOrAboveThreshold);
These will have fewer numbers of elements.
If you want to mask the ones below, which will keep the same number of elements but just set the "below" elements to zero, you can do
aa(~atOrAboveThreshold) = 0; % Set below values to 0
You should try to learn about logical indexing. It is one of the most powerful features of MATLAB and the key to writing vectorized code.
Voir également
Catégories
En savoir plus sur Matrices and Arrays dans Help Center et File Exchange
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!