# Obscure Matlab function #1: bsxfun

Here’s a first in what might become a regular feature on xcorr: an exposition of some of Matlab’s obscure but quite useful functions. Today’s function: bsxfun. The Matlab documentation states that bsxfun’s function is to:

Apply element-by-element binary operation to two arrays with singleton expansion enabled

This is not a very helpful definition. What bsxfun(@op,A,B) does is virtually expand A and B to a common size op(Abig,Bbig). It obviates the need for repmat and outer products in most scenarios. For example, to center the columns of X, you might use:

`X = X - repmat(mean(X),size(X,1),1);`

Or:

`X = X - ones(size(X,1),1)*mean(X);`

Internally this constructs the intermediate matrix on the right hand side, which is wasteful. bsxfun can be used to center the columns of a matrix without intermediate matrices:

`X = bsxfun(@minus,X,mean(X));`

How bsxfun virtually replicates matrices is straightforward. In the previous example, the A matrix as size MxN, while the B matrix has size 1xN. bsxfun virtually expands matrix B along its dimensions of size 1 (the singleton dimensions). to match the dimensions of A.

Another example: construct the matrix of size MxM: [1,2,3,…;0,1,2,…;-1,0,1,…]:

`themat = bsxfun(@minus,(1:M),(0:M-1)');`

1. Mikhail says: