Это характер работы matlabFunction
. Если вы предоставляете уравнение, которое не имеет независимых переменных в качестве части уравнения, оно по умолчанию предоставляет анонимную функцию без ввода и дает скалярный результат.
Например:
>> syms r s;
>> p = r^3;
>> dpds = diff(p,s);
>> dpdsFunc = matlabFunction(dpds)
dpdsFunc =
@()0.0
Это даст вам только одно значение, скалярное каждый раз. Это также относится к любой скалярной функции, которая дает ненулевой вывод. Если вы хотите переопределить это поведение и указать переменную длину этого скаляра, которая зависит от длины ввода, вы можете сначала определить, есть ли какие-либо входные переменные в функции, проверив, сколько там переменных. Вы можете использовать для этого symvar
. Вы проверили бы, имеет ли этот массив длину 0, и если это произойдет, вы переопределите эту функцию.
Нечто подобное приходит на ум:
syms r s;
p = r^3;
dpds = diff(p,s);
if numel(symvar(dpds)) == 0
dpdsFunc = @(s) ones(size(s))*double(dpds); %// Thanks Daniel!
else
dpdsFunc = matlabFunction(dpds);
end
Это должно добиться того, что вы хотите.
Minor Примечание
Я на самом деле думаю, что эта переменная длина бизнеса нулей является то, что должно быть введено в MATLAB по умолчанию, а не по умолчанию к одному значению. Это делает код векторизации намного проще. Я соблазн представить в MathWorks запрос на функцию в будущем.
Ваш фактический код для этого? Вы не должны получать нули для 'dp/ds'. – rayryeng
Diff (p, s) является скалярным нулем, а не переменным размером 0. – Tobias
Повторяю. Где ваш фактический код для этого? – rayryeng