matlab内联函数与参数条件

时间:2014-09-15 16:20:09

标签: matlab inline

人,

我想知道是否有可能将r的以下函数编写为matlab中的内联函数。我试图将条件作为单独的因子包括在内,例如*(r> a),当r为0时,由于1 / r ^ 3的除法,我得到了NaN。

function of r

3 个答案:

答案 0 :(得分:2)

首先,您尚未说明r = 0实际应该发生什么。在数学上,术语得到无穷大。我认为你宁愿把它设置为。那r = a会发生什么?只是另一个定义不明确的案例,你确定你的公式是正确的吗?

如果您有统计工具箱,则可以使用nansum。如果没有,我会说没有办法编写类似于nansum的自己的函数,这是无法内联完成的。

r = -5:1:5;
a = 1; 
R = 42; %// rest of your function

%// not working, or removing of nan afterwards required
X = @( r ) (r>=a).*(a./r).^3*R;

%// inline solution with statistics toolbox
Y = @( r ) arrayfun(@(x) nansum( (x>=a)*(a/x)^3*R ), r);

output =  [X(r)' Y(r)']

nansum没有矢量化,如果您仍然想将它用于矢量将其包装到arrayfun中。


nansum的代码完全符合评论(output(isnan(output))=0)中的建议,我可能不允许将其复制并粘贴到此处。它过滤掉所有NaN,然后对输入求和。使用open nansum获取洞察力。


正如Jigg所指出的那样,像nanmean这样的类似功能也可以解决这个问题。

答案 1 :(得分:2)

我想出一个简单的方法。它基本上是Shai和Jigg所建议的,即使用额外的乘法因子(r> a)。

为了摆脱NaN,我们只需要将eps添加到1 / r3的分母,即

 1/(r+eps)^3 *(r>a)

答案 2 :(得分:0)

你可以尝试

chi = 1; %// arbitrary value
a = 1; %// arbitrary value
theta = pi/3; %// arbitrary value
nu = @( r ) (r>a).*( (chi/3).*((a.^3)./(r.^3)).*(3*cos(theta).^2 -1);