Randomly select an element from a vector satisfying a condition

Dear experts,
I would like to randomly select an element from a vector satisfying a condition. In fact, I want to know what is the fastest way. For example, suppose vector X defined as follows:
X = [1 2 3 4 5 2 3 6 7 8 8 7 9 10 0 1 2 3 8 5 6 4];
How should I randomly select and identify the index of an element in this vector, which is greater than 2?
Thanks for your help,
Amir

 Accepted Answer

I already have an answer to this question as follow (but I am seeking for faster solutions):
Ind = find(X > 2); Ind = Ind(randsample(1:numel(Ind), 1));

2 Comments

The solution seems fine and pretty optimal to me. If you insist on faster move away from MATLAB or buy a faster computer.
Thanks a lot! I've been thinking about the same problem for a long time.

Sign in to comment.

More Answers (2)

This is a two-step process:
  1. create an intermediate array with all elements of X satisfying your condition
  2. select a single element from that
You can combine the two steps in a single command:
randsample(X(X>2), 1)

1 Comment

Thanks for your time. This only gives the value of an element; while I want its index.

Sign in to comment.

Relative speeds are going to depend on the length of X and the value N that the elements have to be greater than, (2 in the example). The following is generally faster, by a factor of 2 or so.
f = find(X > M); % M = 2
Ind = f(randi(length(f)));

3 Comments

Thanks for your answer. The problem here is a same index could be selected more than once if we want to select two or more indices.
I agree, although the question did specify a single draw.
You are right. Many thanks for your attention.

Sign in to comment.

Categories

Community Treasure Hunt

Find the treasures in MATLAB Central and discover how the community can help you!

Start Hunting!