2010-03-30 23 views
3

什麼是生成大小爲N的隨機二進制向量的數X的最佳方式,其濃度爲1s(或者相似,爲0),從非常低到很高?Matlab - 高濃度1s(或0s)的二元向量

使用randint或unidrnd(如this question)會生成均勻分佈的二元向量,這不是我在這種情況下需要的。

任何幫助表示讚賞!

+1

當你說濃度跨越「從很低到很高」時,你是什麼意思?這是否意味着您計算的每個向量比最後一個向量具有更多的(或零),或者一個向量的集合(或零)從向量的一端到另一端的集中程度變大了? – gnovice 2010-03-30 23:22:57

+0

我的意思是,我需要一些載體具有高濃度的1s,但也有一些載體具有很低的1s濃度 - 從很高到很低 – JohnIdol 2010-03-30 23:26:19

回答

6

Laserallan的方法是要走的路。

對於具有10個元素和70對%那些是隨機分佈的向量,則寫

randVec = rand(10,1)<0.7; 

EDIT如果你想長度爲N的X矢量,隨着那些的量,則寫

thresVec = linspace(0,1,X); %# thresholds go from 0 (all 0) to 1 (all 1) 
randVec = bsxfun(@lt,rand(N,X),threshVec); %# vectors are per column 

請注意randVec是一個邏輯數組。根據你想用它做什麼,你可能需要將其轉換爲加倍像這樣

randVec = double(randVec); 
+0

隨着1s的增加,解決方案將會很好地支持Jonas - tnx! – JohnIdol 2010-03-30 23:55:35

1

你可以在均勻分佈的二進制向量上使用位或操作,但我懷疑你最終得到的確切分佈會有點複雜。

+0

聽起來像一個良好的預感 - 我會隨機運行OR相鄰位之間的操作?我很高興,如果我得到大量的高密度規則(無論是1還是0),或者我會猜測我會在統一分佈上獲得大多數1。我可以對三分之一的人口運行ORs,另外三分之一運行ORs,剩下的就剩下了嗎? :) – JohnIdol 2010-03-30 23:18:02

+1

我在想比特率是兩個獨立的均勻分佈,例如用75%1s創建一個數字(然後你可以比特位 - 例如用第三個獨立的統一數字來獲得62.5%1s)。您應該能夠使用一種二進制搜索方法合理地直接生成任何密度。 如果原始值不是真正均勻分佈的,雖然此方法可能相當不穩定。 – James 2010-03-30 23:24:30

3

我不是matlab的專家,但一個應該很容易實現的方法是生成浮點隨機數(最好在1到0的範圍內)的向量,然後將值設置在特定閾值以上1以下設爲0. 假設您想要30%的值,您將所有值設置爲.7以上且1以下的值爲0.

+0

問題是,我希望高密度/低密度的分佈在整個人口中也是隨機的 – JohnIdol 2010-03-30 23:21:09

+1

如果您可以表達作爲x的函數的更高和更低的分佈,其中x是特定元素的指數在向量中,你可以使用它作爲選擇位置x的值是1還是0的閾值。 – Laserallan 2010-03-30 23:24:54

2

使用

rand(N,1)<p %# 0 < p < 1 

會給你平均 N *ρ個一NX1向量在其中(和其他地方將是零) - 但在一些運行中,你可能會得到一個不同於你期望的向量(它可能有全零例如...可能是一個非常低的機會,但仍然是非零的機會)。

如果你想正是一者和B零,你可以這樣做:

rand_vec = [ones(A, 1); zeros(B, 1)]; 
rand_vec = rand_vec(randperm(A+B)); 

然後你就可以將A和B,以符合您的需求。

編輯:
現在我明白你的問題好: 比方說你有一個包含在你的人口的1的通緝比例的矢量P,N爲每個向量元素的數量。

rand_mat = rand(N, size(p,2)) < repmat(p', [1,N])'; 

會給你一個NX(大小(P,2))矩陣,其中第i列是P(I)那些的載體(平均如上所述),剩下的就是零。