2012-08-15 135 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