create array

1 Ansicht (letzte 30 Tage)
Mate 2u
Mate 2u am 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

Akzeptierte Antwort

Paulo Silva
Paulo Silva am 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 Kommentar
Mate 2u
Mate 2u am 9 Mai 2011
Is there anyway to do it faster without a loop?

Melden Sie sich an, um zu kommentieren.

Weitere Antworten (3)

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

Sean de Wolski
Sean de Wolski am 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 am 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);

Kategorien

Mehr zu Creating and Concatenating Matrices finden Sie in Help Center und File Exchange

Tags

Community Treasure Hunt

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

Start Hunting!

Translated by