我有一个矩阵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问题,但在那里,序列已被连接。如果您需要进一步澄清,请与我们联系。
答案 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
中(填充是必要的,以便相邻行中没有不希望的过渡)。 p
和q
包含状态转换的所有可能组合,count_func
计算特定Y
和p
的{{1}}转换次数。 q
针对arrayfun
和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
表示从 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