我想创建一个x列随机排列的矩阵,从1到10。命令randperm(10)效果很好,但我想创建其中的x。
有没有办法在没有循环的情况下做到这一点? 谢谢,
答案 0 :(得分:3)
我假设每个排列应该以相同的概率生成并且独立于其他排列(因此一些排列可能恰好相同)。
要以矢量化方式生成x
个排列,您可以使用:
N = 10; % population
x = 5; % desired number of permutations
[~, result] = sort(rand(x,N), 2);
这给出了(例子):
result =
7 1 2 9 6 10 3 4 5 8
2 6 4 10 1 7 5 9 3 8
6 10 2 7 9 5 4 3 1 8
7 5 4 6 2 10 8 1 3 9
6 4 2 8 10 9 5 1 7 3
生成1
,...,N
的一个排列的简单方法是
N
个随机数。1
,...,N
的随机排列。因此,要以矢量化方式生成x
个排列:
x
- by - N
随机数矩阵。答案 1 :(得分:1)
以下代码有效但在空间上不是最佳的,因为在从它们采样之前所有n!
个排列。
O(烫发)时间限制
O(n!)空间约束
mat = datasample(perms(1:n),k,'Replace',false);
如果您使用循环,您可以执行以下操作。这里的缺点是你必须在每个循环中检查你的输出矩阵(如果你需要确保唯一的排列)。
O(n!)时间限制
O(k)空间限制
mat = zeros(x,n)
count = 1;
while count < x+1
temp = randperm(n);
if ismember(temp,mat,'rows')
mat(count,:) = temp;
count = count + 1;
end
end
如果你有一个很大的n
,你会在n!
时间之前在MATLAB中遇到n!
空间限制问题,所以我推荐秒溶液强>
如果您有大k/n!
第一个解决方案将明显更快且类似的空间限制
如果你的k and n
较低,那么第一个解决方案可以确保您不需要检查唯一的排列,因此我就是这样做的。
答案 2 :(得分:1)
如果你所追求的是一个单行,我想你可以使用arrayfun
x = 10;
cell2mat (arrayfun (@(n) randperm (10).', [1:x], 'UniformOutput', false))
请注意,这并不能保证唯一的排列,也不一定比for循环更快。