【问题标题】:Efficient generation of permutation matrices in MATLAB在 MATLAB 中高效生成置换矩阵
【发布时间】:2019-12-05 15:45:37
【问题描述】:

我正在尝试生成一个 100×5 矩阵,其中每一行都是 1..100 的排列(也就是说,每一行都是 5 个来自 [1..100] 的随机数,没有重复)。

到目前为止,我只能使用 for 循环迭代地完成它。有没有办法更有效地做到这一点(使用更少的代码行),没有循环?

N = 100;
T = zeros(N, 5);

for i = 1:N
   T(i, :) = randperm(100, 5);
end

【问题讨论】:

    标签: matlab combinatorics


    【解决方案1】:

    N = 100; % desired number of rows
    K = 5;   % desired number of columns
    M = 100; % size of population to sample from
    

    这是一种可能快速的方法;但是内存消耗很大,因为它会生成一个中间M×N 矩阵,然后丢弃N-K 行:

    [~, result] = sort(rand(N, M), 2);
    result = result(:, 1:K);
    

    【讨论】:

      【解决方案2】:

      在这里使用循环几乎没有什么缺点,至少在这个最小的例子中是这样。事实上,它很可能是 MATLAB 执行引擎的最佳性能解决方案。但也许您不喜欢分配临时变量i,或者在您的非最小实现中矢量化还有其他优势。在盲目实施解决方案之前,请仔细考虑这一点。

      您需要调用randpermN 次,但每次调用都与其在输出中的位置无关。如果没有循环索引,您将需要其他东西来调节调用次数,但这可能只是N 空单元格cell(N,1)。您可以使用此元胞数组来评估调用randperm 但忽略元胞内容(或者更确切地说是缺少内容)的函数,然后使用cell2mat 将函数输出重新组合成一个矩阵:

      T = cell2mat(cellfun(@(~) {randperm(100,5)}, cell(N,1)));
      

      【讨论】: