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
正確に 10% の要素が 0 に置き換えられた場合、次のようなもので満足できるかもしれません:
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;
これは、MatlabR2010以前randperm
のオーバーヘッドなしと同じです。randperm()
于 2012-08-16T11:33:10.580 に答える