in matlab, find the array position of an entry closest to some arbitrary value
March 4th, 2006 by Lawrence David
a friend asked:
matlab question: i have an array of data. how do i get matlab to find the position of an entry closest to some arbitrary value?
for instance, i would have
a= [1; 4; 6; 8; 12]
i want to search for 9 and have matlab spit back 4, the entry in a closest to 9.
here’s one way to solve that problem (assuming that variable k=9):
>> [min_difference, array_position] = min(abs(a - k))
wheree array_position is the desired index value.
Something like
[rte,index]=min(abs(X-x0)); where x0 is the target and X is the array you want to search in works. The answer is index.
i believe that’s exactly what i wrote above.
Thanks guys!
??? that returns the difference between the closest and the target vale not its INDEX
hilikus:
the second argument returned is the index; the first argument returned is the difference.
Bah, nevermind, i didnt see the double output
>> [trash array_position] = min(abs(a - k))
probably should have a “,” or odd things may happen.
[trash, array_position] = min(abs(a - k))
I wasted a lot of time recently and that simple problem caused it.
D
I love you for this! *mwah*
thanks guys!!!!!!!!! saved me hours developing my own algorithm!
Man, you guys really rock! Thanks a lot, saved me hours. Keep up the good work!!
Thanks a lot, exacty what I needed, so economy of many time ;=)
Cédric
can you do something similar but for several k’s at a time?
Is there a similar way to get position information out of a matrix.
I tried something like,
[row,col]=min(min(matrix))
but that returns only the final row that the element is in, not its exact location.
[...] to see the wood for the trees”. I guess it is also know to non-German speakers? I just found this very trivial, banal and easy Matlab command line, which makes my equivalent lines look very stupid and [...]
Nice! Saved me some time!
How Matlab search the object or variable name in simulink model.
mean Functionality of Edit->Find…(Ctrl+F).
but what if you want to be sure you at the value closest to this value right/left side?
for instance, a cumulative probability vector and you want to find the index for the value that is the first above 0.5?
greato!
thanks a lot!
Thanks for post this! You just made my life easier.
apparently, the space this took in my brain was previously occupied by my knowledge of the English language… sorry.
Thanks for posting this. You just made my life easier.
you could use something like this for multiple ‘k’s (’range’ == ‘a’, ‘vector’ is a set of ‘k’s):
function inds = findClosest(range, vector)
% ‘flatten’ everything into row vectors
origshape = size(vector);
sz_r = size(range);
numTargets = sz_r(1) * sz_r(2);
numInputs = origshape(1) * origshape(2);
range = reshape(range, [1, numTargets]);
vector = reshape(vector, [1, numInputs]);
% find the difference between the target values and the actual values
% ‘range’ is replicated across columns,
% ‘vector’ is replicated across rows
diff = repmat(range’, 1, numInputs);
diff = diff - repmat(vector, numTargets, 1);
diff = abs(diff);
[vals, inds] = min(diff);
inds = reshape(inds, origshape);
end
Much better than my routine, which always
gets confused by the extrema of the array.
And faster too, love it.