конвертировать строки в символические выражения, соблюдая рабочее пространство - PullRequest
0 голосов
/ 28 мая 2018

Matlab может преобразовать строку в символическое выражение, но здесь я хочу, чтобы строка интерпретировалась в соответствии со значениями, известными в рабочей области:

syms x y
y = x;
sym('x + y')  % depending on version, use "sym(", "str2sym(" or "evalin(symengine,"
ans =
x + y

Как кодировать для вывода x + x или2 * x?

Другой пример:

syms x y
y = x;
z = sym('a + y')

как изменить код, чтобы получить z = a + x?

Основная проблема, кажется, что sym (string) просто не знает прошлого (не принимая во внимание то, что было определено ранее) и будущего (не объявляя свои переменные как syms - как это могло быть?)

Я думаю, что простой парсер выражений мог бы это сделать: проверьте, существует ли переменная в строке в рабочей области, и объявите ее как символическую, если нет.

1 Ответ

0 голосов
/ 28 мая 2018
function y = str2syms(symstr)
%STR2SYMS evaluates symstr where symstr is a string 
% representing a symbolic expression.
% Additionally to str2sym, str2syms declares unknown variables
% as symbolic in the caller workspace.
%
% Example:
% syms x y
% y = x;
% z = str2syms('a + y')
% creating symbolic variable a
% z =
% a + x

% very simple tokenizer to find variables
vars = strread(symstr,'%s','delimiter',',:;= ()^*/+-.0123456789@');
% collect all known variables
W = evalin('caller','whos'); %or 'base'
for i = 1:numel(vars)
    v = vars{i};
    if ~isempty(v)
        % create symbolic variable if not already known
        if ~ismember(v,[W(:).name]) & ~exist(v)
        %if ~exist(v)
            disp(['creating symbolic variable ', v])
            assignin('caller', v, sym(v));
        end
    end
end
% convert (single) = to ==
ieq = strfind(symstr,'=');
if ieq
    symstr = [symstr(1:ieq),'=',symstr(ieq+1:end)];
end
% evaluate
y = evalin('caller', symstr);

Загружено на обмен файлами https://de.mathworks.com/matlabcentral/fileexchange/67519-str2syms-symstr-

...