如何用零随机替换非零元素?

Sab*_*aba 2 matlab

我有一个矩阵包括10下面的元素,用作网络邻接矩阵.

A =

    0     1     1     1
    1     1     0     1
    1     1     0     1
    1     1     1     0
Run Code Online (Sandbox Code Playgroud)

我想模拟对网络的攻击,所以我必须1随机替换一些特定百分比的元素0.我怎样才能在MATLAB中做到这一点?

我知道如何用零随机替换一定百分比的元素,但我必须确保随机替换的1元素是矩阵元素之一而不是零.

Lui*_*ndo 5

如果您想以1一定的概率更改每个:

p = 0.1%; % desired probability of change

A_ones = find(A); % linear index of ones in A
A_ones_change = A_ones(rand(size(A_ones))<=p); % entries to be changed
A(A_ones_change) = 0; % apply changes in those entries
Run Code Online (Sandbox Code Playgroud)

如果您想随机更改条目的固定部分1:

f = 0.1; % desired fraction

A_ones = find(A);
n = round(f*length(A_ones));
A_ones_change = randsample(A_ones,n);
A(A_ones_change) = 0;
Run Code Online (Sandbox Code Playgroud)

注意,在这种情况下,得到的分数可能与预期的不同,因为需要舍入到整数个条目.