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

Add programmatically random values to a matrix using matlab

我是 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, :)

首先像您所做的那样生成一个运行dom 浮点矩阵和阈值。一旦你设定了这个阈值,只需对每列求和,然后将每列除以总和。广播在这里很有用,这样您就不必循环遍历或复制所有行上每列的求和值。

像这样的东西应该可以工作:

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,然后创建一个 n x n 方阵 运行dom 0s 和 1s。第三行计算每一列的总和,第四行是 pièce de resistance 计算每一列的总和并进行内部复制,这样你就可以创建一个临时矩阵与 运行dom 矩阵大小相同,但每个 列包含该列 的总和。然后你明智地划分元素并产生你的结果。这是通过 bsxfun 函数实现的。最后一行代码非常重要。假设您有一列没有 1。这意味着当需要规范化时,我们将遇到 0 / 0 错误,t运行 变为 NaN。最后一行代码找到任何 NaN 的值并将它们设置为 0.

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

示例运行

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

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

所有零列呢?

为确保代码适用于所有零列,只需在创建 运行dom 矩阵时提高阈值即可。让它更高,比如 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