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

如何在Matlab中随机洗牌现有矩阵元素的子集?,matlab,matrix,random,shuffle,Matlab,Matrix,Random,Shuffle,我在Matlab中有一个从0到3的值矩阵。我想随机洗牌矩阵的元素,但只在值在1-3范围内的单元格内(因此只在整个矩阵的子集内)。有办法吗?谢谢。您可以通过获取所有感兴趣的值(如a)的索引,使用随机排列它们的顺序,然后使用相同的索引将它们分配回矩阵来实现这一点: % Sample matrix with values from 0 to 3: M = randi([0 3], 5) M = 3 1 0 3 0 0 3 3

我在Matlab中有一个从0到3的值矩阵。我想随机洗牌矩阵的元素,但只在值在1-3范围内的单元格内(因此只在整个矩阵的子集内)。有办法吗?谢谢。

您可以通过获取所有感兴趣的值(如a)的索引,使用随机排列它们的顺序,然后使用相同的索引将它们分配回矩阵来实现这一点:

% 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

请注意,所有的零仍然在混合矩阵中的相同位置。还要注意的是,1、2和3的数量仍然相同,因为它们只是随机移动到不同的位置。

非常有用。这正是我想做的。非常感谢。