edgarmtze
edgarmtze

Reputation: 25038

Matlab's bsxfun() code

What does this do?

u = [5 6];
s = [1 1];
data1    =[randn(10,1) -1*ones(10,1)];
data2    =[randn(10,1) ones(10,1)];
data     = [data1; data2];
deviance = bsxfun(@minus,data,u);  
deviance = bsxfun(@rdivide,deviance,s); 
deviance = deviance .^ 2; 
deviance = bsxfun(@plus,deviance,2*log(abs(s)));
[dummy,mini] = min(deviance,[],2);

Is there an equivalent way of doing this without bsxfun?

Upvotes: 3

Views: 3851

Answers (2)

gnovice
gnovice

Reputation: 125854

The function BSXFUN will perform the requested element-wise operation (function handle argument) by replicating dimensions of the two input arguments so that they match each other in size. You can avoid the use of BSXFUN in this case by replicating the variables u and s yourself using the function REPMAT to make them each the same size as data. Then you can use the standard element-wise arithmetic operators:

u = repmat(u,size(data,1),1);  %# Replicate u so it becomes a 20-by-2 array
s = repmat(s,size(data,1),1);  %# Replicate s so it becomes a 20-by-2 array
deviance = ((data-u)./s).^2 + 2.*log(abs(s));  %# Shortened to one line

Upvotes: 3

abcd
abcd

Reputation: 42225

bsxfun does binary operations element wise. It's useful when you need to subtract a vector (in this case u) from all the elements along a particular dimension in a matrix (in this case data). The dimension along which the operation is being performed must match in both cases. For your example, you can incorporate the code without bsxfun as

u1=repmat(u,size(data,2),1);
deviance=data-u1;

and so on for the other operations.

Upvotes: 2

Related Questions