设C为40x40矩阵,对角线为零。如何用零随机替换矩阵中10%的元素?
答案 0 :(得分:4)
我只是索引矩阵本身而不是@HighPerformanceMark的掩码*矩阵方法:
data=rand(10);
N = numel(data);
data(randperm(N,floor(N/10))) = 0;
答案 1 :(得分:3)
正好10%的元素被0替换为这样的东西可能会让你满意:
mask = [ones(1,1440),zeros(1,160)];
mask = reshape(mask(randperm(1600)),[40,40]);
c.*mask
如果可能接受10%,请尝试
c.*(randi(10,40)<=9)
我猜你可以解决这些问题,如果不是评论。
答案 2 :(得分:2)
我认为最快的方法是将逻辑索引与标量赋值结合使用:
C(rand(size(C)) < 0.1) = 0;
但是这并不会像你指定的那样给你完全 10%。
确切的解决方案是
nC = numel(C);
[~, p] = sort(rand(1, nC));
C(p <= nC/10) = 0;
与randperm
相同,没有Matlab R2010及更早版本中randperm()
的开销。