user2284075
user2284075

Reputation: 1

Creating a vector with random sampling of two vectors in matlab

How does one create a vector that is composed of a random sampling of two other vectors?

For example

Vector 1 [1, 3, 4, 7], Vector 2 [2, 5, 6, 8] Random Vector [random draw from vector 1 or 2 (value 1 or 2), random draw from vector 1 or 2 (value 3 or 5)... etc]

Finally, how can one ask matlab to repeat this process n times to draw a distribution of results?

Thank you,

Upvotes: 0

Views: 1167

Answers (5)

yar
yar

Reputation: 1905

This problem can be solved using the function datasample. Combine both vectors into one and apply the function. I like this approach more than the handcrafted versions in the other answers. It gives you much more flexibility in choosing what you actually want, while being a one-liner.

Upvotes: 0

Floris
Floris

Reputation: 46365

If I understand your question, you are choosing two random numbers. First you decide whether to select vector 1 or vector 2; next you pick an element from the chosen vector.

The following code takes advantage of the fact that vector1 and vector2 are the same length:

N = 1000;
sampleMatrix = [vector1 vector2];
M = numel(sampleMatrix);
randIndex = ceil(rand(1,N)*M); % N random numbers from 1 to M
randomNumbers = sampleMatrix(randIndex); % sample N times from the matrix

You can then display the result with, for instance

figure; hist(randomNumbers); % draw a histogram of numbers drawn

When vector1 and vector2 have different elements, you run into a problem. If you concatenate them, you will end up picking elements from the longer vector more often. One way around this is to create random samplings from both arrays, then choose between them:

M1 = numel(vector1);
M2 = numel(vector2);
r1 = ceil(rand(1,N)*M1);
r2 = ceil(rand(1,N)*M2);
randMat = [vector1(r1(:)) vector2(r2(:))]; % two columns, now pick one or the other
randPick = ceil(rand(1,N)*2);
randomNumbers = [randMat(randPick==1, 1); randMat(randPick==2, 2)];

On re-reading, maybe you just want to pick "element 1 from either 1 or 2", then "element 2 from either 1 or 2", etc for all the elements of the vector. In that case, do

N=numel(vector1);
randPick = ceil(rand(1,N)*2);
randMat=[vector1(:) vector2(:)];
randomNumbers = [randMat(randPick==1, 1); randMat(randPick==2, 2)];

Upvotes: 0

Patrick Mineault
Patrick Mineault

Reputation: 741

More generally, if X is a matrix and for each row you want to take a sample from a column chosen at random, you can do this with a loop:

y = zeros(size(X,1),1);
for ii = 1:size(X,1)
    y(ii) = X(ii,ceil(rand*size(X,2)));
end

You can avoid the loop using clever indexing via sub2ind:

idx_n = ceil(rand(size(X,1),1)*size(X,2));
idx   = sub2ind(size(X),(1:size(X,1))',idx_n);
y = X(idx);

Upvotes: 0

user2271770
user2271770

Reputation:

To get one mixed sample, you may use the idea of the following code snippet (not the optimal one, but maybe clear enough):

a        = [1, 3, 4, 7];
b        = [2, 5, 6, 8];
selector = randn(size(a));
sample   = a.*(selector>0) + b.*(selector<=0);

For n samples put the above code in a for loop:

for k=1:n
    % Sample code (without initial "samplee" assignments)
    % Here do stuff with the sample
end;

Upvotes: 0

Stuart
Stuart

Reputation: 885

There are many ways you could do this. One possibility is:

tmp=round(rand(size(vector1)))
res = tmp.*vector1 + (1-tmp).*vector2

Upvotes: 1

Related Questions