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

问题描述 投票:0回答:1

我是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, :)
matlab matrix sparse-matrix programmatically-created stochastic
1个回答
3
投票

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

这样的事情应该有效:

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的n x n方阵。第三行找到每列的总和,第四行是piècederesistance,它取每列的总和并进行内部复制,以便创建一个与随机矩阵大小相同的临时矩阵,但是每列包含该列的总和。然后你将元素分开并产生结果。这是通过bsxfun函数实现的。最后一行代码非常重要。假设您有一个没有1的列。这意味着当标准化时,我们将遇到0/0错误,转换为NaN。最后一行代码找到任何NaN值并将它们设置为0。

或者在MATLAB R2016b及更高版本中,您可以简单地执行元素分割运算符./并且它已经进行了广播。

Example Run

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

>> 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

What about all zero columns?

要确保代码适用于所有零列,只需在创建更具侵略性的随机矩阵时设置阈值。让它更高,像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
© www.soinside.com 2019 - 2024. All rights reserved.