随机排列矩阵

时间:2017-04-01 18:22:09

标签: arrays matlab matrix random permutation

我想创建一个x列随机排列的矩阵,从1到10。命令randperm(10)效果很好,但我想创建其中的x。

有没有办法在没有循环的情况下做到这一点? 谢谢,

3 个答案:

答案 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)

没有for循环

以下代码有效但在空间上不是最佳的,因为在从它们采样之前所有n!个排列。

O(烫发)时间限制

O(n!)空间约束

mat = datasample(perms(1:n),k,'Replace',false); 

使用for循环

如果您使用循环,您可以执行以下操作。这里的缺点是你必须在每个循环中检查你的输出矩阵(如果你需要确保唯一的排列)。

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循环更快。