Подтвердить что ты не робот

Удалить столбец из матрицы в GNU Octave

В GNU Octave я хочу убрать отдельные столбцы из матрицы. В интересах общности. Я также хочу иметь возможность удалять определенные строки из матрицы.

Предположим, что у меня есть это:

mymatrix = eye(5)

mymatrix =

Diagonal Matrix

   1   0   0   0   0
   0   1   0   0   0
   0   0   1   0   0
   0   0   0   1   0
   0   0   0   0   1

Я хочу удалить столбцы 2 и 4, но когда я удаляю столбец 2, позиция столбца 4 переместилась в столбец 3, и это заставляет мою голову болеть. Должен быть лучший способ!

4b9b3361

Ответ 1

GNU Octave удаляет столбцы 2 и 4 из матрицы

mymatrix = eye(5); 
mymatrix(:,[2,4]) = []; 
disp(mymatrix)

Печать:

1   0   0
0   0   0
0   1   0
0   0   0
0   0   1

GNU Octave удаляет строки 2 и 4 из матрицы:

mymatrix = eye(5); 
mymatrix([2,4],:) = [];
disp(mymatrix) 

Печать:

1   0   0   0   0
0   0   1   0   0
0   0   0   0   1

Сложность времени

Сложность октавного процессора GNU для нарезки и трансляции здесь - это быстрое линейное время O(n * c) где n - количество строк и приблизительно постоянное число оставшихся строк. Это C-уровень одноядерный векторизация, но не параллельно.

Сложность памяти

Сложность рабочей памяти линейна: O(n * 2) C создает клон из двух объектов, перебирает каждый элемент, а затем удаляет оригинал.

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

Ответ 2

Если вы не знаете точное количество столбцов или строк, вы можете использовать волшебный индекс "конец", например:

mymatrix(:,2:end)  % all but first column

mymatrix(2:end,:)  % all but first row

Это также позволяет вам вырезать строки или столбцы из матрицы без необходимости переназначения их новой переменной.

Ответ 3

Обратный способ:

columns_you_want_to_keep = [1, 3, 5]
new_matrix = my_matrix(:,columns_you_want_to_keep)

Ответ 4

Как удалить несколько столбцов в октаве:

Как удалить столбцы 2 и 4:

columns_to_remove = [2 4];
matrix(:,columns_to_remove)=[]

Illustrated:

mymatrix = eye(5)
mymatrix =

   1   0   0   0   0
   0   1   0   0   0
   0   0   1   0   0
   0   0   0   1   0
   0   0   0   0   1



columns_to_remove = [2 4];

mymatrix(:,columns_to_remove)=[]


mymatrix =

   1   0   0
   0   0   0
   0   1   0
   0   0   0
   0   0   1