Удалить столбец из матрицы в 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, и это заставляет мою голову болеть. Должен быть лучший способ!
Ответы
Ответ 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