我有一個矩陣[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]
我有一個矩陣[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]
你可以只檢查現有行看到,如果當前排列已經存在
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), :);
'randi(size(allperms,1),N,1)'不能保證選擇的排列方式會有所不同。它不應該是'randsample(size(allperms,1),N)'? –
@LuisMendo你說得對。今天沒有足夠的咖啡:)謝謝 – Suever
謝謝@Suever它滿足了我的目標 –
您可以輕鬆地使用MATLAB函數ismember
檢查,如果你剛剛創建的隨機排列已經包含在你的矩陣。
所以你可以嘗試這樣的事情:
for i=1:4
temp = randperm(4);
while ismember(m,temp,'rows')
temp = randperm(4);
end
m(i,:) = temp;
end
謝謝,我會試試看。 –
您在實際代碼中排列了多少個元素?你在用4嗎? 40? – beaker
我會排列9個元素。如果我使用40,那麼它與4有什麼不同? –
它會有所作爲,因爲我要建議的方法是生成所有排列,然後排列這些排列的索引。生成9!排列是可行的。生成40!排列不是。但我看到Suever提出了相同的方法。 :) – beaker