【问题标题】:Can randperm() generate several random permutations?randperm() 可以生成几个随机排列吗?
【发布时间】:2013-03-28 14:49:28
【问题描述】:

在 Matlab 中

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

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

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

谢谢!

【问题讨论】:

    标签: matlab


    【解决方案1】:

    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

    【讨论】:

    • 避免垂死一定会更快吗?
    • 没有必要,特别是在这种情况下,arrayfun 返回的元胞数组会减慢速度。但是你可以用 tic/toc 测试。
    【解决方案2】:

    如果您要求所有排列都是相互唯一的,那么您可以使用以下

    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 生成的独特排列更多)。

    【讨论】:

      【解决方案3】:

      至于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);
      

      虽然kn 小得多,但效率不是很高。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2012-07-05
        • 1970-01-01
        • 2016-03-08
        • 2016-07-15
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多