[英]matlab inline function with argument conditions
鄉親,
我想知道是否有可能將r的以下函數編寫為matlab中的內聯函數。 我試圖將條件作為一個單獨的因素包括在一起,例如*(r> a),當r為0時,由於1 / r ^ 3的除法,我得到了NaN。
首先,你沒有說明如果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
這樣的類似功能也可以解決問題。
我可以用一個簡單的方法。 這基本上是Shai和Jigg所建議的,即使用額外的乘法因子(r> a)。
為了擺脫NaN,我們只需要將eps添加到1 / r3的分母,即
1/(r+eps)^3 *(r>a)
你可以試試
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);
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.