Effacer les filtres
Effacer les filtres

How to circular shift a matrix for every 1 to 6 elements until its end?

2 vues (au cours des 30 derniers jours)
arun
arun le 15 Déc 2017
Modifié(e) : KL le 15 Déc 2017
I have a matrix 12528x246, I would like to the circular shift of the 2nd dimension(246). The shift should be done for every consecutive 6 elements from 1 position till the end of the matrix starting from 1 to 246. For e.g, 1:6(perform circular shift for 1 position) then repeat the steps for 7:12,......up to 241:246. Is it possible to do such an operation using circular shift? I tried my best but couldn't find the correct logic.
  1 commentaire
KL
KL le 15 Déc 2017
Modifié(e) : KL le 15 Déc 2017
For e.g, 1:6(perform circular shift for 1 position) then repeat the steps for 7:12
repeat how? by increasing the shift value by 2,3 and so on?

Connectez-vous pour commenter.

Réponse acceptée

KL
KL le 15 Déc 2017
Modifié(e) : KL le 15 Déc 2017
I'm only guessing. If you want to do circshifts for blocks of columns, use mat2cell first, do the shifting and convert it back using cell2mat. Small example,
A = repmat((1:18),10,1); %dummy data with 18 columns
sz = size(A);
splits = 6;
B = mat2cell(A,sz(1),repmat(splits,1,sz(2)/splits));
B_shifted = cell2mat(cellfun(@(x) circshift(x,1,2),B,'uni',0));
A =
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
B_shifted =
6 1 2 3 4 5 12 7 8 9 10 11 18 13 14 15 16 17
6 1 2 3 4 5 12 7 8 9 10 11 18 13 14 15 16 17
6 1 2 3 4 5 12 7 8 9 10 11 18 13 14 15 16 17
6 1 2 3 4 5 12 7 8 9 10 11 18 13 14 15 16 17
6 1 2 3 4 5 12 7 8 9 10 11 18 13 14 15 16 17
6 1 2 3 4 5 12 7 8 9 10 11 18 13 14 15 16 17
6 1 2 3 4 5 12 7 8 9 10 11 18 13 14 15 16 17
6 1 2 3 4 5 12 7 8 9 10 11 18 13 14 15 16 17
6 1 2 3 4 5 12 7 8 9 10 11 18 13 14 15 16 17
6 1 2 3 4 5 12 7 8 9 10 11 18 13 14 15 16 17

Plus de réponses (4)

Guillaume
Guillaume le 15 Déc 2017
If I understood correctly, all you have to do is reshape your original array into rows or columns of 6 elements, perform the circular shift, and reshape back. Because you want to operate on columns and matlab is row based, you'll have to transpose back and forth, so:
shift = 1; %or -1 maybe, you haven't specified the direction
shiftedmatrix = reshape(circshift(reshape(yourmatrix.', 6, []), shift, 1).', size(yourmatrix))

Andrei Bobrov
Andrei Bobrov le 15 Déc 2017
Modifié(e) : Andrei Bobrov le 15 Déc 2017
A - your array
k = 6;
[m,n] = size(A);
out = A1(sub2ind([m,n],repelem(hankel([(2:m)';1],1:n/k),1,k),repelem(1:n,m,1)));

Jos (10584)
Jos (10584) le 15 Déc 2017
Clever indexing will do the trick:
A = repmat((1:18),10,1); % dummy data with 18 columns
S = 6
ix = 0:size(A,2)-1
ix0 = S * floor(ix/S)
ix1 = rem(ix,S)
ix1shift = rem(ix1+S-1,S)
ix2 = ix0 + ix1shift + 1
B = A(:,ix2)
% all this can be done in one step, of course, which makes it an "easy-to-read" one-liner :D
B2 = A(:,S * floor((0:size(A,2)-1)/S) + rem(rem(0:size(A,2)-1,S)+S-1,S)+1)

arun
arun le 15 Déc 2017
Thank you all for your ideas and contributions, but it seems cell2mat concept is easier than other ideas

Catégories

En savoir plus sur Matrix Indexing dans Help Center et File Exchange

Community Treasure Hunt

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

Start Hunting!

Translated by