-1

可以说我有一个矩阵。

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
];
4

3 回答 3

4

无需调整大小,如果要翻转第 1 到 4 列,可以使用以下命令:

colList = 1:4;

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

这适用于任意列的列表

这个怎么运作

首先选择您关心的列:

   ... matrix(:,colList)

水平反射它们

   ... fliplr( ... )

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

matrix(:,colList) =  ...
于 2012-06-25T21:07:39.700 回答
2

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

  1. 在每一行中找到最后一个非零元素,称之为 lastNZ
  2. 反转行中元素 1:lastNZ 的顺序

这应该做的工作:

for i=1:size(A,1)
    lastNZ = find(A(i,:), 1, 'last');
    A(i,1:lastNZ) = A(i,lastNZ:-1:1);
end
于 2012-06-26T16:02:39.073 回答
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 ])。如果该假设不正确,那么我的代码需要更改。

于 2012-06-26T15:49:37.153 回答