在Matlab中对矩阵元素进行洗牌

12

我有一个矩阵,想要对其中的元素进行随机排序。

x=[1 2 5 4 6 ]

洗牌后的结果(类似这样)

x=[2 4 6 5 1]    

Matlab是否有相应的函数?在PHP中,array_shuffle可以实现此功能。

2个回答

24
  1. 使用randperm获得打乱后的索引。

idx = randperm(length(x));
  • 使用索引获取洗牌向量

    xperm = x(idx);


  • 我们如何打乱n*n矩阵?一种方法是逐行创建idx:第一行使用randperm(n),第二行使用n+randperm(n),第三行使用2n+randperm(n),以此类推...然后使用这些索引。这样做正确吗?有更好的方法吗?谢谢! - Zahra Moradimanesh

    6
    作为 randperm 的替代方法,您还可以使用统计工具箱中的 randsample

    y = randsample(n,k) 返回一个大小为 k-by-1 的向量 y,其中的值是从整数 1n 中随机抽取的,且不会重复。

    请注意,默认情况下是“无放回”的。因此,如果将 k 设置为 x 的长度,那么它等价于对向量进行随机排列。例如:
    x = 1:5;
    randsample(x,length(x))
    %ans = 
    %       4     5     3     1     2
    

    我更喜欢这种方式,因为它可以轻松地扩展到不同的用途。例如,要从 x 中随机抽取3个元素(就像从有限物品的桶中抽取),你只需使用 randsample(x,3)。同样,如果您希望随机产生由 x 的元素组成的字母表中的3个数字,并允许重复,则需要使用 randsample(x,3,true)


    网页内容由stack overflow 提供, 点击上面的
    可以查看英文原文,
    原文链接