用随机数替换非零值

时间:2013-12-28 19:55:16

标签: matlab matrix

我在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值而不是上面矩阵的索引。例如,所需的新兰特矩阵应为:

[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

4 个答案:

答案 0 :(得分:4)

您可以按照以下方式执行此操作:

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 - 函数,根据需要进行调整)

答案 1 :(得分:4)

您可以根据需要生成尽可能多的随机数,从而略微提高thewaywewalk's answer。作为奖励,这种方法允许在一行中完成所有事情:

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

答案 2 :(得分: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. 

答案 3 :(得分:0)

如果' 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. 替换所有&#39; NaN&#39;随机数。

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