2014-08-28 178 views
1

如何使用布爾元素生成矩陣,但每行的總和等於某個常數。Matlab使用隨機元素生成矩陣

+1

我認爲你可以嘗試生成隨機元素的矩陣。然後按行進行排序並將最大的n個元素設置爲true,將其他元素設置爲false。這會給每一行總和n。 – patrik 2014-08-28 11:04:45

+0

@RTL類似的問題,但鏈接的問題沒有一個接受的答案,這一個是「更容易」,因爲你沒有專欄的特定約束。 – 2014-08-28 11:40:08

+0

@Shai我不知道這是否應該標記爲重複,因爲目前提供的答案非常類似的問題不起作用... – Dan 2014-09-02 06:02:33

回答

1

比方說,你想有20列(n=20)和你的載體a包含您每行中希望的人的數量:

n=20; 
a= [5 6 1 9 4]; 
X= zeros(numel(a),n); 
for k=1:numel(a) 
    rand_order=randperm(n); 
    row_entries=[ones(1,a(k)),zeros(1,n-a(k))]; 
    row_entries=row_entries(rand_order); 
    X(k,:)=row_entries; 
end 
X=boolean(X); 

我做的是生成一個隨機排序索引數組rand_order,然後得到一個數組,其中包含所需數量的零填充。根據rand_order將這些元素重新排序並保存並將其轉換爲邏輯。而且由於使用的for循環rand_order的是所有的時間再次計算,所以讓你的輸出不同的地點:

1  0  0  0  0  0  0  0  0  1  0  0  0  0  0  1  1  1  0  0 
0  0  0  1  0  0  0  1  1  0  1  0  0  0  0  0  1  1  0  0 
0  0  0  0  0  0  0  0  0  0  0  0  1  0  0  0  0  0  0  0 
1  0  0  1  0  1  1  0  1  0  0  1  1  0  0  0  1  1  0  0 
1  0  0  0  1  0  0  0  0  0  1  0  1  0  0  0  0  0  0  0 
+0

你的方法的作品!謝謝 – 2014-08-28 11:23:05

+1

你錯過了一個編輯。將該轉換置於循環外的布爾值。否則,你每次都這樣做。還要檢查一下Dan的解決方案,該解決方案沒有任何循環(對於大矩陣來說可能更快) – 2014-08-28 11:24:54

6

每一行都是相同的一個數字嗎?

k = 5; 
m = 10; 
n = 10; 

[~, I] = sort(rand(m,n), 2)  
M = I <= k 

如果你不希望相同數量的1 s分別排,而是有你想要多少1當時的你需要使用bsxfun以及矢量每行指定:

K = (1:10)';      %//' 
m = 10; 
n = 10; 

[~, I] = sort(rand(m,n), 2)  
M = bsxfun(@ge, K,I) 
+0

偉大的解決方案。這個問題似乎很難矢量化 – 2014-08-28 11:37:30