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

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?

-
for loop is always a good start. –  picakhu Nov 29 '11 at 22:12
'for loop' is done :), now need more. I found solution - bsxfun(@minus, X, Y).. –  Mike Chaliy Nov 29 '11 at 22:16
@moderators, pls, close this topic, this mostly exact duplicate of the math.stackexchange.com/questions/5793/… –  Mike Chaliy Nov 29 '11 at 22:18

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

-
In Octave (3.4) this gives an error: a - b error: operator -: nonconformant arguments (op1 is 4x2, op2 is 1x2) –  asmaier Oct 27 '13 at 19:15

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

bsxfun(@minus, X, y);

-
This works also in Octave 3.4 –  asmaier Oct 27 '13 at 19:23

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 ...

-

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 :)

-