在MATLAB中高效生成置换矩阵

问题描述 投票:1回答:3

我正在尝试生成一个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 combinatorics
3个回答
1
投票

至少在此最小示例中,此处使用循环的缺点很小。实际上,对于MATLAB的执行引擎来说,这可能是性能最好的解决方案。但是,也许您不喜欢分配临时变量i,或者在非最小实现中矢量化还有其他优点。在盲目地实施解决方案之前,请仔细考虑这一点。

您需要调用randperm N次,但是每个调用都不依赖于其在输出中的位置。没有循环索引,您将需要其他一些东西来调节调用次数,但这可以只是N个空单元格cell(N,1)。您可以使用此单元格数组来评估调用randperm但忽略单元格内容(或缺少内容)的函数,然后使用cell2mat将函数输出重组为一个矩阵:

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

0
投票

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

-1
投票
您可以在循环中使用它:np.random.permutation(np.arange(100*5)).reshape(100, 5)

或者如果您想重复一遍:np.random.permutation(np.random.rand(100,5))

这是正常的工作。

© www.soinside.com 2019 - 2024. All rights reserved.