找出矩阵

时间:2016-03-26 22:23:04

标签: matlab matrix probability montecarlo

我使用蒙特卡罗方法为我的随机变量生成N场景。我将这些场景存储在M x N矩阵中。我想计算矩阵中每个场景(列)的概率。

我尝试使用命令histc(),但它不起作用。如何找到这些概率并将它们存储在向量中以便将其用于优化问题?

1 个答案:

答案 0 :(得分:0)

您可以在此“场景”矩阵的转置上使用unique并检查函数调用的第三个输出。第三个输出为矩阵中看到的每个可能的唯一事件分配唯一ID。您还需要指定'rows'标志,以将整个行视为单个实例。如果未指定'rows',则矩阵中的每个单独元素将被视为单个实例,您希望整个列(或转置矩阵的行)成为单个实例。此外,我们无法使用unique的列进行操作,这就是您需要转置矩阵的原因。

您还需要第一个输出来检查每个ID如何映射到每个唯一的事件。确保在末尾转置此输出变量以使输出映射到列。然后,您可以使用histchistcounts来确定每个“场景”的发生,从而找出假设等概率情况的概率。

这是一个简单的例子。假设我将这个事件矩阵存储在A

>> A = [0 0 0; 1 1 1; 1 0 0; 0 0 1; 0 0 0; 0 0 1; 1 1 1].'

A =

     0     1     1     0     0     0     1
     0     1     0     0     0     0     1
     0     1     0     1     0     1     1

我们看到场景的维度为3,而有7个事件。用unique做我说的话:

>> [un, ~, id] = unique(A.', 'rows'); %'
>> un = un.' %'

un =

     0     0     1     1
     0     0     0     1
     0     1     0     1

>> id

id =

     1
     4
     3
     2
     1
     2
     4

我们可以看到列[0; 0; 0]属于ID 1,列[0; 0; 1]映射到ID 2,列[1; 0; 0]映射到ID 3,最后[1; 1; 1]映射到ID 4. un存储所有唯一列,id为我们提供此映射。您可以验证,如果您查阅id变量并查阅我们上面看到的映射,您可以使用相应的ID替换每列。

然后我们可以确定每次发生的概率:

N = size(un,2); %// Get total number of unique scenarios
M = size(A,2); %// Get total number of scenarios
prob = histc(id, 1 : N) / M; %// Finding probabilities

我们得到:

>> prob

prob =

    0.2857
    0.2857
    0.1429
    0.2857

这与我们的数据一致。对于列[0; 0; 0][0; 0; 1][1; 1; 1],每列出现两次,因此概率为2/7 = 0.2857[1; 0; 0]的另一列只有一次出现,因此概率为1/7 = 0.1429

对于完整的代码清单,您可以轻松复制和粘贴,假设您的矩阵存储在A中:

[un, ~, id] = unique(A.', 'rows'); %'// Assigning each event a unique ID
un = un.'; %'// Transpose to ensure compatibility
N = size(un,2); %// Get total number of unique scenarios
M = size(A,2); %// Get total number of scenarios
prob = histc(id, 1 : N) / M; %// Finding probabilities