使用matlab以编程方式将随机值添加到矩阵中

使用matlab以编程方式将随机值添加到矩阵中,matlab,matrix,sparse-matrix,programmatically-created,stochastic,Matlab,Matrix,Sparse Matrix,Programmatically Created,Stochastic,我是Matlab新手,我正试图通过编程创建一个方阵,它可能有一些随机列,但我不能想出一个有效的解决方案。所谓随机列,我指的是正列元素的和应该等于1(非零列元素应该相同,它们的和应该等于1)。非零元素在矩阵中的位置并不重要。PS:有些列可能全部为零元素,有些列可能只有一个非零元素,在本例中为1 我需要你的指导或者一个关于这个家伙的工作代码的例子。提前谢谢 以下是一个例子: A= 0.2500 0.5000 0 0 0 0

我是Matlab新手,我正试图通过编程创建一个方阵,它可能有一些随机列,但我不能想出一个有效的解决方案。所谓随机列,我指的是正列元素的和应该等于1(非零列元素应该相同,它们的和应该等于1)。非零元素在矩阵中的位置并不重要。PS:有些列可能全部为零元素,有些列可能只有一个非零元素,在本例中为1

我需要你的指导或者一个关于这个家伙的工作代码的例子。提前谢谢

以下是一个例子:

A=
0.2500    0.5000         0         0         0         0         0
0.2500    0.5000    0.3333         0         0         0         0
     0         0    0.3333    0.2500         0         0    0.3333
0.2500         0         0    0.2500         0    0.5000         0
0.2500         0         0    0.2500         0         0         0
     0         0         0    0.2500         0    0.5000    0.3333
     0         0    0.3333         0         0         0    0.3333

% here is my code but it's not doing the work yet
n = 5;
A = zeros(n, 5); 
i = 0;
for i = 1:n
  if rand < 0.5
    i = i + 1;
    A(i, :) = rand(1, 5);
  end
end
A = A(1:i, :)
A=
0.2500    0.5000         0         0         0         0         0
0.2500    0.5000    0.3333         0         0         0         0
0         0    0.3333    0.2500         0         0    0.3333
0.2500         0         0    0.2500         0    0.5000         0
0.2500         0         0    0.2500         0         0         0
0         0         0    0.2500         0    0.5000    0.3333
0         0    0.3333         0         0         0    0.3333
%这是我的代码,但它还没有完成工作
n=5;
A=零(n,5);
i=0;
对于i=1:n
如果rand<0.5
i=i+1;
A(i,:)=兰特(1,5);
结束
结束
A=A(1:i,:)

首先生成一个随机浮点矩阵和阈值,就像您所做的那样。一旦设置了阈值,只需沿每列求和,然后将每列除以和。广播在这里很有用,这样可以避免在所有行上循环或复制每列的总和值

像这样的方法应该会奏效:

n = 7;
A = rand(n, n) >= 0.5;
sumA = sum(A, 1);
A = bsxfun(@rdivide, A, sumA);

% Or in MATLAB R2016b and up:
% A = A ./ sumA;

A(isnan(A)) = 0;
前两行是不言自明的。选择
n
,然后创建随机0和1的
nxn
方阵。第三行查找每列的总和,第四行即pièce de resistance获取每列的总和并进行内部复制,以便创建与随机矩阵大小相同的临时矩阵,但每列包含该列的总和。然后按元素进行划分,从而生成结果。这是通过函数实现的。最后一行代码非常重要。假设你有一列没有1。这意味着当需要进行规范化时,我们将遇到一个0/0错误,该错误转化为
NaN
。最后一行代码查找
NaN
的任何值,并将其设置为0

或者,在MatlabR2016B和更高版本中,您可以简单地执行按元素的除法运算符
/
,它已经完成了广播

示例运行 运行上述代码后,这是一个潜在的结果:

>> A

A =

    0.2500    0.5000         0    0.2500         0         0         0
         0         0    0.2500    0.2500    1.0000         0         0
         0         0         0    0.2500         0    0.2500    0.3333
    0.2500         0         0    0.2500         0    0.2500         0
    0.2500    0.5000    0.2500         0         0    0.2500         0
         0         0    0.2500         0         0    0.2500    0.3333
    0.2500         0    0.2500         0         0         0    0.3333
