4

次で与えられる上三角行列(対角線なし)があります。

M = [0 3 2 2 0 0; 0 0 8 6 3 2; 0 0 0 3 2 1; 0 0 0 0 2 1; 0 0 0 0 0 0]

結果のマトリックスは次のようになります。

R = [0 0 0 0 0 0; 0 2 0 0 0 0; 2 3 1 0 0 0; 2 6 2 1 0 0; 3 8 3 2 0 0]

私の目標を説明する簡単な説明が見つからなかったので、画像で視覚化しようとしました:

ここに画像の説明を入力

rot90、などのさまざまな組み合わせを既に試しましたがtransposeflipud行列を与える適切な変換を見つけることができませんでしたR

編集:

行列の行は、M上記の例のように常にソートされるわけではありません。別の行列の場合M_2:

M_2 = [0 2 3 1 0 0; 0 0 3 6 3 9; 0 0 0 1 2 4; 0 0 0 0 2 6; 0 0 0 0 0 0]

結果のマトリックスR_2は次のようになる必要があります。

R_2 = [0 0 0 0 0 0; 0 9 0 0 0 0; 1 3 4 0 0 0; 3 6 2 6 0 0; 2 3 1 2 0 0]

再び以下の視覚化:

ここに画像の説明を入力

4

3 に答える 3

5

編集: @Dan のコメントのヒントに触発されて、さらに単純化することができます

R = reshape(rot90(M), size(M));

元の回答:

これはこれを行う簡単な方法である必要があります

F = rot90(M);
R = F(reshape(1:numel(M), size(M)))

返す

R =
     0     0     0     0     0     0
     0     2     0     0     0     0
     2     3     1     0     0     0
     2     6     2     1     0     0
     3     8     3     2     0     0

アイデアは、マトリックスを回転させると、

>> F = rot90(M)
F =
     0     2     1     1     0
     0     3     2     2     0
     2     6     3     0     0
     2     8     0     0     0
     3     0     0     0     0
     0     0     0     0     0

これは 6 行 5 列の行列です。F に対する線形インデックス付けを考慮すると、対応するインデックスは次のようになります。

>> reshape(1:30, size(F))
     1     7    13    19    25
     2     8    14    20    26
     3     9    15    21    27
     4    10    16    22    28
     5    11    17    23    29
     6    12    18    24    30

ここで、要素 6、11、12、16、17、18、および ... は、これを 5 行 6 列の行列に再形成するとゼロになります。

>> reshape(1:30, size(M))
     1     6    11    16    21    26
     2     7    12    17    22    27
     3     8    13    18    23    28
     4     9    14    19    24    29
     5    10    15    20    25    30

これで、ゼロ値に対応する要素が一番上に表示されました。まさに私たちが望んでいたものです。したがって、このインデックス配列を に渡すFことで、目的のR.

于 2013-08-20T11:20:05.117 に答える
4

順番に頼らずに(色付きのストリップを回転させて下に押し込むだけです)。

M(1,3)最初の解決策:「データ」値の間にゼロがある場合(たとえば、指定された例にある場合)、機能しないことに注意してください0。ゼロがある可能性がある場合は、以下の 2 番目の解決策を参照してください。

[nRows nCols]= size(M);
R = [flipud(M(:,2:nCols).') zeros(nRows,1)];
[~, rowSubIndex] = sort(~~R);
index = sub2ind([nRows nCols],rowSubIndex,repmat(1:nCols,nRows,1));
R = R(index);

2 番目の解決策: データ内にゼロがある場合でも機能します。

[nRows nCols]= size(M);
S = [flipud(M(:,2:nCols).') zeros(nRows,1)];
mask = 1 + fliplr(tril(NaN*ones(nRows, nCols)));
S = S .* mask;
[~, rowSubIndex] = sort(~isnan(S));
index = sub2ind([nRows nCols],rowSubIndex,repmat(1:nCols,nRows,1));
R = S(index);
R(isnan(R)) = 0;
于 2013-08-20T10:39:26.700 に答える
1

ループを使用した代替オプション:

[nRows nCols]= size(M);
R = zeros(nRows,nCols);
for n = 1:nRows
  R((n+1):nCols,n)=fliplr(M(n,(n+1):nCols));
end
于 2013-08-20T11:05:54.667 に答える