【问题标题】:matlab shuffle elements of vector with the same sequent of the same numbermatlab 随机播放具有相同数字的相同序列的向量元素
【发布时间】:2016-09-30 20:36:06
【问题描述】:

我有以下向量 a = 3 3 5 5 20 20 20 4 4 4 2 2 2 10 10 10 6 6 1 1 1 有谁知道如何用相同的元素洗牌这个向量永远不会分开? 像下面这样的东西 a = 10 10 10 5 5 4 4 4 20 20 20 1 1 1 3 3 2 2 2 6 6 谢谢你,最好的尊重...

【问题讨论】:

  • 组是否始终保证是唯一的,以至于您不会拥有:3 3 5 5 3 3 4 4
  • 是的,我有这个矩阵首先 a = [3 2;5 2;20 3;4 3;2 3;10 3;6 2;1 3] 我做了一些事情,我的矩阵变成了: a = [3 2;3 2;5 2;5 2;20 3;20 3;20 3;4 3;4 3;4 3;2 3;2 3;2 3;10 3;10 3;10 3 ;6 2;6 2;1 3;1 3;1 3] 现在我需要随机化第一行的值...

标签: matlab vector shuffle


【解决方案1】:

您可以将uniqueaccumarray 结合使用来创建一个元胞数组,其中每组值都放置在一个单独的元胞元素中。然后,您可以打乱这些元素并将它们重新组合成一个数组。

% Put each group into a separate cell of a cell array
[~, ~, ind] = unique(a);
C = accumarray(ind(:), a(:), [], @(x){x});

% Shuffle it
shuffled = C(randperm(numel(C)));

% Now make it back into a vector
out = cat(1, shuffled{:}).';

%   20 20 20  1  1  1  3  3 10 10 10  5  5  4  4  4  6  6  2  2  2

另一种选择是使用unique 获取值,然后计算每个值出现的数量。然后,您可以打乱这些值并使用repelem 展开结果

u = unique(a);
counts = histc(a, u);

% Shuffle the values
inds = randperm(numel(u));

% Now expand out the array
out = repelem(u(inds), counts(inds));

【讨论】:

    【解决方案2】:

    与@Suever 非常相似的答案,使用循环和逻辑矩阵而不是单元格

    a = [3 3 5 5 20 20 20 4 4 4 2 2 2 10 10 10 6 6 1 1 1];
    
    vals = unique(a); %find unique values
    vals = vals(randperm(length(vals))); %shuffle vals matrix
    
    aout = []; %initialize output matrix
    for ii = 1:length(vals)
         aout = [aout a(a==(vals(ii)))]; %add correct number of each value
    end
    

    【讨论】:

      【解决方案3】:

      这是另一种方法:

      a = [3 3 5 5 20 20 20 4 4 4 2 2 2 10 10 10 6 6 1 1 1];
      [~, ~, lab] = unique(a);
      r = randperm(max(lab));
      [~, ind] = sort(r(lab));
      result = a(ind);
      

      示例结果:

      result =
           2  2  2  3  3  5  5 20 20 20  4  4  4 10 10 10  1  1  1  6  6
      

      它的工作原理如下:

      1. 根据a 的每个元素的值分配唯一标签(这是向量lab);
      2. lab的值随机双射应用于自身(随机双射由r表示;应用结果为r(lab));
      3. 排序r(lab),得到排序的索引(这是ind);
      4. 将这些索引应用于a

      【讨论】:

        猜你喜欢
        • 2012-11-05
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-06-26
        • 1970-01-01
        • 1970-01-01
        • 2020-12-10
        • 1970-01-01
        相关资源
        最近更新 更多