MATLAB: удалить n последних строк из матрицы без цикла - PullRequest
1 голос
/ 26 ноября 2011

У меня проблема с удалением лишних строк в конце матрицы.В общем, мне нужно удалить строки, которые содержат определенные элементы в определенном столбце, без использования цикла.Это кажется легким, но я все еще продолжаю получать некоторые странные результаты.

Для простого примера, давайте иметь матрицу 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 ]

1 голос
/ 26 ноября 2011
 A([false(3,1);A(4:end,3)>600],:)=1;

и, как сказал @yoda, для удаления строк сделайте:

 A([false(3,1);A(4:end,3)>600],:)=[];
0 голосов
/ 26 ноября 2011

Во-первых, ваша проблема в том, что ввод матрицы внутри матрицы означает использование значений матрицы в качестве индексов. поскольку ваша матрица имеет только нули и единицы (в результате оператора «<»), вы получили странный результат. </p>

Чтобы ответить на ваш вопрос, вам необходимо заменить матрицу на меньшую матрицу. что-то вроде: A = new_matrix

new_matrix генерируется из A, беря только те строки, которые вы хотите.

new_matrix = A (row_indices,:)

Где row_indices - это вектор индексов, которые вы хотите сохранить. Чтобы построить это, вы можете начать с вектора нулей и применить find (который даст индексы с единицами). Итак, мы хотим:

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

Первые 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

Кстати, изменить эти строки на строки так же просто:

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