2013-03-28 22 views
5

在Matlab中randperm()可以產生幾個隨機排列嗎?

P = randperm(N,K)返回含有1隨機地選擇n以下ķ唯一整數的行向量。

能否給randperm()函數返回幾行向量,每個向量都如上所示? 如果沒有,是否有其他方法可以產生幾個隨機排列?

在這種情況下避免迴路一定會更快嗎?

謝謝!

回答

5

RANDPERM本身只返回一個排列。如果你想避免循環中,您可以用ARRAYFUN稱之爲:

Nperm = 5; 
N = 6; 
result = arrayfun(@(x)randperm(N),(1:Nperm)','UniformOutput',0); 

這將返回Nperm X 1單元陣列。將它轉化成矩陣可以使用CELL2MAT:

result = cell2mat(result); 

還有PERMS函數,返回所有排列,但它唯一可行的一個小數字。

也檢查FileExchange提交ALLCOMB,PERMSothers

+0

避免浪費必然會更快嗎? – Tim

+1

沒有必要,特別是在這種情況下arrayfun返回單元格數組,可以減慢速度。但你可以用tic/toc來測試。 – yuk

1

如果你需要所有的排列是相互唯一的,那麼你可以使用如果不是生成所有請求排列如下

permN = 5; 
permK = 4; 
nPerms = 10; 
nGoodPerms = 0; 
nMaxFailedTries = 100; 
nFailedTries = 0; 

permList = cell(nPerms, 1); 

while nGoodPerms < nPerms && nFailedTries <= nMaxFailedTries 
    candidatePerm = randperm(permN, permK); 
    if any(cellfun(@(x)~isempty(x) && all(x == candidatePerm), permList)) 
     nFailedTries = nFailedTries + 1; 
    else 
     nGoodPerms = nGoodPerms + 1; 
     permList{nGoodPerms} = candidatePerm; 
    end 
end 

permList = cell2mat(permList{1:nGoodPerms}); 

也許應該扔掉的警告在那裏(或錯誤)。也可以添加一個預先檢查,以確保nPerms不是愚蠢的大(即,比給定的permNpermK所能產生的更多的獨特排列)。

1

至於p = randperm(n)

在Matlab中2010A及以上,輸入參數k不支持。如果你看一下randperm的代碼

[~, p] = sort(rand(1,n)); 

你會發現它很容易修改它,使它產生n元素m排列(結果現在有大小m X n):

[~, p] = sort(rand(m,n), 2); 

至於p = randperm(n,k)

我不知道Matlab的是如何做的在這種情況下,我的版本不支持它。你總是可以做如上然後修剪:

p = p(:,1:k); 

效率不高的kn小得多,雖然。