【问题标题】:shuffle matrix element in matlabmatlab中的随机矩阵元素
【发布时间】:2012-11-06 18:26:19
【问题描述】:

我有一个 martix 并且想要洗牌它的元素。

x=[1 2 5 4 6 ]

洗牌后(像这样)

x=[2 4 6 5 1]    

matlab 有它的功能吗? 在 php array_shuffle 中这样做。

【问题讨论】:

    标签: matlab


    【解决方案1】:

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

    y = randsample(n,k) 返回一个k-by-1 向量y,该向量从整数1n 随机均匀采样,无需替换。

    请注意,它是“无替换”(默认情况下)。所以如果你将k设置为length(x),就相当于对向量进行随机洗牌。例如:

    x = 1:5;
    randsample(x,length(x))
    %ans = 
    %       4     5     3     1     2
    

    我比randperm 更喜欢这个,因为它很容易扩展到不同的用途。例如,要从x 中随机抽取 3 个元素(例如从具有有限项的桶中抽取),您可以使用randsample(x,3)。同样,如果您想绘制 3 个数字,其中字母表由 x 的元素组成,但允许重复,您可以使用 randsample(x,3,true)

    【讨论】:

      【解决方案2】:
      1. 使用randperm 获得洗牌索引

        idx = randperm(length(x));
        
      2. 使用索引获得混洗向量

        xperm = x(idx);

      【讨论】:

      • 我们如何洗牌 n*n 矩阵?一种方法是逐行创建 idx:第一行使用 randperm(n),第二行使用 n+randperm(n),第三行使用 2n+randperm(n),依此类推......然后使用索引。这个对吗?有没有更好的办法?谢谢!