我正在尝试高效地在零矩阵中生成随机分散但数量有限的1。
假设我有一个10x10的零矩阵(zeros(10)
),我想随机放置10个1,所以它看起来像:
0 0 0 0 0 0 0 0 0 1
0 0 0 0 0 1 0 0 0 0
0 0 1 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 1 0
1 0 0 0 0 1 0 0 0 0
0 0 0 0 0 0 0 0 0 0
0 0 0 1 0 0 0 0 0 0
0 1 0 0 0 0 0 1 0 0
0 0 0 0 1 0 0 0 0 0
0 0 1 0 0 0 0 0 0 0
如何在没有for循环的情况下并且不手动插入每个位置的情况下执行此操作(此示例比我的实际问题小得多)?
到目前为止,我的代码:
% Generate zeros
M = zeros(10)
% Generate random indices
Rands = [randsample(10, 10) randsample(10, 10)]
第一列应作为行索引,第二列应作为列索引。
现在,我显然不能像这样将这些索引放入M
的行和列索引中:
M(Rands(:,1), Rands(:,2)) = 1
如何对这些随机索引的变化进行评估?
答案 0 :(得分:5)
您可以使用randperm
随机生成要用1
填充的线性索引:
sz = [10 10]; % desired size
n = 10; % desired number of ones
M = zeros(sz);
M(randperm(prod(sz), n)) = 1;
或者,您可以在一行中使用randperm
和reshape
:
M = reshape(randperm(prod(sz))<=n, sz);
答案 1 :(得分:4)
您可以使用sub2ind
将下标转换为线性索引:
M(sub2ind(size(M),Rands(:,1),Rands(:,2)))=1