【问题标题】:Random numbers using rand() in matlab在 matlab 中使用 rand() 随机数
【发布时间】:2018-08-07 03:00:50
【问题描述】:

我正在使用 Matlab 函数 round(rand(256)) 创建一个大小为 256x256 且随机分布 0 和 1 的方阵。

我特别想做的是,我想以某种方式指定 rand()(或任何其他相关函数)随机生成并分布在整个矩阵中的 1 的数量

【问题讨论】:

    标签: matlab matrix


    【解决方案1】:

    Magdrop’s answer 是最直接的方法,它计算随机值的百分位数以确定阈值。

    另外两个选项涉及randperm

    1. 将所有索引随机排列到矩阵中,然后阈值:

      sz = [256,256]; % matrix size
      n = 256; % number of zeros
      M = randperm(prod(sz)) <= n;
      M = reshape(M,sz);
      
    2. 随机排列索引并选择n作为索引的位置:

      indx = randperm(prod(sz),n);
      M = zeros(sz);
      M(indx) = 1;
      

    【讨论】:

      【解决方案2】:

      您也可以按通常的方式生成随机值,但在四舍五入之前,将它们排序为向量。 1 的数量将成为您想要切割为 1 或 0 的已排序向量中的索引。例如,假设我们想要 50 个 1:

      matrix = rand(256,256);
      vec = sort(reshape(matrix,[],1));
      thresh = vec(50);
      matrix(matrix <= thresh) = 1;
      matrix(matrix > thresh) = 0; 
      

      【讨论】:

        【解决方案3】:

        您可以使用randi 函数来确定插入这些的位置,然后将这些放置到您的矩阵中。例如n 的:

        matrix = zeros(256,256);
        onesIndices = randi([0 256*256],1,n);
        matrix(onesIndices) = 1;
        

        这种方法的一个问题是randi 可以生成重复值,但是对于这个示例,矩阵的大小很大并且矩阵的数量很少,这不太可能。您可以测试是否是这种情况并“重新滚动:”所以如果sum(sum(matrix)) 小于n,您就知道您有一个重复值。

        编辑:更好的方法是使用randperm 而不是randi,并且只使用第一个n 元素。这应该可以防止重复并不得不重新滚动。

        【讨论】:

        • 你的意思是小n(w.r.t. 矩阵的大小)这不太可能。一般来说,重复值很有可能。要生成 50% 的,您将使用此方法重新滚动许多。
        • 嗯,我的意思是如果矩阵的大小与所需的数量相比很大。我会更新的,谢谢。
        • 谢谢大家的回答。 Cris Luengo 你的逻辑完美无缺。
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2019-06-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多