MATLAB 中高效生成置换矩阵

3
我正在尝试生成一个100行5列的矩阵,其中每一行都是1..100的排列(也就是说,每一行都是由不重复随机数中的5个数字组成)。
到目前为止,我只能用for循环迭代来完成。是否有更高效(使用更少代码)且没有循环的方法?
N = 100;
T = zeros(N, 5);

for i = 1:N
   T(i, :) = randperm(100, 5);
end
2个回答

1
在这个简单的例子中,使用循环几乎没有什么缺点。事实上,它可能是MATLAB执行引擎性能最好的解决方案。但是也许你不喜欢分配临时变量i,或者在你的非最小化实现中有其他向量化的优势。在盲目实施解决方案之前,请仔细考虑这一点。
你需要调用randpermN次,但每次调用与其在输出中的位置无关。如果没有循环索引,你将需要其他东西来调节调用次数,但这可以只是一个N空单元格cell(N,1)。你可以使用此单元格数组来评估调用randperm的函数,但忽略单元格的内容(或者更确切地说,缺少内容),然后使用cell2mat将函数输出重新组合成一个矩阵。
T = cell2mat(cellfun(@(~) {randperm(100,5)}, cell(N,1)));

1

Let

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接