在matlab中查找连续相同值元素的平均数

时间:2014-01-20 13:51:28

标签: matlab

我有一个我自己无法解决的问题,搜索结果也不是我想要的(除非我错过了解释一切的问题,在这种情况下我道歉!)

我的系统可以处于三种状态S = S1, S2 and S3。它可以在一定概率下在这三种状态之间切换:从S1S2 P1S2S1 P2,{ {1}} S2 S3P3 S3 S2 P4。但是,为了简单起见,我将从P1 = P2 = P3 = P4 = P开始。

现在我有一个数据集,一个1000000值的数组,对应于这些特定的状态。因此S1表示数组中的1S2表示0.5S3表示0

所以现在我想知道我的数组中连续1,或0.5或0的平均'字符串'有多长。因为它只是一个二项式过程,(改变p = P的状态),我原则上应该能够从这个信息中提取P.虽然我不知道怎么回事,因为我不能简单地将“字符串长度”分布到二项分布中,我可以吗?

在任何情况下,一个好的起点是能够提取连续相等值的“字符串”的长度。有人能指出我从哪里开始的方向吗?

编辑: 我看到fitdist可以使'字符串长度'符合二项分布。所以现在我只想找到如何创建一个包含连续1,0.5和0的'字符串长度'的数组。

编辑2:似乎Series of consecutive numbers (different lengths)可能正在做我想要的。我会快速浏览一下,如果有的话我会删除帖子。我道歉!

2 个答案:

答案 0 :(得分:3)

你可以做一些像使用衍生物一样简单的事情。这将确定何时序列发生变化。衍生工具返回0以外的其他任何地方,这表示有变化。找出这些变化发生的索引,然后您可以找到这些索引之间的差异以获得长度。这是一些示例代码

% all just setup
a = 0*ones(1,randi([1,10]));
b = 1*ones(1,randi([1,10]));
c = 0.5*ones(1,randi([1,10]));
vals = {a,b,c};
len = 1e6;
temp = cell(1,len);
for i = 1:len
    index = randi([1,3]);
    temp{i} = vals{index};
end
mat  = cell2mat(temp);
% code that actually does what you need
mat = [mat,nan];
seqLengths = diff([0,find(diff(mat) ~= 0)]);

请注意,nan会添加到矢量的末尾,以便您在结尾处获得相同长度的矢量。使用nan是因为假设您的向量将包含所有有效数字,否则,nan可以替换为与矩阵中的最后一个值不匹配的任何值。

答案 1 :(得分:0)

如果它确实是二项式过程,则无需计算平均长度。计算每个州的转变:

y=sparse(x(1:end-1),x(2:end),ones(numel(x)-1,1))

并将其除以转换总数:

z=y./sum(sum(y))