MATLAB Answers


Vectorizing finding indexes

Sargondjani さんによって質問されました 2012 年 6 月 24 日
hi, i have a vector X and a vector Y (both in ascending order). for every element in X i want the indexes of the values in Y between which this element lies. Actually, 1 index suffices (preferably the higher bound).
For example if have
Y=[0, 1, 2, 3, 4, 5]
X=[0.1, 2.5, 2.8, 4.1];
then I want to get as a result:
IND = [2 4 4 6]; %the higher bounds of the interval in Y in which the elements of X fall
I can do this with a for loop:
for ix=1:length(X);
My question is whether it is possible to vectorize this, and how... Many thanks in advance!

  0 件のコメント

サインイン to comment.

4 件の回答

Walter Roberson
回答者: Walter Roberson
2012 年 6 月 24 日

[counts, tIND] = histc( X, Y );
IND = tIND + 1; %to get the higher index
Note that this has questionable results in the case where an X is exactly equal to a Y: it will return the bin number of the next Y. You could, though, correct for this with
t = (X == Y(tIND));
IND(t) = IND(t) - 1;
It is also possible to correct for it at the time of histc(), but the code becomes notably more difficult to read.

  3 件のコメント

Sargondjani 2012 年 6 月 24 日
thanks Walter!! :-)
i havent worked out the rest of the computations, so i dont know what to do when X is equal to some value of Y, but im sure i can work something out...
by the way, it is weird that i can never find this type of functions when i search for it....
Walter Roberson
2012 年 6 月 24 日
While you are thinking about that, also think about what to do if an X is before or after all of the Y.
See the comments in
Sargondjani 2012 年 6 月 24 日
that's not going to happen. i am doing value function iteration using Y as the grid (for the state variable), and i force my policy function, X, to be in/on the grid

サインイン to comment.

回答者: Jamie Rodgers 2012 年 6 月 24 日

Try This: Your vector
X=[0.1, 2.5, 2.8, 4.1];
Vectorised code

  1 件のコメント

Sargondjani 2012 年 6 月 24 日
this probably works best, because i would actually like to have index of lower bound and index of higher bound... this way i can get them both directly with an understandable method :-)

サインイン to comment.

Andrei Bobrov
回答者: Andrei Bobrov
2012 年 6 月 24 日

[idx,~] = find(bsxfun(@eq,ceil(X(:)'),Y(:)))

  1 件のコメント

Sargondjani 2012 年 6 月 24 日
i really like this but if i change small thing i get results that i dont get!
if i remove the transpose (i would prefer the solution to have the same dimension as X and Y) then i get a weird result
and i get only ones if i remove the (:) unfortunately this solution is probably out of my league

サインイン to comment.

回答者: Sargondjani 2012 年 6 月 24 日

Hmmmmm, andrei and jamie: do your solutions only work when Y consists of integers??? In my example Y was just integers, but in fact Y is not integers...
when i tried your solutions with Y not being integers i got results that were not correct

  1 件のコメント

Walter Roberson
2012 年 6 月 24 日
You are correct: the expressions given by Jamie and Andrei as of the time of my writing this comment, only work for integer Y. My histc() based code does not depend on Y being integer.

サインイン to comment.

Translated by