column circular permutaion on a matrix

2 Ansichten (letzte 30 Tage)
Abhishek Bakhla
Abhishek Bakhla am 20 Apr. 2020
Kommentiert: Abhishek Bakhla am 23 Apr. 2020
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].

Akzeptierte Antwort

Ameer Hamza
Ameer Hamza am 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
  2 Kommentare
Abhishek Bakhla
Abhishek Bakhla am 21 Apr. 2020
thank you.
Ameer Hamza
Ameer Hamza am 21 Apr. 2020
Glad to be of help.

Melden Sie sich an, um zu kommentieren.

Weitere Antworten (2)

Ilian
Ilian am 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 am 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

Kategorien

Mehr zu Resizing and Reshaping Matrices finden Sie in Help Center und File Exchange

Produkte

Community Treasure Hunt

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

Start Hunting!

Translated by