2016-08-27 49 views
1

我想使用MATLAB生成隨機二進制矩陣A(n×m個)滿足條件:如何生成一個隨機二進制矩陣,其中每行只有一位有值1?

每一行包含具有值1一個位置。其他職位是值0。具有1值的位置是隨機位置。

我想這個代碼

n=5;m=10; 
    %% A = randi([0 1], n,m); 
    A=zeros(n,m); 
    for i=1:n 
     rand_pos=randperm(m); 
     pos_one=rand_pos(1); % random possition of 1 value 
     A(i,pos_one)=1; 
    end 

它是正確的嗎?

+1

*它是否正確?*那麼,你是否嘗試過運行它? –

+0

我運行它,它給了我一個隨機二進制矩陣作爲上述條件。我不確定我的代碼是否正確 – KimHee

+0

我運行它,它滿足了每個**行**包含一個值爲1的位置的條件。 – Rotem

回答

2

解決方案有效,但效率不高。
您正在使用randperm創建矢量(數組),然後僅使用矢量的第一個元素。
可以使用randi來創建一個標量(單個元件)代替:

n=5;m=10; 
A=zeros(n,m); 
for i=1:m 
    %rand_pos gets a random number in range [1, n]. 
    rand_pos = randi([1, n]); 
    A(rand_pos, i)=1; 
end 

還可以使用下面的 「矢量化」 的解決方案:

rand_pos_vec = randi([1, n], 1, m); 
A(sub2ind([n, m], rand_pos_vec, 1:m)) = 1; 

將上述溶液:

  • 在範圍[1,n]中創建一個隨機值向量。
  • 使用sub2ind將「行索引」轉換爲「矩陣索引」。
  • 在「矩陣索引」中放置1。
1

可以使用bsxfunrandi做在一個行:

A = double(bsxfun(@eq, 1:m, randi(n, n, 1))); 

這行矢量[1 2 ... m]與值從1n一個n×1隨機向量進行比較。單比較擴展是按照元素進行比較的。對於每一行,[1 2 ... m]的值中只有一個值等於隨機向量中的值。

相關問題