在值更改之前查找连续元素的数量(MATLAB)

时间:2014-04-28 18:00:09

标签: matlab

我有一个(行)某个大小的向量,包含值1,2和3.它们在那里没有特定的'顺序,所以数组的样本将是[1,1,1,1,2,2,2,1,1,2,2,3,3]。我想要做的是找到连续数量的相同元素,但有一些限制。

我想要的是制作元素表示的新数组:

  • 在变为2
  • 之前的连续1的数量
  • 在变为1
  • 之前的连续2的数量
  • 在变为3
  • 之前的连续2的数量
  • 在变为2
  • 之前连续3的数量

因此,对于我给出的示例,数组将是

[4,2]
[3]
[2]
[]

我不确定如何解决这个问题。我可以使用diff函数找到它改变符号的位置,但是它确实有点难以弄清楚究竟发生了什么变化,对吧?

该方法不一定非常快,因为我只需要对大约10 ^ 5个数据点进行几次这样的操作。

3 个答案:

答案 0 :(得分:3)

使用diff标准程序检测更改和运行长度,然后根据更改前后的每对值应用accumarray组运行长度:

x = [1,1,1,1,2,2,2,1,1,2,2,3,3];
x = x.'; %'// easier to work with a column vector
ind = find(diff(x))+1; %// index of positions where x changes
%// To detect what change has ocurred, we'll use x(ind-1) and x(ind)
len = diff([1; ind]); %// length of each run
result = accumarray([x(ind-1) x(ind)], len, [], @(v) {v}); %// group lengths

请注意,每个结果向量中的顺序可能会根据accumarray进行更改。

在你的例子中,这给出了

>> result
result = 
     []    [2x1 double]     []
    [3]              []    [2]
>> result{1,2}
ans =
     2
     4
>> result{2,1}
ans =
     3
>> result{2,3}
ans =
     2

答案 1 :(得分:3)

这种方法会按照您在问题中指定的方式对事物进行分组:

a=[1,1,1,1,2,2,2,1,1,2,2,3,3]
b = diff(a)
c = find(b)
d = diff([0,c]);
type1 = d(b(c) == 1 & a(c) == 1);
type2 = d(b(c) == -1 & a(c) == 2);
type3 = d(b(c) == 1 & a(c) == 2);
type4 = d(b(c) == -1 & a(c) == 3);

type1 =
     4     2
type2 =
     3
type3 =   
     2
type4 =
   Empty matrix: 1-by-0

答案 2 :(得分:1)

我相信这会起作用(虽然它不是很漂亮)

a=[1,1,1,1,1,2,2,2,2,1,1,1,2,2,3,3,3];
d=diff(a);
deltas=(d~=0);
d12=[];d23=[];d32=[];d21=[];
last=0;
for i=1:length(a)-1
    if deltas(i)
        if a(i)==1&&a(i+1)==2
            d12=[d12,i-last];
            last=i;
        elseif a(i)==2&&a(i+1)==3
            d23=[d23,i-last];
            last=i;
        elseif a(i)==3&&a(i+1)==2
            d32=[d32,i-last];
            last=i;
        elseif a(i)==2&&a(i+1)==1
            d21=[d21,i-last];
            last=i;
        end

    end
end