那么所有的零列呢? 为了确保代码适用于所有零列,只需在创建随机矩阵时使阈值更具攻击性。使其更高,例如0.8左右。这意味着你得到0的几率比得到1的几率更高

因此,我将第二行代码更改为:

 A = rand(n, n) >= 0.8;
当我这样做并再次运行代码时,这是我一次运行得到的结果:

>> A
A =

         0         0         0    0.2500         0    0.5000         0
         0    0.5000    1.0000    0.2500         0    0.5000         0
         0         0         0         0    1.0000         0    1.0000
         0    0.5000         0         0         0         0         0
         0         0         0         0         0         0         0
         0         0         0    0.2500         0         0         0
         0         0         0    0.2500         0         0         0

首先生成一个随机浮点矩阵和阈值,就像您所做的那样。一旦设置了阈值,只需沿每列求和,然后将每列除以和。广播在这里很有用,这样可以避免在所有行上循环或复制每列的总和值

像这样的方法应该会奏效:

n = 7;
A = rand(n, n) >= 0.5;
sumA = sum(A, 1);
A = bsxfun(@rdivide, A, sumA);

% Or in MATLAB R2016b and up:
% A = A ./ sumA;

A(isnan(A)) = 0;
前两行是不言自明的。选择
n
,然后创建随机0和1的
nxn
方阵。第三行查找每列的总和,第四行即pièce de resistance获取每列的总和并进行内部复制,以便创建与随机矩阵大小相同的临时矩阵,但每列包含该列的总和。然后按元素进行划分,从而生成结果。这是通过函数实现的。最后一行代码非常重要。假设你有一列没有1。这意味着当需要进行规范化时,我们将遇到一个0/0错误,该错误转化为
NaN
。最后一行代码查找
NaN
的任何值,并将其设置为0

或者,在MatlabR2016B和更高版本中,您可以简单地执行按元素的除法运算符
/
,它已经完成了广播

示例运行 运行上述代码后,这是一个潜在的结果:

>> A

A =

    0.2500    0.5000         0    0.2500         0         0         0
         0         0    0.2500    0.2500    1.0000         0         0
         0         0         0    0.2500         0    0.2500    0.3333
    0.2500         0         0    0.2500         0    0.2500         0
    0.2500    0.5000    0.2500         0         0    0.2500         0
         0         0    0.2500         0         0    0.2500    0.3333
    0.2500         0    0.2500         0         0         0    0.3333
那么所有的零列呢? 为了确保代码适用于所有零列,只需在创建随机矩阵时使阈值更具攻击性。使其更高,例如0.8左右。这意味着你得到0的几率比得到1的几率更高

因此,我将第二行代码更改为:

 A = rand(n, n) >= 0.8;
当我这样做并再次运行代码时,这是我一次运行得到的结果:

>> A
A =

         0         0         0    0.2500         0    0.5000         0
         0    0.5000    1.0000    0.2500         0    0.5000         0
         0         0         0         0    1.0000         0    1.0000
         0    0.5000         0         0         0         0         0
         0         0         0         0         0         0         0
         0         0         0    0.2500         0         0         0
         0         0         0    0.2500         0         0         0

谢谢@rayryeng的回答和解释,非常清楚。我试过了,效果很好。我做了很多运行测试,如果创建的一些列可能都有零元素,那就太好了。您认为您帮助我编写的上述代码是否已对此作出响应?@Stackgeek是的,该代码应适用于所有零列。我所能做的是使阈值更具攻击性,以便您可以看到它对所有零列都有效。我会修改我的答案。好的,我明白了,这对我来说更清楚了。再次感谢@rayryeng你太棒了。@Stackgeek Pas de problème:)谢谢@rayryeng的回答和解释,非常清楚。我试过了,效果很好。我做了很多运行测试,如果创建的一些列可能都有零元素,那就太好了。你认为你帮过我的上面的代码有回应吗?@Stackgeek是的,这些代码应该适用于所有零co