Create matrix with randomly distributed integers, with exact relative abundances

1 vue (au cours des 30 derniers jours)
Christopher
Christopher le 14 Oct 2014
Commenté : Thorsten le 14 Oct 2014
I want to create a matrix of randomly distributed integers between 0 and 4 (0, 1, 2, 3, or 4). However, I want the abundance of each integer to conform to a predetermined value.
So if I have a vector of abundances (e.g.):
% 0 1 2 3 4 <--corresponding random numbers
mo = [0 0.5533 0.1346 0.1167 0.1954]; % abundance of random
numbers
and I want to fill up a matrix:
P = zeros(100,100);
I can see that the abundances should be
abund = round(mo.*size(P,1).*size(P,2));
= 0 5533 1346 1167 1954
But how do I fill up the matrix P with these randomly distributed numbers? The important thing is that the abundances are exactly as predetermined.

Réponses (1)

Thorsten
Thorsten le 14 Oct 2014
Modifié(e) : Thorsten le 14 Oct 2014
values = [0:4];
mo = [0 0.5533 0.1346 0.1167 0.1954];
a = 100; b = 100;
% create a vector where each value appears mo(i)*a*b times
P = [];
for i = 1:numel(mo)
P = [P values(i)*ones(1, round(a*b*mo(i)))];
end
% randomize and reshape
P = P(randperm(a*b));
P = reshape(P, [a b]);
% check
hi = hist(P(:), [0:4])
  2 commentaires
Christopher
Christopher le 14 Oct 2014
Modifié(e) : Christopher le 14 Oct 2014
almost correct, but the algorithm fails if i set a=120 and b=120. The array becomes 14399 elements instead of the correct 14400, so reshape fails. Can this be fixed easily?
Edit: sorry the problem is that my vector 'mo' has more decimal places. Is there a way to ensure that the correct size vector for P results (a*b) for any real numbers in the vector 'mo' (as long as mo sums to 1)?
Thorsten
Thorsten le 14 Oct 2014
P = [];
for i = 1:numel(mo)-1
P = [P values(i)*ones(1, round(a*b*mo(i)))];
end
P(end+1:a*b) = values(end);

Connectez-vous pour commenter.

Catégories

En savoir plus sur Creating and Concatenating Matrices dans Help Center et File Exchange

Produits

Community Treasure Hunt

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

Start Hunting!

Translated by