2

令 C 是一个 40x40 矩阵,对角线为零。如何用零随机替换矩阵中 10% 的元素?

4

3 回答 3

4

而不是 @HighPerformanceMark 的 mask*matrix 方法,我会简单地索引矩阵本身:

data=rand(10);

N = numel(data);
data(randperm(N,floor(N/10))) = 0;
于 2012-08-15T20:25:01.647 回答
3

对于被 0 替换的恰好 10% 的元素,这样的事情可能会让您满意:

mask = [ones(1,1440),zeros(1,160)];
mask = reshape(mask(randperm(1600)),[40,40]);
c.*mask

如果可能 10% 是可以接受的,请尝试

c.*(randi(10,40)<=9)

如果不发表评论,我想您可以弄清楚这些。

于 2012-08-15T20:01:45.357 回答
2

我认为最快的方法是结合使用逻辑索引和标量赋值:

C(rand(size(C)) < 0.1) = 0;

但这不会像您指定的那样给您精确的10%。

一个精确的解决方案是

nC = numel(C);
[~, p] = sort(rand(1, nC));
C(p <= nC/10) = 0;

这与没有Matlab R2010 及更早版本中randperm的开销相同。randperm()

于 2012-08-16T11:33:10.580 回答