我有以下矢量
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
谢谢,最好的考虑......
答案 0 :(得分:3)
您可以使用unique
与accumarray
结合使用来创建一个单元格数组,其中每组值都放在一个单独的单元格元素中。然后,您可以将这些元素混洗并将它们重新组合成一个数组。
% 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
它的工作原理如下:
a
的每个元素分配唯一标签,具体取决于其值(这是向量lab
); lab
的值随机投射到自身(随机投射由r
表示;应用的结果为r(lab)
); r(lab)
并获取排序索引(这是ind
); a
。