matlab翻转矩阵

时间:2012-06-25 19:10:40

标签: matlab

假设我有一个矩阵。

A = [
   8     9     14     0     0     0     0     0     0

   8    10    11     0     0     0     0     0     0

   5     8     9    14     0     0     0     0     0

   7     8     9    14     0     0     0     0     0

   5     8    10    11     0     0     0     0     0
 ];

如何翻转矩阵并在matlab中得到这样的结果?我不希望它按排序顺序。谢谢你

A = [
 14     9    8     0     0     0     0     0     0

 11    10    8     0     0     0     0     0     0

 14    9     8     5     0     0     0     0     0

 14    9     8     7     0     0     0     0     0

 11    10    8     5     0     0     0     0     0
];

3 个答案:

答案 0 :(得分:4)

不需要调整大小,如果要翻转第1列到第4列,可以使用以下内容:

colList = 1:4;

matrix(:,colList) = fliplr(matrix(:,colList));

这适用于任意列的列

工作原理

首先选择您关注的列:

   ... matrix(:,colList)

使用

水平反射它们
   ... fliplr( ... )

将反射的矩阵保存回原始矩阵的子部分:

matrix(:,colList) =  ...

答案 1 :(得分:2)

根据您的评论,我认为您需要以下内容:

  1. 找到每行中的最后一个非零元素,称之为lastNZ
  2. 反转元素1的顺序:行中的lastNZ
  3. 这应该做的工作:

    for i=1:size(A,1)
        lastNZ = find(A(i,:), 1, 'last');
        A(i,1:lastNZ) = A(i,lastNZ:-1:1);
    end
    

答案 2 :(得分:1)

好吧,因为您不希望行结束排序slayton的响应将使用一个小的更改来计算不同的零数。类似的东西:

for i=1:size(A,1)  
    temp = A(i,A(i,:)~=0);  
    A(i,A(i,:)~=0) = fliplr(temp);  
end

如果你想要一个单行解决方案(可能不会比for循环更快,并且更难以阅读)你可以使用

A = cell2mat(cellfun(@(x) [fliplr(x(x~=0)) zeros(1,size(x,2)-nnz(x))],num2cell(A,2),'UniformOutput',false))

我假设你的矩阵没有任何属于重新排序的零(例如[1 5 1 0 0; 6 0 3 1 0]进入[1 5 1 0 0; 1 3 0 6 0])。如果该假设不正确,则需要更改我的代码。