1

我必须在 matlab 中移动某些行。比如说我有一个大小为 50x50 的矩阵。而且我必须移动某些行,比如说 15,18,45.. 到顶部,其余行在底部。我怎样才能在matlab中完成这个?

4

4 回答 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

如果vec1: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 回答