# pairs of consecutive numbers

11 views (last 30 days)
Lenin Cruz on 21 Aug 2019
Commented: Ancalagon8 on 9 Dec 2022
Hello,
I have a vector A=[1 2 5] i would like to have something that stores the pair of consecutive numbers eg B= [1 2] and something that stores the values unused eg [C= 5]
i would like this working for A=[5 2 1], A=[5 1 2] and all the permutations of the elements .
Thanks
Here is some piece of code that I have tried but I have no idea how to get the element unused, 'C' in my example above
A= [6 3 4];
p=[find(diff(A)==1); find(diff(A) == -1)];
q=[p;p+1];
A(q)
Andrei Bobrov on 21 Aug 2019
Please set your result for [1 2 3 4 5 4 3].

Guillaume on 21 Aug 2019
Well, you're almost there. When the diff is 1 or -1, this means that the number at the same index and the next one are consecutive. The easiest way to find the non-consecutive numbers is to take the set difference of all the indices with the pair indices.
A = [6 2 3 2 4 1 3 2 1 0 5]
pairindices = find(ismember(diff(A), [-1, 1])) + [0;1] %assumes A is a row vector
nonconsindices = setdiff(1:numel(A), pairindices)
Another method, which uses the undocumented feature that strfind works with numeric vectors:
nonconsindices = strfind([0, abs(diff(A)) == 1, 0], [0, 0])
Ancalagon8 on 9 Dec 2022
@Stephen23 thank you very much!

Rik on 21 Aug 2019
I have expanded your example array a bit to more clearly show the indeded effect. I have replicated the effect of your code, please confirm that is what you meant.
A=[3 1 2 0 3 4 5];
L= abs(diff(A))==1;
L=[L false;false L];
L_unused= sum(L,1)==0 ;
B=[A(L(1,:));A(L(2,:))];
C=A(L_unused);
##### 2 CommentsShowHide 1 older comment
Rik on 21 Aug 2019
The solution is the same as with the other method: sort A beforehand.

Bruno Luong on 21 Aug 2019
Edited: Bruno Luong on 29 Nov 2022
A=[5 3 4 1];
As=sort(A);
b=diff(As)==1;
pairs=As(b)'+[0 1];
notpair = setdiff(A,pairs(:))
notpair = 1