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

时间:2012-02-16 14:17:37

标签: matlab matrix

这是矩阵的样子:

有8列,比如100行,任意行中的随机数总和为1。

  

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

     

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

     

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

     

...

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

5 个答案:

答案 0 :(得分:10)

使用bsxfun而不是repmat

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

答案 1 :(得分:6)

这是另一个想法:对于每一行,你可以生成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发布的方法进行了比较,我将其用于分发。

enter image description here

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

答案 2 :(得分:4)

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

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

答案 3 :(得分:1)

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

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

步骤3:将得到的矢量乘以其转置,以对矢量中的每个元素进行平方。

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

答案 4 :(得分:-2)

rand(100,8)

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