randperm()会产生几个随机排列吗?

时间:2013-03-28 14:49:29

标签: matlab

在Matlab中

  

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

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

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

谢谢!

3 个答案:

答案 0 :(得分: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提交内容ALLCOMBPERMSothers

答案 1 :(得分: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生成的更多唯一排列。

答案 2 :(得分:1)

至于p = randperm(n)

在Matlab 2010a及更早版本中,不支持输入参数k。如果你看一下randperm的代码

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

您会看到修改它非常容易,因此它会生成mn元素的排列(结果现在的大小为m x n):

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

至于p = randperm(n,k)

我不知道Matlab在这种情况下是如何做到的,因为我的版本不支持它。您可以随时执行上述操作然后修剪:

p = p(:,1:k);

k的效率不如n小得多。