2012-08-15 40 views
2

设C是一个40×40矩阵,在对角的零。我如何随机用零替换矩阵中10%的元素?如何随机地替换为矩阵元素的10%到零

+0

正好是10%或10大概%? – 2012-08-15 19:45:40

+0

@HighPerformanceMark准确地说是10%。我只能使它小于或等于,我想它完全是10%。 – SJL 2012-08-15 19:53:53

回答

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) 

我想你可以计算这些了,如果没有发表评论。

+0

非常感谢!我明白了你的想法,但我忽略了矩阵中对角线条目为零的观点。因此,它会在每次运行中生成不同数量的零条目。 – SJL 2012-08-15 20:33:48

4

相反@HighPerformanceMark的面具*阵法,我只想指数矩阵本身:

data=rand(10); 

N = numel(data); 
data(randperm(N,floor(N/10))) = 0; 
2

我认为最快的方法是与标量分配组合使用逻辑索引:

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

但是当你指定了不会给你确切地%。

的精确解决方案是

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

其等同于randperm而不randperm()在Matlab R2010的开销和更早版本。

+0

它不是那么快,你还是要产生'nC'随机数,排序的(所有的),然后用'NC/10'比较得到最终的逻辑。 'randperm'本身约快4-10倍... – 2012-08-17 16:15:30

+0

@ GuntherStruyf在matlab命令提示符处键入'edit randperm'。这是完全相同的代码。 – 2012-08-17 16:36:45

+0

已经做了,在R2011b,randperm是内置的(可能这就是为什么它的速度更快) – 2012-08-17 16:38:46