create array

13 vues (au cours des 30 derniers jours)
Mate 2u
Mate 2u le 9 Mai 2011
Hi considering I want to make a a 3x6624 matrix of random numbers (>0 and <1) but I want the sum of each column of the3 numbers to add up to 1. Any help?
Thanks

Réponse acceptée

Paulo Silva
Paulo Silva le 9 Mai 2011
a=zeros(3,6624);
for b=1:size(a,2)
c(1)=rand/3;
c(2)=rand/3;
c(3)=1-c(1)-c(2);
cr=randperm(3);
a(:,b)=[c(cr(1));c(cr(2));c(cr(3))];
end
  1 commentaire
Mate 2u
Mate 2u le 9 Mai 2011
Is there anyway to do it faster without a loop?

Connectez-vous pour commenter.

Plus de réponses (3)

Mate 2u
Mate 2u le 9 Mai 2011
Is there a way to do this without a loop? So it could perform faster?

Sean de Wolski
Sean de Wolski le 9 Mai 2011
A = rand(3,6624);
A = bsxfun(@rdivide,A,sum(A,1));
Also look at Roger's randfixedsum on the FEX.

Teja Muppirala
Teja Muppirala le 9 Mai 2011
Paulo's algorithm without a loop:
a=zeros(3,6624);
a(1:2,:)=rand(2,6624)/3;
a(3,:)=1-sum(a);
P = randperm(6624*3);
[~,ord] = sort(ceil(P/3));
a(:) = a(P(ord));
figure
hist(a',.05:.1:.95);
Another possible algorithm:
a=zeros(3,6624);
a(1,:) = rand(1,6624);
a(2,:) = (1-sum(a)).*rand(1,6624);
a(3,:) = (1-sum(a)).*rand(1,6624);
a = bsxfun(@rdivide,a,sum(a));
P = randperm(6624*3);
[~,ord] = sort(ceil(P/3));
a(:) = a(P(ord));
figure
hist(a',.05:.1:.95);

Catégories

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

Tags

Community Treasure Hunt

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

Start Hunting!

Translated by