我必须在matlab中移动某些行。就像我说有一个大小为50x50的矩阵。我必须转移某些行,让15,18,45 ..到顶部,剩下的行在底部。我怎样才能在matlab中实现这个目标?
答案 0 :(得分: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
答案 1 :(得分: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
答案 2 :(得分: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
答案 3 :(得分: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