matlab shuffle向量的元素与相同数量的相同序列

时间:2016-09-30 20:36:06

标签: matlab vector shuffle

我有以下矢量 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 个答案:

答案 0 :(得分:3)

您可以使用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));

答案 1 :(得分:3)

@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

答案 2 :(得分: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