我有一个(行)某个大小的向量,包含值1,2和3.它们在那里没有特定的'顺序,所以数组的样本将是[1,1,1,1,2,2,2,1,1,2,2,3,3]。我想要做的是找到连续数量的相同元素,但有一些限制。
我想要的是制作元素表示的新数组:
因此,对于我给出的示例,数组将是
[4,2]
[3]
[2]
[]
我不确定如何解决这个问题。我可以使用diff函数找到它改变符号的位置,但是它确实有点难以弄清楚究竟发生了什么变化,对吧?
该方法不一定非常快,因为我只需要对大约10 ^ 5个数据点进行几次这样的操作。
答案 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