column circular permutaion on a matrix

2 views (last 30 days)
How can I move all the elements of a particular column circulary upwards or circularly downwards by some shift s. I have a matrix A = [ 1 2 3 4; 5 6 7 8; 9 10 11 12; 13 14 15 16] and shift columns 1, 2, 3 and 4 by shifts 2, 1 , 3 and 2 respectively then I get the matrix A as A = [9 6 15 12; 13 10 3 16; 1 14 7 4; 5 2 11 8].

Accepted Answer

Ameer Hamza
Ameer Hamza on 20 Apr 2020
Try this
A = [ 1 2 3 4; 5 6 7 8; 9 10 11 12; 13 14 15 16];
B = [9 6 15 12; 13 10 3 16; 1 14 7 4; 5 2 11 8];
shift = [2, 1, 3, 2];
C = A; % make a copy
for i=1:numel(shift)
C(:,i) = circshift(C(:,i), -shift(i));
end
Result
>> isequal(B, C)
ans =
logical
1

More Answers (2)

Ilian
Ilian on 20 Apr 2020
If you just want to rotate the rows this could work:
s = -3; % shift (both positive and negative values work)
rows = size(A,1);
B = [A(mod(s-rows,rows)+1:end,:); A(1:mod(s-rows,rows),:)];

Stephen23
Stephen23 on 21 Apr 2020
No loops:
>> A = [1,2,3,4;5,6,7,8;9,10,11,12;13,14,15,16];
>> S = [2,1,3,2]; % shifts
>> [R,C] = ndgrid(1:4,1:4);
>> B = A(sub2ind([4,4],1+mod(S+R-1,4),C))
B =
9 6 15 12
13 10 3 16
1 14 7 4
5 2 11 8

Categories

Find more on Resizing and Reshaping Matrices in Help Center and File Exchange

Products

Community Treasure Hunt

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

Start Hunting!