0

我有一个矩阵 X,它由我从马尔可夫链中获得的一些序列组成。我有 5 个州 1,2,3,4,5。因此,例如第 1 行是一个序列,第 2 行是一个单独的独立序列。

    4   4   4   4   4   5   3   0   0   0
    1   4   2   2   2   2   3   4   0   0
x=  4   4   1   2   1   3   1   0   0   0
    2   4   4   2   4   3   3   5   0   0
    4   4   5   4   2   1   2   4   3   5

我想计算状态 1..5 之间的转换次数。IE。1to1,1to2, 1to3, 1to4, 1to5。2to1 等。1to1 发生 0 次。但是 4to4 发生了 6 次。等等我们可以忽略零,它们是导入 excel 文件的人工制品。

例如这个问题,但在那里,序列已经连接起来。如果您需要进一步说明,请告诉我。

4

2 回答 2

3

这是执行您想要的代码的代码:

N = max(max(X));                                   %# Number of states
[P, Q] = meshgrid(1:N, 1:N);
Y = [X, zeros(size(X, 1), 1)]';                    %# Pad for concatenation
count_func = @(p, q)numel(strfind(Y(:)', [p, q])); %# Counts p->q transitions
P = reshape(arrayfun(count_func, P, Q), N, N)

简短说明: 的所有行都X放入一个长向量Y中(填充是必要的,以便相邻行中没有不希望的过渡)。pq保存状态转换的所有可能组合,并count_func计算Y特定pand的转换次数qarrayfun调用count_func和 的所有可能组合,p并相应地q生成矩阵P

对于您的示例,此代码产生矩阵P

P =
     0   2   1   1   0
     2   3   0   3   0
     1   1   1   2   1
     1   3   1   7   1
     0   0   2   2   0

其中P(m, n)表示从第m个状态到第n个状态的转换次数。


编辑:如果您有兴趣在后续问题中找到两步转换矩阵(即i -th state → j -th state → icount_func -th state),您只需要稍微改变,比如所以:

count_func = @(p, q)numel(strfind(Y(:)', [p, q, p]));

这应该产生:

P =

   0   1   0   0   0
   1   2   0   1   0
   1   0   0   0   0
   0   0   0   3   0
   0   0   0   1   0
于 2012-09-16T00:06:41.170 回答
1

另一种解决方案:

%# Define the example data:
x = [
4 4 4 4 4 5 3 0 0 0
1 4 2 2 2 2 3 4 0 0
4 4 1 2 1 3 1 0 0 0
2 4 4 2 4 3 3 5 0 0
4 4 5 4 2 1 2 4 3 5
];

%# Number of different states.
N = max(max(x));

%# Original states.
OrigStateVector = repmat((1:N)', N, 1);

%# Destination states corresponding to OrigStateVector.
DestStateVector = reshape(repmat((1:N)', 1, N)', N^2, 1);

%# Pad rows of x with zeros and reshape it to a horizontal vector.
xVector = reshape([ x, zeros(size(x,1),1) ]', 1, numel(x)+size(x,1));

%# Compute the number of state transitions and store the result in ResultMatrix.
ResultMatrix = reshape(cellfun(@(z) numel(z), arrayfun(@(x,y) strfind(xVector, [x y]), OrigStateVector, DestStateVector, 'UniformOutput', false)), N, N)';

ResultMatrix =
 0     2     1     1     0
 2     3     0     3     0
 1     1     1     2     1
 1     3     1     7     1
 0     0     2     2     0
于 2012-09-17T08:00:23.463 回答