how remove tow of three consecutive same values in a vector
1 次查看(过去 30 天)
显示 更早的评论
I have two vectors like this
a=[1,2,3,1,1,1,2,3,2,3,1,1,1,1,2,3,3,3,2,2,1],
where * b * is id of * a *
b=[1,2,3,11,12,13,20,21,25,27,31,32,33,34,36,40,41,42,47,48,50]
what i want to achieve is to keep the midle element of three consecutive elements or the even element if te consecuence is more than 3 elements. i want to keep the b[4] or b[11] and b[13] also the b[16]. how to achieve this?? Can any body help?
9 个评论
Geoff Hayes
2014-4-23
I don't understand "..but they are not consecutive in b". I thought that it was only the consecutive integers in a that we were concerned with?
采纳的回答
Azzi Abdelmalek
2014-4-23
a = [1,2,3,1,1,1,2,3,2,3,1,1,1,1,2,3,3,3,2,2,1];
b = [1,2,3,11,12,13,20,21,25,27,31,32,33,34,36,40,41,42,47,48,50];
c=diff(a)==0;
ii1=strfind([0 c 0],[0 1 1]);
ii2=strfind([0 c 0],[1 1 0])+1;
out=cell2mat(arrayfun(@(x,y) b(x+1:2:y),ii1,ii2,'un',0))
2 个评论
the cyclist
2014-4-24
You did not mention anything about this in your original question. How were we to know this is what you needed?
更多回答(1 个)
the cyclist
2014-4-23
This code is just terrible, but I think it does what you want.
a = [1,2,3,1,1,1,2,3,2,3,1,1,1,1,2,3,3,3,2,2,1];
b = [1,2,3,11,12,13,20,21,25,27,31,32,33,34,36,40,41,42,47,48,50];
d = [];
currentRunLength = 1;
for i = 2:numel(a)
if a(i)==a(i-1)
currentRunLength = currentRunLength+1;
if ((currentRunLength==2) && (i~=numel(a)) && a(i)==a(i+1)) || ((currentRunLength>=4) && mod(currentRunLength,2)==0)
d = [d,b(i)];
end
else
currentRunLength = 1;
end
end
3 个评论
Geoff Hayes
2014-4-23
My mistake - I had read your a(i)==a(i-1) as ~= and so figured that a final check would be needed.
That being said, is it only the ids of the duplicates that are to be kept (from b) or should it be the ids of the single elements as well?
另请参阅
类别
在 Help Center 和 File Exchange 中查找有关 Logical 的更多信息
产品
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!