这是矩阵的样子:
有8列,比如100行,任意行中的随机数总和为1。
.125 .125 .125 .125 ........ 125
.005 .105 .005 .205 ........ 205
.002 .003 .012。 201 ........200
...
Matlab能否自动创建这种矩阵,即right stochastic matrix?我正在寻找一个脚本。
答案 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发布的方法进行了比较,我将其用于分发。
所以我看起来更具指数性,你得到一些更高的价值,而且他更均匀一点,但你得到的随机数的截止值更低。
答案 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.如果这样做不符合您的要求,您将需要自己解释一下。