【问题标题】:How to replace non-zero elements randomly with zero?如何用零随机替换非零元素?
【发布时间】:2013-08-16 16:26:08
【问题描述】:

我有一个包含10 元素的矩阵,如下所示,用作网络邻接矩阵。

A =

    0     1     1     1
    1     1     0     1
    1     1     0     1
    1     1     1     0

我想模拟对网络的攻击,所以我必须用0 随机替换某些特定百分比的1 元素。如何在 MATLAB 中做到这一点?

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

【问题讨论】:

  • 您是否希望一个元素被替换为percentage/100 的概率与另一个元素是否被替换无关。还是要随机替换percentage1 个元素?
  • @horchler 嘿,这很好

标签: matlab


【解决方案1】:

如果你想以一定的概率改变每个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

如果您想随机更改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;

请注意,在这种情况下,结果分数可能与预期的不同,因为需要四舍五入到整数个条目。

【讨论】:

    【解决方案2】:

    @horchler 的观点很好。但是,如果我们保持简单,那么您可以将输入矩阵与掩码矩阵相乘。

    >> a1=randint(5,5,[0 1]) #before replacing 1->0
    
    a1 =
    
         1     1     1     0     1
         0     1     1     1     0
         0     1     0     0     1
         0     0     1     0     1
         1     0     1     0     1
    
    >> a2=random('unif',0,1,5,5) #Assuming frequency distribution is uniform ('unif')
    
    a2 =
    
        0.7889    0.3200    0.2679    0.8392    0.6299
        0.4387    0.9601    0.4399    0.6288    0.3705
        0.4983    0.7266    0.9334    0.1338    0.5751
        0.2140    0.4120    0.6833    0.2071    0.4514
        0.6435    0.7446    0.2126    0.6072    0.0439
    
    >> a1.*(a2>0.1) #And the replacement prob. is 0.1
    
    ans =
    
         1     1     1     0     1
         0     1     1     1     0
         0     1     0     0     1
         0     0     1     0     1
         1     0     1     0     0
    

    还有其他技巧可以添加到掩码矩阵(a2)中。比如不同的频率。分布或结构(例如,一旦一个单元格被替换,相邻的单元格就不太可能被替换等等。) 干杯。

    【讨论】:

      【解决方案3】:

      函数 find 是你的朋友:

      indices = find(A);
      

      这将返回矩阵 A 中 1 个元素的索引数组,您可以使用您的方法在该数组的子集上用零替换元素的百分比。那么,

      A(subsetIndices) = 0;
      

      将 A 的剩余索引替换为零。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2014-05-05
        • 2022-07-11
        • 1970-01-01
        • 2019-04-19
        • 2015-02-09
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多