MATLAB Answers

How do I swap the elements in the major diagonal with those in the minor diagonal?

185 views (last 30 days)
Brett Baxter
Brett Baxter on 22 Sep 2020 at 21:49
Edited: Stephen Cobeldick on 23 Sep 2020 at 10:00
So let's assume I have an array like so
x = 4x5 array
[1 2 3 4 5
6 7 8 9 1
2 3 4 5 6
7 8 9 1 2]
What I want to do is flip the diagonals of this matrix horizontally. So the end result would look like this,
x = [5 2 3 4 1
6 9 8 7 1
2 3 4 5 6
7 1 9 8 2]
As you can see, the diagonals starting from each corner going across have been flipped horizontally. 1 and 5 have swapped in the first row, 7 and 9 have swapped in the second row and so on. I tried indexing these values and then doing something like array(major) = array(minor) but this only brings back an error saying "Index exceeds the number of array elements. Could somebody help me?

  0 Comments

Sign in to comment.

Accepted Answer

madhan ravi
madhan ravi on 22 Sep 2020 at 22:13
ix1 = find(eye(size(x)));
ix2 = sort(find(fliplr(eye(size(x)))), 'descend');
x([ix1, ix2]) = x([ix2, ix1])

More Answers (2)

Stephen Cobeldick
Stephen Cobeldick on 23 Sep 2020 at 3:39
Edited: Stephen Cobeldick on 23 Sep 2020 at 9:59
Similar to madhan ravi's answer, without sorting:
>> x = [1,2,3,4,5;6,7,8,9,1;2,3,4,5,6;7,8,9,1,2]
x =
1 2 3 4 5
6 7 8 9 1
2 3 4 5 6
7 8 9 1 2
>> ix0 = eye(size(x));
>> ix1 = flipud(find(ix0));
>> ix2 = find(fliplr(ix0));
>> x([ix1;ix2]) = x([ix2;ix1])
x =
5 2 3 4 1
6 9 8 7 1
2 3 4 5 6
7 1 9 8 2
Works for character matrices too:
>> x = char('A'+x)
x =
FCDEB
GJIHB
CDEFG
HBJIC
>> x([ix1;ix2]) = x([ix2;ix1])
x =
BCDEF
GHIJB
CDEFG
HIJBC

  0 Comments

Sign in to comment.


Bruno Luong
Bruno Luong on 22 Sep 2020 at 22:03
x=[1 2 3 4 5
6 7 8 9 1
2 3 4 5 6
7 8 9 1 2]
s=size(x);
m=min(s);
n=s(2);
i=1:m;
id=sub2ind(s,i,i);
iad=sub2ind(s,i,n+1-i);
x([id iad])=x([iad id])

Community Treasure Hunt

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

Start Hunting!