簡體   English   中英

恆定匿名函數(先驗未知的匿名函數)的輸出數量

[英]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定,然后仍然使derivValsevalPoints大小相同。

我知道我可以使用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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM