我在matlab遇到了问题。如何选择一个号码' i'有概率'我'在矩阵中。 我想在矩阵中这样做,我选择一个数字' i'从每一行开始,概率为' i'
感谢任何帮助
样本矩阵(不需要选择零):
w1= .47;
w2= .023;
m1= .06;
m2= .037;
x=rand(1,m1)<=m1;
tolerance= 0.01;
Transition=[m1 w1 0 w1 0 0 0;
0 m1 w1 0 0 0 0;
0 0 m1 w1 0 0 0;
0 0 0 m2 w2 0 0;
0 0 0 0 m2 w1 w1;
0 0 0 0 0 m1 w1
0 0 0 0 0 0 m1];
答案 0 :(得分:1)
让我们从一个提示开始。
假设您只有一个数字0.06
并且您想要一个向量(=矩阵中的一行),这个数字是分散的,因此有0.06
概率来挑选它。一个简单的解决方案是从100个零v=zeros(100,1)
的向量开始,然后在6个随机位置放置数字0.06
,即
ind=randi(100,1,6);
v(ind)=0.06;
您能想到一种方法将其扩展到每行多个数字吗?
答案 1 :(得分:1)
首先,我们可以计算累积概率矩阵Tc
,以便为找到第一列超过0到1之间的随机值的策略做准备。
Tc = zeros(size(T));
Tc(:, 1) = T(:, 1);
for k = 2 : size(T, 2)
Tc(:, k) = Tc(:, k - 1) + T(:, k);
end
现在要从每一行中抽取数字,我们首先绘制p = rand(size(T, 2), 1)
,然后找到p
落入累积概率桶的列:
for k = 1 : size(T, 1)
col = find(T(k, :) > p(k), 1, 'first');
if isempty(col)
fprintf('nothing drawn for row %d\n', k);
else
fprintf('row %d, col %d, p = %f\n', k, col, T(k, col));
end
end
这是有效的,因为顺序并不重要。例如,对于某些p = 0.2,某些任意累积分布可能会从0.65增加到0.85。 rand
在此区间内产生值的概率确实为0.2。如果这是T
的最后一个非零条目,rand
将返回一个概率为0.15的值,其中不会绘制任何数字。在另一个示例中,如果T
中的所有条目都为零,则累积分布将永远不会超过rand
可以绘制的分布。对于最后一个例子,如果有两个条目,每个条目0.5,那么累积分布将超过rand
一半和一半所绘制的条目。