Matlab:在matlab中用概率'i'选择一个数字'i'

时间:2013-02-08 05:37:03

标签: matlab probability

我在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];

2 个答案:

答案 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一半和一半所绘制的条目。