MATLAB:从矩阵中删除最后一行而不循环

时间:2011-11-26 17:00:48

标签: matlab matrix rows vectorization

我在删除矩阵末尾的剩余行时遇到问题。通常,我需要删除包含特定列中特定元素的行,而不使用循环。这似乎很容易,但我仍然继续得到一些奇怪的结果。

举个简单的例子,让我们有一个10x10矩阵A:

A=[1:10; 901:910; 201:210; 301:310; 701:710; 401:410; 601:610; 501:510; 801:810; 101:110];

我想删除(为了更好地说明只需替换),从第四行到最后一行,其第三列包含的值大于600.结果应如下所示:

|  1     2     3     4     5     6     7     8     9    10|
|901   902   903   904   905   906   907   908   909   910|
|201   202   203   204   205   206   207   208   209   210|
|301   302   303   304   305   306   307   308   309   310|
|  1     1     1     1     1     1     1     1     1     1|
|401   402   403   404   405   406   407   408   409   410|
|  1     1     1     1     1     1     1     1     1     1|
|501   502   503   504   505   506   507   508   509   510|
|  1     1     1     1     1     1     1     1     1     1|
|101   102   103   104   105   106   107   108   109   110|

我的想法是这样的:

A(A(4:end,3)>600,:)=[1];

但结果是一些无意义的矩阵。

感谢您的帮助!

2 个答案:

答案 0 :(得分:1)

 A([false(3,1);A(4:end,3)>600],:)=1;

并且正如@yoda所说,要删除行,请执行以下操作:

 A([false(3,1);A(4:end,3)>600],:)=[];

答案 1 :(得分:0)

首先,您的问题是在矩阵内输入矩阵意味着使用矩阵的值作为索引。因为你的矩阵只有零和1(由于“<”运算符)你得到了一个奇怪的结果。

要回答您的问题,您需要用较小的矩阵替换矩阵。就像是: A = new_matrix

new_matrix是通过仅采用您想要的行来生成的。

new_matrix = A(row_indices,:)

其中row_indices是您要保留的索引的向量。要构建它,你可以从一个零向量开始并应用find(它将产生带有一个的索引)。所以我们想:

row_indices = find([1,1,1,A(4:end,3)。'< 600])

前3个是因为你总是想要前3行。 所以把所有东西放在一起给出了

A = A(find([1,1,1,A(4:end,3).'<600]),:)

在示例值上运行此操作:

>> A=[1:10; 901:910; 201:210; 301:310; 701:710; 401:410; 601:610; 501:510; 801:810; 101:110];
>> A(find([1,1,1,A(4:end,3).'<600]),:)

ans =

     1     2     3     4     5     6     7     8     9    10
   901   902   903   904   905   906   907   908   909   910
   201   202   203   204   205   206   207   208   209   210
   301   302   303   304   305   306   307   308   309   310
   401   402   403   404   405   406   407   408   409   410
   501   502   503   504   505   506   507   508   509   510
   101   102   103   104   105   106   107   108   109   110

顺便说一下,将这些行更改为1就是这么简单:

A(find([0,0,0,A(4:end,3).'>600]),:) = 1