【问题标题】:replace non-zero values with random numbers用随机数替换非零值
【发布时间】:2015-12-03 15:26:25
【问题描述】:

我在 MATLAB 中有一个零一矩阵,如下所示:

[0 0 0 1 1 1
 0 1 1 0 0 0
 1 0 0 0 0 1
 1 1 1 0 0 0
 0 0 0 1 0 1]

我想通过1 定义另一个包含 rand 值的矩阵,而不是上述矩阵的索引。例如,所需的新 rand 矩阵应该是:

[0 0 0 0.2 0.2 0.1
 0 0.6 0.7 0 0 0
 0.4 0 0 0 0 0.6
 0.7 0.8 0.5 0 0 0
 0 0 0 0.3 0 0.4]

我使用two nested loop for 从第一个矩阵中查找非零值,并将 rand 值替换为新矩阵中的值。

matlab有什么功能可以自动做,不用two nested loop for

【问题讨论】:

  • 你可以只乘矩阵,没有任何循环。
  • @Adiel - 实际上是正确的。但它需要一个零一矩阵,如问题中所述。问题标题表示非零值,这需要先转换为逻辑值。这并不完全清楚。但是对于第一种情况,您的方法要快一些。
  • 其实你是对的,但我只拿了问题中的案例,没有注意到标题的差异。但是,他说那是他拥有的矩阵...... :)

标签: matlab matrix


【解决方案1】:

你可以这样做:

A = ...
[0 0 0 1 1 1;
 0 1 1 0 0 0;
 1 0 0 0 0 1;
 1 1 1 0 0 0;
 0 0 0 1 0 1];

B = rand(size(A));
A(logical(A)) = B(logical(A));

A =

         0         0         0    0.1320    0.2348    0.1690
         0    0.3377    0.3897         0         0         0
    0.9027         0         0         0         0    0.7317
    0.9448    0.3692    0.4039         0         0         0
         0         0         0    0.0598         0    0.4509

(我只是拿了基本的rand-function,根据需要调整)

【讨论】:

    【解决方案2】:

    您可以通过仅生成所需数量的随机数来稍微改进thewaywewalk's answer。作为奖励,这种方法允许在一行中完成所有操作:

    A(logical(A)) = rand(1,nnz(A));
    

    【讨论】:

      【解决方案3】:

      如果您尝试用随机数替换矩阵 A 中的那些,那么您根本不需要任何循环。

      这是一种方法。

      a = double(rand(5,5)>.5); % Your binary matrix should be type double.
      n = sum(a(:));            % Count the 1's.
      a(a>0) = rand(1,n);       % Replace the ones with rands. 
      

      【讨论】:

      • 您可以使用nnz(a) 计算非零值,然后使用logical(a) 而不是a>0。应该增加大问题的计算效率。
      • 这通常是一种更有效的解决方案,因为它只需要生成所需的随机值的数量。
      • @OlegKomarov,很好,不知道 nnz 函数。谢谢。
      【解决方案4】:

      如果'l'是一个包含零和非零的矩阵。考虑下面回答这个问题的场景:

      1. 用随机数替换矩阵中的所有零:

        l(l==0) = randn(1,size(l(l==0),1)); 
        
      2. 用随机数替换所有正值:

        l(l>0) = randn(1,size(l(l>0),1));
        
      3. 用随机数替换所有负值:

        l(l<0) = randn(1,size(l(l<0),1));
        
      4. 用随机数替换所有“NaN”。

        l(isnan(l)) = randn(1,size(l(isnan(l)),1));
        

      【讨论】:

      • 这些解决方案都不会真正替换矩阵中的所有非零值(对于任何矩阵),正如问题中所要求的那样。
      • 点 2、3 和 4 将用不同的随机数替换矩阵(对于任何矩阵)中的所有非零值。如果你想用特定的数字替换它们,那么你可以使用运算符 l(l
      • 首先,第1点与问题无关。事实上,它与所要求的完全相反。二、当l(l~=0) = randn(1,size(l(l~=0),1));足够时,为什么要2、3、4呢?这个问题已经有了很多令人满意的答案,我很遗憾地说这个问题并没有提供太多附加值。
      • 你的观点是正确的,但在我的回答中,我试图解释其他场景,比如在矩阵中分别替换正/负/零。当然,我们可以和操作员一起玩,以不同的方式做不同的事情。
      猜你喜欢
      • 1970-01-01
      • 2019-04-19
      • 2018-01-05
      • 2015-08-24
      • 2019-04-05
      • 2018-04-03
      • 2016-01-20
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多