2017-03-28 26 views
0

我有一個矩陣[1 2 3 4],我想用randperm在幾次洗牌,但我想獲得不同的矩陣。例如有沒有什麼辦法可以在randperm中獲得不同的混洗?

for i=1:4  
    m(i,:)=randperm(4); 
end 

會給我4行4列,但我希望每一行都不同於其他所有行;例如像這樣:

m(1,:)=[1 3 4 2] 
m(2,:)=[2 3 1 4] 
m(3,:)=[2 1 4 3] 
m(4,:)=[4 3 2 3] 
+0

您在實際代碼中排列了多少個元素?你在用4嗎? 40? – beaker

+0

我會排列9個元素。如果我使用40,那麼它與4有什麼不同? –

+0

它會有所作爲,因爲我要建議的方法是生成所有排列,然後排列這些排列的索引。生成9!排列是可行的。生成40!排列不是。但我看到Suever提出了相同的方法。 :) – beaker

回答

3

你可以只檢查現有行看到,如果當前排列已經存在

m = zeros(4, 4); 

counter = 1; 

while counter < 4 
    new = randperm(4); 
    if ~ismember(new, m, 'rows') 
     m(counter, :) = new; 
     counter = counter + 1; 
    end 
end 

另一個(內存密集型)的方法是生成全部排列然後隨機選擇其中的N個

allperms = perms(1:4); 
N = 4; 

m = allperms(randsample(size(allperms,1), N), :); 
+0

'randi(size(allperms,1),N,1)'不能保證選擇的排列方式會有所不同。它不應該是'randsample(size(allperms,1),N)'? –

+0

@LuisMendo你說得對。今天沒有足夠的咖啡:)謝謝 – Suever

+0

謝謝@Suever它滿足了我的目標 –

1

您可以輕鬆地使用MATLAB函數ismember檢查,如果你剛剛創建的隨機排列已經包含在你的矩陣。

所以你可以嘗試這樣的事情:

for i=1:4 
    temp = randperm(4); 
    while ismember(m,temp,'rows') 
     temp = randperm(4); 
    end 
    m(i,:) = temp; 
end 
+0

謝謝,我會試試看。 –

相關問題