我正在使用Matlab函数round(rand(256))创建大小为256x256,随机分布为0和1s的方阵。
我特别想做的是,我想以某种方式指定rand()(或与此相关的任何其他相关函数)生成的1的个数,以随机生成并分布在整个矩阵中
答案 0 :(得分:3)
Magdrop’s answer是最简单的方法,它计算随机值的百分位数以确定阈值。
另外两个选项涉及randperm
:
将所有索引随机排列到矩阵中,然后阈值:
sz = [256,256]; % matrix size
n = 256; % number of zeros
M = randperm(prod(sz)) <= n;
M = reshape(M,sz);
随机置换索引,然后选择n
作为索引的位置:
indx = randperm(prod(sz),n);
M = zeros(sz);
M(indx) = 1;
答案 1 :(得分:1)
您也可以按通常方式生成随机值,但是在对它们进行四舍五入之前,请将它们作为向量进行排序。 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;
答案 2 :(得分:0)
您可以使用randi
函数来确定将其插入的位置,然后将其放入矩阵中。例如n
个:
matrix = zeros(256,256);
onesIndices = randi([0 256*256],1,n);
matrix(onesIndices) = 1;
此方法的一个问题是randi
可以生成重复值,尽管在此示例中,矩阵的大小很大而1的个数很低,这几乎是不可能的。您可以测试是否是这种情况,然后“重新滚动:”,因此如果sum(sum(matrix))
小于n
,您就知道您有重复值。
编辑:一种更好的方法是使用randperm
而不是randi
并仅使用前n
个元素。这样可以避免重复和重新滚动。