How do I round to the nearest arbitrary, enumerated value in MATLAB?
Afficher commentaires plus anciens
If I have values:
v = [0.1 2.2 1.6 7.3 10];
and I want all my values to be rounded to the nearest value in this list:
roundTargets = [0 2.7 8 11.1];
then I would want to make a function that would convert each value in v to the nearest value in roundTargets.
So this function would return me:
vRounded = [0 2.7 2.7 8 11.1];
Any clever ways to do this?
[Yes, I know how to do this. When I get questions from users that make good posts here, I like to put them out for the world to find.]
3 commentaires
Doug Hull
le 16 Juin 2011
che_guevara
le 26 Août 2015
Would you mind providing those 3 solutions? :)
Walter Roberson
le 27 Août 2015
The three solutions are shown below -- interp1, histc, bsxfun
Note: Doug Hull moved on to a different career so he will not be back to respond.
Réponse acceptée
Plus de réponses (2)
Teja Muppirala
le 16 Juin 2011
I believe HISTC is the fastest and most memory efficient way to solve this problem for large cases.
v = 10*rand(1,1000000);
roundTargets = [0 sort(10*rand(1,10000)) 10];
%%%histc
tic
[~,Index1] = histc(v,[-Inf interp1(1:numel(roundTargets),roundTargets,0.5 + (1:numel(roundTargets)-1)) Inf]);
vRounded1 = roundTargets(Index1);
timehistc = toc
%%%interp1
tic
vRounded2 = interp1(roundTargets,roundTargets,v,'nearest');
timeinterp1 = toc
isequal(vRounded1,vRounded2)
%%%bsxfun will run out of memory
tic
[~,idx] = min(bsxfun(@(x,y)abs(x-y),v,roundTargets.')); %index of closest
vRounded = roundTargets(idx); %extract values
timebsxfun = toc
1 commentaire
Teja Muppirala
le 16 Juin 2011
You need roundTargets to be sorted though
Sean de Wolski
le 16 Juin 2011
[~,idx] = min(bsxfun(@(x,y)abs(x-y),v,roundTargets.')); %index of closest
vRounded = roundTargets(idx); %extract values
Keywords?
minimum, absolute, difference, element by element, comparison, index
1 commentaire
Matt Fig
le 16 Juin 2011
You are too fast! I was about to post this with the warning that it could take a ton of memory for large problems because of the intermediate array.
Catégories
En savoir plus sur Matrix Indexing dans Centre d'aide et File Exchange
Produits
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!