如何在Matlab中随机混洗现有矩阵的子元素?

时间:2018-01-17 16:03:16

标签: matlab matrix random shuffle

我在Matlab中有一个从0到3的值矩阵。我想随机改组矩阵的元素,但只在具有1-3范围内值的单元格内(因此只在整个矩阵的子集内)。有没有办法做到这一点?感谢。

1 个答案:

答案 0 :(得分:2)

您可以通过获取所有感兴趣的值的索引(例如logical index),使用randperm随机排列其顺序,然后使用相同的索引将它们分配回矩阵来执行此操作:

% Sample matrix with values from 0 to 3:
M = randi([0 3], 5)

M =

     3     1     0     3     0
     0     3     3     2     0
     1     0     2     1     0
     1     1     2     2     0
     3     0     0     1     0

index = (M > 0);    % Index of values from 1 to 3
values = M(index);  % Vector of indexed values
M(index) = values(randperm(numel(values)))  % Matrix with shuffled values

M =

     2     3     0     2     0
     0     3     1     1     0
     2     0     3     3     0
     1     1     2     1     0
     3     0     0     1     0

请注意,零都在混洗矩阵中的相同位置。另请注意,您仍然拥有相同数量的一,二,三,因为它们只是拖拽到不同的位置。