如何创建一个随机矩阵,使所有行总和为 1

Posted

技术标签:

【中文标题】如何创建一个随机矩阵,使所有行总和为 1【英文标题】:How to create a random matrix such that all rows sum to 1 【发布时间】:2012-02-16 14:17:36 【问题描述】:

这是矩阵的样子:

有 8 列,说 100 行,任何行中的随机数总和为 1。

.125 .125 .125 .125 ....... .125

.005 .105 .005 .205 ....... .205

.002 .003 .012。 201 ....... .200

...

Matlab 能否自动创建这种矩阵,即right stochastic matrix?我正在寻找一个脚本。

【问题讨论】:

【参考方案1】:

使用bsxfun 而不是repmat

mat = rand(100, 8);
rowsum = sum(mat,2);
mat = bsxfun(@rdivide, mat, rowsum);

【讨论】:

【参考方案2】:

这是另一个想法:对于每一行,您可以生成 7 个随机数(介于 0 和 1 之间)并将它们视为您的“间隔”位置 - 换句话说,在您的 8 个随机数总和为 1 中,这些是您的部分总和。然后您可以对它们进行排序并获取差异以获得生成的随机数。这是我的想法的代码:

numrows = 100;
partialsums = [zeros(numrows,1), rand(numrows,7), ones(numrows,1)];
partialsums = sort(partialsums, 2);
randmat = diff(partialsums, 1, 2);

根据您的操作方式,数字的分布会有所不同。我将此方法与 Aabaz 发布的方法进行了比较,我得到了这个用于分发。

所以我的看起来更指数化,你得到一些更高的值,而他的更均匀一些,但你得到的随机数的截止值更低。

【讨论】:

+1 指出有不同的方式导致不同的分布。【参考方案3】:

您可以先创建随机矩阵,然后对其进行归一化,以使每一行的总和等于 1(如果这是您的意思):

mat=rand(100,8);
matnorm=repmat(sum(mat,2),1,8);
mat=mat./matnorm;

【讨论】:

【参考方案4】:

第 1 步:计算向量的范数,即该向量中元素的平方和的平方根。

第 2 步:将向量中的每个元素除以向量的范数。

第 3 步:将得到的向量乘以其转置来平方向量中的每个元素。

然后您可以看到向量中(最终)结果元素的总和为 1。

【讨论】:

【参考方案5】:

rand(100,8)

将生成一个包含 100 行和 8 列的随机数矩阵,其所有条目都可以加到 1。如果这不符合您的要求,您将不得不再解释一下。

【讨论】:

-1 这会创建一个随机数矩阵,每个随机数分布在 0 和 1 之间。行的总和不等于 1,这是提问者所要求的。

以上是关于如何创建一个随机矩阵,使所有行总和为 1的主要内容,如果未能解决你的问题,请参考以下文章

得到N个总和为M的随机数

excel表格中如何使随机数相加成一个固定值?

给定一个数字列表,找到所有矩阵,使得每列和每行总和为 264

如何通过C中的行总和对矩阵进行排序

对 data.frame 或矩阵中的行求和

Matlab之线性代数