【发布时间】:2018-08-07 03:00:50
【问题描述】:
我正在使用 Matlab 函数 round(rand(256)) 创建一个大小为 256x256 且随机分布 0 和 1 的方阵。
我特别想做的是,我想以某种方式指定 rand()(或任何其他相关函数)随机生成并分布在整个矩阵中的 1 的数量
【问题讨论】:
我正在使用 Matlab 函数 round(rand(256)) 创建一个大小为 256x256 且随机分布 0 和 1 的方阵。
我特别想做的是,我想以某种方式指定 rand()(或任何其他相关函数)随机生成并分布在整个矩阵中的 1 的数量
【问题讨论】:
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 或 0 的已排序向量中的索引。例如,假设我们想要 50 个 1:
matrix = rand(256,256);
vec = sort(reshape(matrix,[],1));
thresh = vec(50);
matrix(matrix <= thresh) = 1;
matrix(matrix > thresh) = 0;
【讨论】:
您可以使用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% 的,您将使用此方法重新滚动许多。