如何翻转矩阵的特定部分

时间:2014-07-10 18:09:38

标签: matlab matrix

我试图翻转矩阵的某些部分。我可以通过例子更好地解释。假设我有一个矩阵

M = [  1    3   6;      
       1    2   4;      
       1    7   1;      
       2    9   0;      
       2    8   3;      
       2    4   2;      
       2    3   1;      
       3    6   5;      
       3    4   5;      
       3    1   9;      
       4    2   4;  
       4    8   6 ] 

我想在这里做的是在第一列中取任何带偶数的行,然后翻转第三列元素。最终结果如下:

   1    3   6       
   1    2   4       
   1    7   1       
   2    9   1   *   
   2    8   2   *   
   2    4   3   *   
   2    3   0   *   
   3    6   5       
   3    4   5       
   3    1   9       
   4    2   6   *
   4    8   4   *

请注意,标有星号的行已将第三列的元素翻转过来。我遇到的问题是像for循环一样遍历每一行,你无法翻转整行。

提前感谢您的帮助。

3 个答案:

答案 0 :(得分:4)

另一个时间accumarray是要走的路:

A =[ 1    3   6 ;       
     1    2   4 ;      
     1    7   1 ;       
     2    9   0 ;       
     2    8   3 ;       
     2    4   2 ;       
     2    3   1 ;       
     3    6   5 ;      
     3    4   5 ;       
     3    1   9 ;       
     4    2   4 ;   
     4    8   6 ] 

C = accumarray(A(:,1),A(:,3),[],@(x) {flipud(x)} );  %// get groups according to
                                                     %// first column and flip it
C = vertcat(C{:});                                   %// cell array returned, 
                                                     %// transform to matrix

mask = ~mod(A(:,1),2);  %// mask for even numbers                     
A(mask,3) = C(mask);    %// replace masked values of 3rd column with flipped ones

返回:

A =

     1     3     6
     1     2     4
     1     7     1
     2     9     1
     2     8     2
     2     4     3
     2     3     0
     3     6     5
     3     4     5
     3     1     9
     4     2     6
     4     8     4

肯定比较慢,但仅仅是为了两行中的乐趣:

C = accumarray(A(:,1),A(:,3),[],@(x) {flipud(x)} );
A(~mod(A(:,1),2),3) = getfield( vertcat(C{:}), {~mod(A(:,1),2)});
%// well no, I won't explain it...

编辑:我假设你的第一列只包含整数!

答案 1 :(得分:0)

我建议你将问题分解为几个阶段,如下所示:

  1. 识别您要翻转的区块
  2. 提取它们
  3. 翻转
  4. 替换它们
  5. 您可以使用uniquemod函数识别一组偶数,然后对它们使用for循环,并使用逻辑索引来拉取/替换块。

答案 2 :(得分:0)

在这里,试试这个

a = magic(5); % Some data in a 5x5 matrix
b = 1:numel(a); % Indices of <a>

然后根据需要重新排列b,然后根据重新分配的b索引a=a(b)重新分配a。例如,以下代码

disp(a(b));

只会以原始顺序返回a的元素。对于您的应用程序,此代码应该有效:

a = <your matrix data>
b = 1:numel(a);
b = [b(1:27) fliplr(b(28:31)) b(32:34) fliplr(b(35:36))] % Change this part
a = reshape(a(b),size(a))

你应该根据你需要做的事情来改变b。