Я пишу код, который генерирует функцию f в цикле. Эта функция f изменяется в каждом цикле, например, с f = x + 2x на f = 3x^2 + 1 (случайным образом), и я хочу оценивать f в разных точках каждого цикла. Я пытался использовать subs, eval, matlabFunction и т. д., но он все еще работает медленно. Как бы вы решили подобную проблему наиболее эффективным способом?
Это так быстро, как я был в состоянии сделать это. ****matlabFunction и сабвуферы работают медленнее, чем это. Код ниже - это мое решение, и это один цикл. В моем более крупном коде функция f и точка x0 меняются в каждом цикле, поэтому вы можете себе представить, почему я хочу, чтобы это выполнялось как можно быстрее. Я был бы очень признателен, если бы кто-то мог пройти через это и дать мне какие-либо указатели. Если мой код дерьмовый, не стесняйтесь сказать мне: D
x = sym('x',[2,1]);
f = [x(1)-x(1)cos(x(2)), x(2)-3x(2)^2*cos(x(1))];
J = jacobian(f,x);
x0 = [2,1];
N=length(x0); % Number of equations
%% Transform into string
fstr = map2mat(char(f));
Jstr = map2mat(char(J));
% replace every occurence of 'xi' with 'x(i)'
Jstr = addPar(Jstr,N);
fstr = addPar(fstr,N);
x = x0;
phi0 = eval(fstr)
J = eval(Jstr)
function str = addPar(str,N)
% pstr = addPar(str,N)
% Transforms every occurence of xi in str into x(i)
% N is the maximum value of i
% replace every occurence of xi with x(i)
% note that we do this backwards to avoid x10 being
% replaced with x(1)0
for i=N:-1:1
is = num2str(i);
xis = ['x' is];
xpis = ['x(' is ')'];
str = strrep(str,xis,xpis);
end
function r = map2mat(r)
% MAP2MAT Maple to MATLAB string conversion.
% Lifted from the symbolic toolbox source code
% MAP2MAT(r) converts the Maple string r containing
% matrix, vector, or array to a valid MATLAB string.
%
% Examples: map2mat(matrix([[a,b], [c,d]]) returns
% [a,b;c,d]
% map2mat(array([[a,b], [c,d]]) returns
% [a,b;c,d]
% map2mat(vector([[a,b,c,d]]) returns
% [a,b,c,d]
% Deblank.
r(findstr(r,' ')) = [];
% Special case of the empty matrix or vector
if strcmp(r,'vector([])') | strcmp(r,'matrix([])') | ...
strcmp(r,'array([])')
r = [];
else
% Remove matrix, vector, or array from the string.
r = strrep(r,'matrix([[','['); r = strrep(r,'array([[','[');
r = strrep(r,'vector([','['); r = strrep(r,'],[',';');
r = strrep(r,']])',']'); r = strrep(r,'])',']');
end
matlab
к своему вопросу. - person Robert Dodier   schedule 12.01.2016