在Matlab中randperm()可以產生幾個隨機排列嗎?
P = randperm(N,K)返回含有1隨機地選擇n以下ķ唯一整數的行向量。
能否給randperm()函數返回幾行向量,每個向量都如上所示? 如果沒有,是否有其他方法可以產生幾個隨機排列?
在這種情況下避免迴路一定會更快嗎?
謝謝!
在Matlab中randperm()可以產生幾個隨機排列嗎?
P = randperm(N,K)返回含有1隨機地選擇n以下ķ唯一整數的行向量。
能否給randperm()函數返回幾行向量,每個向量都如上所示? 如果沒有,是否有其他方法可以產生幾個隨機排列?
在這種情況下避免迴路一定會更快嗎?
謝謝!
如果你需要所有的排列是相互唯一的,那麼你可以使用如果不是生成所有請求排列如下
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
不是愚蠢的大(即,比給定的permN
和permK
所能產生的更多的獨特排列)。
至於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);
效率不高的k
比n
小得多,雖然。
避免浪費必然會更快嗎? – Tim
沒有必要,特別是在這種情況下arrayfun返回單元格數組,可以減慢速度。但你可以用tic/toc來測試。 – yuk