假设我有一个矩阵。
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
];
答案 0 :(得分:4)
不需要调整大小,如果要翻转第1列到第4列,可以使用以下内容:
colList = 1:4;
matrix(:,colList) = fliplr(matrix(:,colList));
这适用于任意列的列
工作原理
首先选择您关注的列:
... matrix(:,colList)
使用
水平反射它们 ... fliplr( ... )
将反射的矩阵保存回原始矩阵的子部分:
matrix(:,colList) = ...
答案 1 :(得分:2)
根据您的评论,我认为您需要以下内容:
这应该做的工作:
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])。如果该假设不正确,则需要更改我的代码。