我在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
?
答案 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'是一个包含零和非零的矩阵。考虑以下场景回答这个问题:
用随机数替换矩阵中的所有零:
l(l==0) = randn(1,size(l(l==0),1));
用随机数替换所有正值:
l(l>0) = randn(1,size(l(l>0),1));
用随机数替换所有负值:
l(l<0) = randn(1,size(l(l<0),1));
替换所有&#39; NaN&#39;随机数。
l(isnan(l)) = randn(1,size(l(isnan(l)),1));