1

matlabの特定の行をシフトする必要があります。たとえば、50x50のサイズのマトリックスがあるとします。そして、特定の行をシフトする必要があります。たとえば、15、18、45 ..を上に移動し、残りの行を下に移動します。matlabでこれをどのように達成できますか?

4

4 に答える 4

2

サークシフト機能を試しましたか?このようなものが役立つ可能性があります:

A = [1:8; 11:18; 21:28; 31:38; 41:48]
A =
     1     2     3     4     5     6     7     8
    11    12    13    14    15    16    17    18
    21    22    23    24    25    26    27    28
    31    32    33    34    35    36    37    38
    41    42    43    44    45    46    47    48
B = circshift(A, [3, 0])
B =
    21    22    23    24    25    26    27    28
    31    32    33    34    35    36    37    38
    41    42    43    44    45    46    47    48
     1     2     3     4     5     6     7     8
    11    12    13    14    15    16    17    18
于 2012-04-15T16:28:03.410 に答える
2

これは、いくつかの簡単なインデックス作成の助けを借りて非常に簡単に解決できる問題です。

Matrix = [ 1   101   201   301
 2   102   202   302
 3   103   203   303
 4   104   204   304
 5   105   205   305
 6   106   206   306
 7   107   207   307
 8   108   208   308
 9   109   209   309
10   110   210   310];

rowsOnTop = [1 8 4];
rowsBelow = true(size(Matrix,1),1);
rowsBelow(rowsOnTop) = false;

Modified = [Matrix(rowsOnTop,:); Matrix(rowsBelow,:)]

Modified =

     1   101   201   301
     8   108   208   308
     4   104   204   304
     2   102   202   302
     3   103   203   303
     5   105   205   305
     6   106   206   306
     7   107   207   307
     9   109   209   309
    10   110   210   310
于 2012-04-15T17:50:18.197 に答える
0

行列の特定の行を一番上に移動し、残りをその場所に保持したいことを理解しました。そのためにあなたはこれを使うことができます:

マトリックスの例:

Matrix = [ 1:10; 101:110; 201:210; 301:310 ]';

Matrix =

 1   101   201   301
 2   102   202   302
 3   103   203   303
 4   104   204   304
 5   105   205   305
 6   106   206   306
 7   107   207   307
 8   108   208   308
 9   109   209   309
10   110   210   310

コードは次のとおりです。

RowsVector = [ 3, 5, 8 ];

編集:新しいより良いソリューション(より良いので最初にここに提示されます)。

NewMatrix = Matrix(cell2mat(arrayfun(@(x) x:size(Matrix,1):prod(size(Matrix)), [ RowsVector, setdiff(1:size(Matrix, 1), RowsVector) ]', 'UniformOutput', false)));

NewMatrix =

 3   103   203   303
 5   105   205   305
 8   108   208   308
 1   101   201   301
 2   102   202   302
 4   104   204   304
 6   106   206   306
 7   107   207   307
 9   109   209   309
10   110   210   310

編集:残りの答えは、[限定された]古いソリューションに関連しています。

% RowsVector must be sorted, otherwise the reordering will fail.

編集:順序付けされていないRowsVector入力のバグを修正しました。

RowsVector = sort(RowsVector);

for RowIndex = 1:size(RowsVector, 2)
    row = RowsVector(RowIndex);
    Matrix = vertcat(Matrix(row,:), Matrix);
    Matrix(row+1,:) = [];
end

結果は次のとおりです。

Matrix =

 8   108   208   308
 5   105   205   305
 3   103   203   303
 1   101   201   301
 2   102   202   302
 4   104   204   304
 6   106   206   306
 7   107   207   307
 9   109   209   309
10   110   210   310
于 2012-04-15T17:13:24.207 に答える
0

行置換行列を定義して目的の結果を生成することで、これを解決します。Matlab にこのための組み込み関数がある場合、それは私をエスケープするので、次のように書きました。

function P = rowpermat(vec)
P = zeros(length(vec));
for i = 1:length(vec)
    P(i,vec(i)) = 1;
end

vecがこの関数の順列である場合、行列1:nの行を並べ替える行列が返されます。エラー チェックなどがないことに注意してください。この関数を運用コードで使用する場合は、自己責任で行ってください。nxn1->vec(1), 2->vec(2), ...

この場合、A が置換する行列である場合、次のように記述できます。

rowpermat([15, 18, 45, 1:14,16:17,19:44,46:50])*A
于 2012-04-15T22:03:55.360 に答える