To "subtract" two matrices with different dimensions in Octave (Matlab)

11.2k Views Asked by At

I have matrix and need to subtract another matrix element by element on each row. Something like this:

$$ \begin{pmatrix} x_{1} & x_{2}\\ x_{3} & x_{4}\\ \vdots & \vdots\\ x_{n-1} & x_{n}\\ \end{pmatrix} - \begin{pmatrix} y_{1} & y_{2}\\ \end{pmatrix} $$

So end result should be something like:

$$ \begin{pmatrix} x_{1} - y_{1} & x_{2} - y_{2}\\ x_{3} - y_{1} & x_{4} - y_{2}\\ \vdots & \vdots\\ x_{n-1} - y_{1} & x_{n} - y_{2}\\ \end{pmatrix} $$

How to do this? How to do this in Octave, Matlab?

Sorry for noob question. Also would be very kind if you pint me where to read about this.

4

There are 4 best solutions below

2
On BEST ANSWER

With the current version (3.6) of Octave, simply subtracting will work

> a = [1 2; 3 4; 5 6; 7 8]
> b = [1 -1]
> a - b
ans =

   0   3
   2   5
   4   7
   6   9

Edit: Apparently this will also work in Matlab starting with the upcoming release (2016b).

0
On

If your matrices are only two columns, here's a nasty way to do it:

>> a = [1 2; 3 4; 5 6; 7 8]
>> b = [1 -1]

>> [a(:,1)-b(1),a(:,2)-b(2)]
ans =

   0   3
   2   5
   4   7
   6   9

I suspect there's a better way though ...

1
On

Solution from Stackoveflow - https://stackoverflow.com/a/1773119/38975

bsxfun(@minus, X, y);
0
On

The following is also a Kronecker product shortcut and is quite general: Suppose your $X,y_1,y_2$ is in the workspace, then

result = X - kron(ones(size(X,1),1),[y1 y2]);

gives you the ... result :)