[英]Number of outputs from constant anonymous function (anonymous function not known a priori)
這個問題最初看起來可能與此其他問題相似,但我的情況有所不同。
我有一個函數'deriv',它使用一個符號表達式作為輸入,然后使用該符號表達式的一階導數。 然后,使用matlabFunction()
導數轉換為匿名函數,然后對點數組進行求值。 稍后,我還將在其他一些代碼中使用匿名函數。
我遇到的問題是,有時輸入符號表達式恰好是線性的,因此導數是常數。 因此匿名函數也是一個常量。 當我對點數組評估匿名函數時,僅獲得一個輸出而不是輸出數組。
這是一些代碼,顯示我在做什么。 為了簡化起見,讓我們假設符號輸入表達式僅包含一個稱為q
符號變量。
function[derivFun,derivVals] = deriv(input)
derivSym = diff(input,q);
derivFun = matlabFunction(derivSym,'vars',q);
evalPoints = [1;2;3;4;5]; %in my true application, a much larger array
derivVals = derivFun(evalPoints);
end
因此,如果輸入為q^2
,則輸出derivVals
將為[2; 4; 6; 8; 10]。 但是,如果輸入恰好是3*q
,則derivVals
將為3(只是一個標量)。 我想要的是derivVals
為[3; 3; 3; 3; 3]。 也就是說,我想derivVals
是大小相同evalPoints
即使輸入功能恰好是線性的(或恆定)。 而且我不提前知道輸入表達式是什么。
任何人都可以提出建議的方案嗎? 我知道常量匿名函數將僅返回單個常量標量,而不管其輸入的大小如何。 我希望找到一種方法來識別匿名函數derivVals
定,然后仍然使derivVals
與evalPoints
大小相同。
我知道我可以使用for
循環來評估derivFun
的每一行的evalPoints
,但是我想盡可能避免使用這樣的循環。
感謝您的時間和考慮。
不是100%確定我正確地得到了問題。 這樣可以解決您的問題嗎?:
if isscalar(derivVals)
derivVals = repmat(derivVals, size(evalPoints));
end
我認為這是一個稍微簡單的解決方案。 問題是您使用的是matlabFunction
,它簡化了方程式,並且不允許太多自定義。 但是,您可以創建匿名函數的匿名函數。 只需在您的matlabFunction
行之后添加matlabFunction
行:
derivFun = @(evalPoints)derivFun(evalPoints)+zeros(size(evalPoints));
這只會對原始derivFun
一次評估。 但是,我確實喜歡您的symvar
解決方案(請記住,添加zeros
始終比乘以ones
更好)。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.