# Substitute numbers in array

8 views (last 30 days)
majed majed on 22 Mar 2016
How are you everyone!
I have the array X=[1 2 3 4 5 6 7 8] I want to flip this array and change the numbers as next
1 to 5 and 5 to 1
2 to 6 and 6 to 2
3 to 7 and 7 to 3
4 to 8 and 8 to 4
So the result which I want after flipping and substitution is
XX=[4 3 2 1 8 7 6 5]

Azzi Abdelmalek on 22 Mar 2016
Edited: Azzi Abdelmalek on 22 Mar 2016
X=[1 2 3 4 5 6 7 8]
XX=[fliplr(X(1:4)) fliplr(X(5:end))]

Azzi Abdelmalek on 22 Mar 2016
This case is different, there are 11 element (11 is odd)
majed majed on 22 Mar 2016
The numbers or values is just from 1 to 8
Azzi Abdelmalek on 22 Mar 2016
Now if you want to flip just 8 element:
X=[1 2 3 4 5 6 7 8 9 10 11]
XX=[fliplr(X(1:4)) fliplr(X(5:8)) X(8+1:end)]

Stephen Cobeldick on 22 Mar 2016
Edited: Stephen Cobeldick on 22 Mar 2016
Try this function. The matrix M defines any arbitrary values to swap. Note that these values are not used as indices so this is a general solution to the problem.
>> M = [1:4;5:8].'; % each row specifies one pair of values to swap
M =
1 5
2 6
3 7
4 8
>> fun = @(X)fliplr(reshape(M(:,[2,1]),1,[])*bsxfun(@eq,X,M(:)));
and the examples you gave are:
>> fun([1,2,3,4,5,6,7,8])
ans =
4 3 2 1 8 7 6 5
>> fun([1,3,6,5,3,3,2,8,7,6,5])
ans =
1 2 3 4 6 7 7 1 2 7 5
>> fun([5,6,4,3,7,8,3,2,1,7,8])
ans =
4 3 5 6 7 4 3 7 8 2 1

Jan on 22 Mar 2016
Edited: Jan on 22 Mar 2016
A job for a lookup table:
X = [1, 2, 3, 4, 5, 6, 7, 8]
LUT = [5, 6, 7, 8, 1, 2, 3, 4]
Result = LUT(fliplr(X))

Stephen Cobeldick on 22 Mar 2016
Nice use of indexing :)
Note that it is not a general solution suitable for all data: if
X = [1,1e9]
what will LUT have to be?
Steven Lord on 22 Mar 2016
In that case I would make the LUT a sparse column vector.
X = [1, 1e9];
LUT = sparse(X, 1, [2, 73]);
Y = full(flip(LUT(X)))

Suraj Sudheer Menon on 22 Jun 2020
The following could be an approach:-
sub=[5 6 7 8 1 2 3 4];
XX=flip(X);
for i=1:numel(X)
XX(i)=sub(XX(i));
end
%XX contains neccesary values.