最可能数(MPN)函数是一种根据样本数(x
)和大小(n
)估算种群大小或浓度(v
)的方法包含至少一个人(p
)。典型的输入可能是:
n = 10 % total number of sample replicates
p = 8 % number of replicates with >=1 individual
v = 0.1 % Sample quantity (unit not specified)
如果输入是标量,则可以通过求解方程或使用内置Matlab函数fzero
找到零根来获得解决方案:
f = @(x) v*n - (v*p)/(1-exp(-v*x)) % The basic MPN equation
solve_range = [1e-3,1e3]; % Range of iteration values
mpn = fzero(f, solve_range)
返回1.6094
。解算器很有用,因为通常有多个输入(例如,p
是[8,9,7 ... i]),对于这种情况,必须满足所有这些输入才能解决该值:
f = @(x)...
v(1)*n(1) - (v(1)*p(1))/(1-exp(-v(1)*x)) + ...
v(2)*n(2) - (v(2)*p(2))/(1-exp(-v(2)*x)) + ...
...
v(end)*n(end) - (v(end)*p(end))/(1-exp(-v(end)*x))
通常,数组的长度为3或5,并且几乎总是<10,因此用变量和索引写出长函数并不合理。
但是,我正在尝试扩展函数以处理长度> gt;&gt; 100的数组,并且传递给fzero
的函数必须灵活处理未知的输入长度。
我一直在寻找一种简单的方法来做到这一点。由于没有运气,我做了一个不优雅的解决方法,根据输入的数量写入一个字符串(用regexprep
替换变量索引),然后我将字符串转换为一个函数使用内置功能inline
。
我希望有人知道一种聪明的方法来创建一个可以灵活接受变量和大输入长度的函数。我和#39; ve查看了递归并使用嵌套的匿名函数工作,但我无法找到解决方案。
n.b:我使用的是早期版本的MatLab(v7,R2011b)。
答案 0 :(得分:0)
看起来你只需要vectorize你的目标函数。据我所知,n
,p
和/或v
参数可以是向量(如果它们是非标量的,我假设它们具有相同的维度)。您可以使用element-wise operations和sum
n = ...
p = ...
v = ...
f = @(x)sum(v.*n-v.*p./(1-exp(-v.*x)));
...
如果您的目标是找到多个根(使用solve_range
的不同初始猜测)或找到不同方程的根(n
,p
和v
的实例),然后你需要将fzero
调用包裹在for
循环中。