在Matlab中查找数组内持续时间均值的中位数点

时间:2015-08-17 10:59:48

标签: arrays matlab duration

我有以下向量A

A = [34 35 36 5 6 7 78 79 7 9 10 80 81 82 84 85 86 102 3 4 6 103 104 105 106 8 11 107 201 12 202 203 204];

对于n = 2,我在A内计算了大于或等于15的元素:

D = cellfun(@numel, regexp(char((A>=15)+'0'), [repmat('0',1,n) '+'], 'split'));

上面的表达式给出了以下输出作为持续时间值:

D = [3 2 7 4 6] = [A(1:3) **stop** A(7:8) **stop** A(12:18) **stop** A(22:25) **stop** A(28:33)];

上述算法通过计算大于或等于15的元素来计算持续时间值。计数还允许在每个持续时间事件中少于2个小于15(n = 2)的连续元素。当有2个或更多连续元素小于15时,计数器停止,并在A内的下一个子字符串处重新开始。

此处提供的解决方案Find median position points of duration eventsA(1:3)之后的2个或更多小于15的连续数字(在本例中为3)中的最后一个数字分配给下一个子字符串A(7:8)并且与其他子串相同,这不是计算持续时间事件的正确方法。

我想要一种方法来查找持续时间事件A(1:3)A(7:8)A(12:18)A(22:25)A(28:33)的中位数点,这些点是正确的计算。结果应如下所示:

a1 = round(median(A(1:3))) = 2; 
a2 = round(median(A(7:8))) = 8;
a3 = round(median(A(12:18))) = 15;
a4 = round(median(A(22:25))) = 24;
a5 = round(median(A(28:33))) = 31;

1 个答案:

答案 0 :(得分:0)

这是我的解决方案,它可能是愚蠢的(使用while循环...),但基本上解决了这个问题。

该过程首先添加每2个连续的整数,如果它们的总和小于30,那么必须有2个或更多的整数小于15。在总和大于30的情况下,中间可以有1或0个小于15的整数。 -NOTE:只有当你有正数时才会出现这种情况,如果存在负数而不是这个解决方案错了!

A = [34 35 36 5 6 7 78 79 7 9 10 80 81 82 84 85 86 102 3 4 6 103 104 105 106 8 11 107 201 12 202 203 204];
A1 = A(1:end-1);
A2 = A(2:end);
B = A1+A2;
C = find(B<30);
Cmod = [1,C,size(A,2)];
counter = 1;
j = 1;

while counter < size(Cmod,2)
    temp = Cmod(:,counter):Cmod(:,counter+1)-1;
    if size(temp,2) < 2
        counter=counter+1;
    else
        a(j) = round(median(temp(3:end)));
        counter = counter+1;
        j=j+1;
    end
end
a(1) = a(1)-1; %this compensate the position shift in A1 and A2
a(end) = a(end)+1; 

输出是矢量a,其内容为:

 a =

 >>2     8    15    24    31