如何从 Matlab 中的矩阵中随机 select x 个索引

How to randomly select x number of indices from a matrix in Matlab

我正在尝试在零矩阵中有效地生成随机分散但数量有限的 1。

假设我有一个 10x10 的零矩阵 (zeros(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

我怎样才能对这些随机索引的变化进行向量化处理?

你可以使用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);

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

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