2011-11-26 108 views
1

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

对于简单的例子,让我们有一个10×10矩阵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];

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

感谢您的帮助!

回答

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

和正如@yoda所说,要删除这些行:

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

用'A([false(3,1); A(4:end,3)> 600],:)= []';删除行。 – abcd

0

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

要回答你的问题,你需要一个更小的矩阵,以取代矩阵。是这样的: A = new_matrix

new_matrix仅由带你想要的行产生了A的。

new_matrix = A(row_indices,:)

哪里row_indices是你想保留指数的载体。为了建立起来,你可以从一个零向量向量开始并应用find(这将产生带有一个的索引)。因此,我们希望:

row_indices =找到([1,1,1,A(4:结束,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 

BTW,改变这些行的人也很容易:

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

谢谢大家的帮助和努力,问题解决了 – Martin

相关问题