matlabの特定の行をシフトする必要があります。たとえば、50x50のサイズのマトリックスがあるとします。そして、特定の行をシフトする必要があります。たとえば、15、18、45 ..を上に移動し、残りの行を下に移動します。matlabでこれをどのように達成できますか?
質問する
11148 次
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
の行を並べ替える行列が返されます。エラー チェックなどがないことに注意してください。この関数を運用コードで使用する場合は、自己責任で行ってください。nxn
1->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 に答える