5

在 Matlab 中

p = randperm(n,k) 返回一个行向量,其中包含从 1 到 n (含)随机选择的 k 个唯一整数。

一次调用 randperm() 是否可以返回多行向量,每一行都如上?如果没有,还有其他方法可以生成几个随机排列吗?

在这种情况下,避免循环一定会更快吗?

谢谢!

4

3 回答 3

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提交的 ALLCOMBPERMS等。

于 2013-03-28T14:58:34.947 回答
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});

如果没有生成所有请求的排列,则可能应该在那里发出警告(或错误)。也可以添加一个事先检查以确保它不是愚蠢的大(即,比使用给定的andnPerms生成的更独特的排列)。permNpermK

于 2013-03-28T15:12:06.913 回答
1

至于p = randperm(n)

在 Matlab 2010a 及更早版本中,k不支持输入参数。如果您查看randperm's 代码

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

您会看到修改它非常容易,以便它产生元素的m排列n(结果现在具有大小mx n):

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

至于p = randperm(n,k)

我不知道 Matlab 在这种情况下是如何做到的,因为我的版本不支持它。你总是可以像上面那样做,然后修剪:

p = p(:,1:k);

k但是,对于比 小得多的情况不是很有效n

于 2014-08-10T22:48:54.107 回答