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.
[...] why multiple output arguments in Matlab were a poor design decision. But here is a start. In an unsuccessful attempt to find a code that’s less than O(N*M) in storage for a problem that in a…, I saw that someone on Yahoo! Answers wants to know, Is there a similar way to get position [...]
Hey Lawrence. Columbia BME ’04 alum here. I googled for your little trick here and was pleasantly surprised to find your blog. Keep up the good work.
Jay
Lawrence, I really enjoy your blog, I have found useful answers to many questions. This one was not the exception. Thanks a lot and keep up the great work.
This was a fantastic hint. Simple and effective. Saved me hours of trying to bin data for use in a data averaging algorithm. Glad to see being clever is working out for you. Thanks!
This is a great tip thanks.
I did have one problem with it though, in an unlikely scenario. I was using it in my code when a could be only one value (ie, len(a) = 1) when this is the case MATLAB does not like it when the ‘min’ function is only working on one value and returns an error (??? Index exceeds matrix dimensions.)
I fixed it in my code by placing an ‘if’ statement to check to see that the length of ‘a’ is more than one. Is anybody aware of a simpler method of solving this problem??
thanks,
Matt
oops, no, ignore my message. I’m an idiot, the problem was, that I errenously had created a variable called ‘min’ in my code previously and matlab was calling that variable instead of the min function.
Hi gays,
I’ve had the same problem several times in my research, so I’ve developed a function to get the index “index” associated to the closest value to “value” closest element in “freqVect” .
Hope you gays find it useful!!
———————————
function index = getFreqIndex(freqVect,value)
% Esta funcion busca dentro de un vector con valores no necesariamente igualmente espaciados
% y devuelve el indice mas cercano del vector que corresponde al valor “value”.
% El resultado se da dentro de una banda de precision de la forma [value-df1,value+df2].
% Ojo, el vector no puede tener valores repetidos.
index=-1;
for i=1:length(freqVect)
switch(i)
case 1
df1=0;
df2=abs(freqVect(i)-freqVect(i+1))/2;
case length(freqVect)
df1=abs(freqVect(i)-freqVect(i-1))/2;
df2=0;
otherwise
df1=abs(freqVect(i)-freqVect(i-1))/2;
df2=abs(freqVect(i)-freqVect(i+1))/2;
end
if(freqVect(i)>=value-df1 && freqVect(i)freqVect(length(freqVect))), index=length(freqVect);end
if(value<freqVect(1)), index=1;end
end
end
for finding the exact location of any data in the array (both the row and column)
try this
[I,J] = find(T==max(max(T)))
where T is the array.
great8 (°_°)!
thanks a lot!
i had spend more then 10hrs for it.
thank you soo much.
<3 <3
Hi, I have a very large matrix, i have the matrix index (x,y,z) but im intrested in the actual value of this index in the original array. How do I go about this?
Hi, I have a very large matrix, i have the matrix index (x,y,z) but im intrested in the actual value of this index in the original array. How do I go about this? Kelz
Worked brilliant, thanks!
how to find proximity matrix of binary data?
and how to find angle for bounding boxes of binary image using PCA
Hi!
I need to find a value in different Array(n,m).
I try to use something like this:
[n,m]=find(A47==9941005309)
and this works well, so i need a loop that for i=1:47 searchs 9941005309 in A1, A2, Ai…
I tried like this:
[n,m]=find(R,num2str(l)==9941005309)
where R=’A’ but it doesn’t work, where I’m wrong?
Thanks for help me!
For multidimensional matrices:
[i,j,k] = closest_match(M,a)
% Find the indices of the value closest to a in matrix M
[~, linear_index] = min(abs(T(:)-val)));
[i,j,k] = ind2sub(size(T),linear_index)
Edit to above; I forgot to type “function”
function [i,j,k] = closest_match(M,a)
What if I need the closest entry of the array but within limits?
Example to clarify:
I have the array test=[5,6,7,8,9,10] and I want the index of the entry closest to 5 out of the entries that are >=6 (therefore the index of 6 -> 2).
[~,idx]=min(abs(5-test)) returns 1 of course…
At first I though about trying something like
[~,idx]=min(abs(5-test(test>=6)))
but it won’t do since 6 has idx=1 within the test(test>=6) array and therefore the ans is still idx=1.
Any ideas?