令 C 是一个 40x40 矩阵,对角线为零。如何用零随机替换矩阵中 10% 的元素?
问问题
2273 次
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 回答