【问题标题】:Matlab Matrix Counter rotation of elementsMatlab矩阵逆向旋转元素
【发布时间】:2014-05-08 10:00:01
【问题描述】:

您好,我想创建一个函数,将所有元素逆时针旋转方阵的一个位置。

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

应该变成:

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

这是我的尝试:

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

我可以做得更好吗?

【问题讨论】:

  • 你有什么问题吗?请先发布您的尝试,stackoverflow 不是要求人们为您编写代码的地方。
  • 嗨,丹,对不起。我曾尝试使用 5 个 for 循环的构造,但我无法在这里展示。
  • @Clans87 不要为此感到难过或尴尬,无论你得到什么都表明你的努力,这在向SO提问的情况下更为重要。
  • @Clans87 您不需要删除之前发布的答案。我认为您可以将其作为“我的尝试”部分附加到您的问题中。

标签: matlab matrix rotation shift


【解决方案1】:

代码

%%// 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

【讨论】:

  • 非常好!似乎适用于任何大小的矩阵,但我不知道为什么。
  • 好吧,我必须创建索引图,仅此而已! :)
猜你喜欢
  • 2020-07-08
  • 2019-02-08
  • 1970-01-01
  • 2021-08-07
  • 2016-12-13
  • 2013-02-28
  • 1970-01-01
  • 2017-02-27
  • 1970-01-01
相关资源
最近更新 更多