在matlab中移动矩阵行

时间:2012-04-15 16:14:57

标签: matlab matrix

我必须在matlab中移动某些行。就像我说有一个大小为50x50的矩阵。我必须转移某些行,让15,18,45 ..到顶部,剩下的行在底部。我怎样才能在matlab中实现这个目标?

4 个答案:

答案 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

如果vec1:n的排列,则此函数将返回一个矩阵,用于置换nxn矩阵1->vec(1), 2->vec(2), ...的行。请注意,没有错误检查等所以在生产代码中使用它需要您自担风险。

在这种情况下,如果A是要置换的矩阵,您可以写:

rowpermat([15, 18, 45, 1:14,16:17,19:44,46:50])*A