pairs of consecutive numbers

4 views (last 30 days)
Lenin Cruz
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)
  1 Comment
Andrei Bobrov
Andrei Bobrov on 21 Aug 2019
Please set your result for [1 2 3 4 5 4 3].

Sign in to comment.

Accepted Answer

Guillaume
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])
  13 Comments
Stephen23
Stephen23 on 9 Dec 2022
"from row position 14 to 19, 33 to 36 etc to assign these number to dates (14-Jan to 19-Jan, 02-Febr to 05-Febr)"
V = [14;19;33;36];
D = datetime(2022,1,V)
D = 4×1 datetime array
14-Jan-2022 19-Jan-2022 02-Feb-2022 05-Feb-2022

Sign in to comment.

More Answers (2)

Rik
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 Comments
Lenin Cruz
Lenin Cruz on 21 Aug 2019
Thanks for your reply. Yes, that is similar to what my code does, but let's say that now
A=[5 3 4 1];
I would expect my matrix B to be: B=[3 4; 4 5]
but I am just getting B=[3;4]
Any advice on how to do that? Thanks
Rik
Rik on 21 Aug 2019
The solution is the same as with the other method: sort A beforehand.

Sign in to comment.


Bruno Luong
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

Community Treasure Hunt

Find the treasures in MATLAB Central and discover how the community can help you!

Start Hunting!