-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

1行のソリューションが必要な場合(おそらく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 に答える