如何在Matlab中从矩阵中随机选择x个索引

时间:2019-04-30 10:00:06

标签: matlab matrix random indices

我正在尝试高效地在零矩阵中生成随机分散但数量有限的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

如何对这些随机索引的变化进行评估?

2 个答案:

答案 0 :(得分:5)

您可以使用randperm随机生成要用1填充的线性索引:

sz = [10 10]; % desired size
n = 10; % desired number of ones
M = zeros(sz);
M(randperm(prod(sz), n)) = 1;

或者,您可以在一行中使用randpermreshape

M = reshape(randperm(prod(sz))<=n, sz);

答案 1 :(得分:4)

您可以使用sub2ind将下标转换为线性索引:

M(sub2ind(size(M),Rands(:,1),Rands(:,2)))=1