2012-02-16 21 views

回答

10

使用bsxfun,而不是repmat

mat = rand(100, 8); 
rowsum = sum(mat,2); 
mat = bsxfun(@rdivide, mat, rowsum); 
-2

rand(100,8) 

會產生隨機數的100行和8列其所有的條目可以被添加到1。如果你想要什麼,不辦一個矩陣,你必須多解釋一下自己。

+1

-1這就產生隨機數的矩陣中,每個0和1之間的行別分佈t總和爲1,這是提問者所要求的。 – Matt 2012-02-16 16:02:45

4

您可以先創建隨機矩陣,然後規範化它使每行都有一個總和等於1(如果這是你的意思):

mat=rand(100,8); 
matnorm=repmat(sum(mat,2),1,8); 
mat=mat./matnorm; 
6

這裏的另一個想法:對於每一行,你可以生成7張隨機數(0和1之間),並把這些作爲你的「間隔」的位置 - 那筆換句話說,在8張隨機數爲1時,這些是你的部分款項。然後,您可以對它們進行排序並採取差異來獲得隨機數字。這裏是我在想什麼的代碼:

numrows = 100; 
partialsums = [zeros(numrows,1), rand(numrows,7), ones(numrows,1)]; 
partialsums = sort(partialsums, 2); 
randmat = diff(partialsums, 1, 2); 

根據你的方式,數字的分佈會有所不同。我將這種方法與Aabaz發佈的方法進行了比較,我得到了這個分發。

enter image description here

所以我的看起來多了幾分指數,你得到一些更高的價值,他是一個小更均勻,但你得到的隨機數的下限截止。

+0

+1指出有不同的方式導致不同的分佈。 – 2013-06-17 14:00:59

1

第1步:計算向量的範數,它是該向量中元素平方和的平方根。

第2步:將向量中的每個元素除以向量的範數。

第3步:將得到的矢量與其轉置相乘,以平方矢量中的每個元素。

然後,可以看到,在向量(最終)得到的元素的總和加起來爲1。