# Vectorize an anonymous function

4 views (last 30 days)
AES on 11 Aug 2022
Commented: Matt J on 11 Aug 2022
I was wondering whether someone would be able to help/point me in the right direction for vectorizing a anonymous function?
I am trying to fit a multivariate gaussian distribution to data. Here is my code:
for n = 1:length(uniqPosOne)
gaussElpt = @(param) (param(1) + param(2).*(exp(-1/2 .* (uniqPosOne(n, :) - [param(3), param(4)]) * ...
([param(5), param(6); param(6), param(7)]).^(-1) * (uniqPosOne(n, :) - [param(3), param(4)]).')));
a = gaussElpt(startPoint);
tempList(n) = a;
end
I am trying to optimize the parameters that allow for me to fit my data (not shown), I use lsqnonlin.
uniqPosOne is a n x 2 array, params(1) and (2) are offset/gain, params(3) and (4) are vector means, and params(5), (6), (7) are part of covaraince matrix. The params are the parameters used by lsqnonlin to find the parameters with the lowest error.
I want to be able to have a nx2 array (uniqPosOne) and have the function evaluate each pair separately in a vectorized manner, currently I have been unable to do so as attempting vectorization results in a nxn, while I want a nx1.
The main reason is due to time to compute is rather long for a small subset of data. Any help is appreciated.
Walter Roberson on 11 Aug 2022
Or, better yet,
[param(5), param(6); param(6), param(7)] \ (uniqPosOne(n, :) - [param(3), param(4)]).'

Matt J on 11 Aug 2022
Just replace all the uniqPosOne(n,:) with uniqPosOne:
gaussElpt = @(param) (param(1) + param(2).*(exp(-1/2 .* (uniqPosOne - [param(3), param(4)]) * ...
([param(5), param(6); param(6), param(7)]).^(-1) * (uniqPosOne - [param(3), param(4)]).')));
Matt J on 11 Aug 2022
Sigma\dev is the more recommended way of doing inv(Sigma)*dev.

Matt J on 11 Aug 2022
Edited: Matt J on 11 Aug 2022
This FEX submission already appears to do what you want,