计算字符串在序列中出现的次数

时间:2012-09-15 22:48:47

标签: matlab matrix markov-chains

我有一个矩阵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之间的转换次数。即。 1to1,1to2,1to3,1to4,1to5。 2to1等 例如。 1to1发生0次。然而,4to4发生了6次。等等 我们可以忽略零,它们是导入excel文件的人工制品。

例如this问题,但在那里,序列已被连接。如果您需要进一步澄清,请与我们联系。

2 个答案:

答案 0 :(得分: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计算特定Yp的{​​{1}}转换次数。 q针对arrayfuncount_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 表示从 m -th状态到 n -th状态的转换次数。


编辑:如果您有兴趣找到两步转换矩阵(即 i -th state→ j - 状态→ - 状态)在你的后续问题中,你只需稍微改变P(m, n),就像这样:

count_func

这应该产生:

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

答案 1 :(得分: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