在 MATLAB 中高效生成置换矩阵

Efficient generation of permutation matrices in MATLAB

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

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

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

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

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

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

T = cell2mat(cellfun(@(~) {randperm(100,5)}, cell(N,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);