Question

Hi i would like to create a function which rotates all elements counter clockwise by one place of a square matrix.

[  1  2  3  4;
   5  6  7  8; 
   9 10 11 12; 
  13 14 15 16]

shall become:

[ 2  3  4  8; 
  1  7 11 12; 
  5  6 10 16;
  9 13 14 15]

This is my attempt:

size_mat = size(A,1)
B=zeros(size_mat);
loops = fix(size_mat/2)

if mod(size_mat,2) ~= 0
   B(loops+1,loops+1)= A(loops+1,loops+1) 
end

for i=1:loops,
    B(i+1,i)=A(i,i);
       for j=i:(size_mat-i)
           B(i,j)=A(i,j+1); 
           B(j,size_mat+1-i)=A(j+1,size_mat+1-i); 
           B(size_mat+1-i,size_mat+1-j)=A(size_mat+1-i,size_mat-j); 

           if((j+2)<=size_mat)
               B(size_mat+1-j,i)=A(size_mat-j,i); 
           end  
       end
end

Can I do better?

Was it helpful?

Solution

Code

%%// A is the input matrix

N = size(A,1)
sz = ceil(N/2)

quad4 = ones(sz)
quad1 = quad4

quad1(logical(fliplr(triu(ones(sz),1))))=N
quad4(logical(tril(quad4)))=-N
quad14 = [quad1;quad4]
quad = [-1*rot90(quad14,2) quad14]

if rem(N,2)==1
    quad(:,sz)=[]
    quad(sz,:)=[]
    quad(sz,sz)=0
end
rotatedA = A(reshape(1:numel(A),size(A))+quad) %%// rotated output matrix
Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top