【发布时间】:2013-03-28 14:49:28
【问题描述】:
在 Matlab 中
p = randperm(n,k) 返回一个行向量,其中包含从 1 到 n 随机选择的 k 个唯一整数。
一次调用 randperm() 是否可以返回多行向量,每行都如上? 如果没有,是否有其他方法可以生成多个随机排列?
在这种情况下,避免循环一定会更快吗?
谢谢!
【问题讨论】:
标签: matlab
在 Matlab 中
p = randperm(n,k) 返回一个行向量,其中包含从 1 到 n 随机选择的 k 个唯一整数。
一次调用 randperm() 是否可以返回多行向量,每行都如上? 如果没有,是否有其他方法可以生成多个随机排列?
在这种情况下,避免循环一定会更快吗?
谢谢!
【问题讨论】:
标签: matlab
【讨论】:
如果您要求所有排列都是相互唯一的,那么您可以使用以下
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 排列(结果现在的大小为mxn):
[~, p] = sort(rand(m,n), 2);
至于p = randperm(n,k):
我不知道 Matlab 在这种情况下是如何做到的,因为我的版本不支持它。你总是可以像上面那样做,然后修剪:
p = p(:,1:k);
虽然k 比n 小得多,但效率不是很高。
【讨论】: