2

C を対角にゼロがある 40x40 の行列とします。行列の要素の 10% をランダムにゼロに置き換えるにはどうすればよいですか?

4

3 に答える 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 に答える