55

In GNU Octave, I want to be able to remove specific columns from a matrix. In the interest of generality. I also want to be able to remove specific rows from a matrix.

Suppose I have this:

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

I want to remove columns 2 and 4, but when I remove column 2, the position of column 4 has moved to column 3, and that makes my head hurt. There has to be a better way!

Gordon Gustafson
  • 40,133
  • 25
  • 115
  • 157
Eric Leschinski
  • 146,994
  • 96
  • 417
  • 335

4 Answers4

78

In case you don't know the exact number of columns or rows you can use the magic "end" index, e.g.:

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

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

This also allows you to slice rows or columns out of a matrix without having to reassign it to a new variable.

mpr
  • 3,250
  • 26
  • 44
pors
  • 3,856
  • 36
  • 33
63

GNU Octave delete Columns 2 and 4 from a Matrix

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

Prints:

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

GNU Octave delete Rows 2 and 4 from a Matrix:

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

Prints:

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

Time complexity

GNU Octave's CPU complexity for slicing and broadcasting here is a fast linear time O(n * c) where n is number of rows and c a constant number of rows that remain. It's C level single-core vectorized but not parallel.

Memory complexity

Working memory complexity is linear: O(n * 2) C makes a clone of the two objects, iterates over every element, then deletes the original.

The only time speed will be a problem is if your matrices are unrealistically wide, tall, or have a number of dimensions that blow out your fast memory, and speed is limited by the transfer speed between disk and memory.

Eric Leschinski
  • 146,994
  • 96
  • 417
  • 335
HerrKaputt
  • 2,594
  • 18
  • 17
14

The reverse method of doing this:

columns_you_want_to_keep = [1, 3, 5]
new_matrix = my_matrix(:,columns_you_want_to_keep)
thethakuri
  • 509
  • 5
  • 16
9

How to remove multiple columns in octave:

How to remove columns 2 and 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 
Eric Leschinski
  • 146,994
  • 96
  • 417
  • 335