MATLAB 2D randperm没有for循环

时间:2015-01-12 23:46:33

标签: matlab random permutation

我想制作一个随机排列的二维数组,其中每一行可能包含在前一行中生成的数字。但是在同一行中不能有相同的数字。

是否有以下代码执行no for for循环?

a = (1:100);
b = zeros(size(a,2), 4);
for i = 1:size(a, 2)
     r = randperm(size(a, 2),4);
     b(i,:) = r;
end

2 个答案:

答案 0 :(得分:1)

如果您没有内存限制,则可以使用以下方法(当仅实际需要" 4"列时,它会生成中间" 100" - 列矩阵):

  1. 生成完整的排列。这可以通过sort的第一个输出轻松完成(模仿旧的Matlab版本中randperm的编码方式)。
  2. 修剪所需的列数。
  3. 代码:

    a = 1:100;
    n = 4;
    [~, result] = sort(rand(numel(a)),2);   %// step 1
    result = result(:, 1:n);                %// step 2
    

答案 1 :(得分:0)

产生类似结果的一种不那么有效的方式(主要是因为排序)是:

[dummy, idx] = sort(rand(100, 4));
b = idx';

正如所指出的,这会生成一个包含非重复元素行的数组b,但它有4行100列而不是相反的行。请改用路易斯的解决方案。