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