6 views (last 30 days)

Hello!

I was wondering if the following is possible using anonymous functions. I am fairly new to them and this is not for a class - just FYI.

Let N >= 2 specify the number of mixture components I would like to build into my anonymous function. Let's say I want each component to be a Normal Distribution. I have three vectors for their weights (w), means (m), and standard deviations (s).

If N = 2 then the anonymous function would look like:

fun = @(x) w(1)/(s(1) *sqrt(2*pi))*exp(-(x-m(1))^2/(2*s(1)^2)) + w(2)/(s(2) *sqrt(2*pi))*exp(-(x-m(2))^2/(2*s(2)^2));

This becomes exceedingly arduous as N grows. It would be preferable to be able to define this function generically so it does not have to get written out.

Is this possible? From research the literature I am only finding examples where the author "hard coded" the function.

However, I could be searching for it incorrectly or missing a specific term.

Any insights would be greatly appreciated.

Stephen Cobeldick
on 26 Jul 2018

Edited: Stephen Cobeldick
on 26 Jul 2018

Your function:

>> w = 1:2;

>> m = 2:3;

>> s = 3:4;

>> fun = @(x) w(1)/(s(1)*sqrt(2*pi))*exp(-(x-m(1))^2/(2*s(1)^2)) + w(2)/(s(2)*sqrt(2*pi))*exp(-(x-m(2))^2/(2*s(2)^2));

>> fun(1)

ans = 0.30183

Vectorized function (simpler):

>> foo = @(x)sum(w./(s.*sqrt(2*pi)).*exp(-(x-m).^2./(2*s.^2)));

>> foo(1)

ans = 0.30183

Vectorized function, with N==4:

>> w = 0:3;

>> m = 3:6;

>> s = 6:9;

>> foo = @(x)sum(w./(s.*sqrt(2*pi)).*exp(-(x-m).^2./(2*s.^2)));

>> foo(1)

ans = 0.25397

When you write vectorized code you can give it arrays of any size and it will work. Any time you find yourself copy-and-pasting code then you are doing something wrong.

Sign in to answer this question.

Opportunities for recent engineering grads.

Apply Today
## 0 Comments

Sign in to comment.