column circular permutaion on a matrix

2 ビュー (過去 30 日間)
Abhishek Bakhla
Abhishek Bakhla 2020 年 4 月 20 日
コメント済み: Abhishek Bakhla 2020 年 4 月 23 日
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].

採用された回答

Ameer Hamza
Ameer Hamza 2020 年 4 月 20 日
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 件のコメント
Abhishek Bakhla
Abhishek Bakhla 2020 年 4 月 21 日
thank you.
Ameer Hamza
Ameer Hamza 2020 年 4 月 21 日
Glad to be of help.

サインインしてコメントする。

その他の回答 (2 件)

Ilian
Ilian 2020 年 4 月 20 日
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),:)];
  1 件のコメント
Abhishek Bakhla
Abhishek Bakhla 2020 年 4 月 21 日
thank you.

サインインしてコメントする。


Stephen23
Stephen23 2020 年 4 月 21 日
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
  1 件のコメント
Abhishek Bakhla
Abhishek Bakhla 2020 年 4 月 23 日
thank you.

サインインしてコメントする。

カテゴリ

Help Center および File ExchangeResizing and Reshaping Matrices についてさらに検索

製品

Community Treasure Hunt

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

Start Hunting!

Translated by