我必须在 matlab 中移动某些行。比如说我有一个大小为 50x50 的矩阵。而且我必须移动某些行,比如说 15,18,45.. 到顶部,其余行在底部。我怎样才能在matlab中完成这个?
问问题
11148 次
4 回答
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 回答
2
您是否尝试过 circshift 功能?这样的事情可能会有所帮助:
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 回答
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 回答