使用 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
我是 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