【发布时间】: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?我正在寻找一个脚本。
【问题讨论】:
这是矩阵的样子:
有 8 列,说 100 行,任何行中的随机数总和为 1。
.125 .125 .125 .125 ....... .125
.005 .105 .005 .205 ....... .205
.002 .003 .012。 201 ....... .200
...
Matlab 能否自动创建这种矩阵,即right stochastic matrix?我正在寻找一个脚本。
【问题讨论】:
使用bsxfun 而不是repmat:
mat = rand(100, 8);
rowsum = sum(mat,2);
mat = bsxfun(@rdivide, mat, rowsum);
【讨论】:
这是另一个想法:对于每一行,您可以生成 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(如果这是您的意思):
mat=rand(100,8);
matnorm=repmat(sum(mat,2),1,8);
mat=mat./matnorm;
【讨论】:
第 1 步:计算向量的范数,即该向量中元素的平方和的平方根。
第 2 步:将向量中的每个元素除以向量的范数。
第 3 步:将得到的向量乘以其转置来平方向量中的每个元素。
然后您可以看到向量中(最终)结果元素的总和为 1。
【讨论】:
嗯
rand(100,8)
将生成一个包含 100 行和 8 列的随机数矩阵,其所有条目都可以加到 1。如果这不符合您的要求,您将不得不再解释一下。
【讨论】: