我正在尝试生成一个100 x 5矩阵,其中每行是1..100的置换(也就是说,每行是5。[1..100]中的随机数,无重复) 。
到目前为止,我只能使用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
M = 100; % size of population to sample from
K = 5; % desired number of columns
这里是一种可能的方法,[;但是memory-expensive,因为它会生成中间M
×N
矩阵,然后丢弃N
-K
行:
[~, result] = sort(rand(N, M), 2);
result = result(:, 1:K);
np.random.permutation(np.arange(100*5)).reshape(100, 5)
或者如果您想重复一遍:np.random.permutation(np.random.rand(100,5))
这是正常的工作。