我可以控制MATLAB符号表达式的输出顺序吗?
例如:
syms x y
f=y*x
MATLAB通常会返回:
f=
x*y
但我想得到:
f=
y*x
我使用的是MATLAB R2012b。我怎么能这样做?
NEW EDIT 2016/11/9
我昨天发现了这些,对我来说似乎很奇怪:
根据R2008a
%%feedback.m
function H=feedback(G1,G2,key)
if nargin==2
key=-1;
end
H=G1/(sym(1)-key*G1*G2);
H=simple(H);
%%matlab command window
syms G1 G2 G3 G4 G5 G6 H1 H2 H3 H4
c1=feedback(G4*G5,H3);
c2=feedback(G2*G3,H2);
c3=feedback(c1*c2,H4/G2/G5);
G=feedback(c3*G1*G6,H1);
pretty(G)
MATLAB返回
G=
G3 G2 G4 G5 G1 G6/(1 + G2 G3 H2 + G4 G5 H3 + G4 G5 H3 G2 G3 H2 + G4 G3 H4 + G3 G2 G4 G5 G1 G6 H1)
不幸的是,我的R2008a没有符号数学工具箱(我多次尝试重新安装,不起作用)。因此,我无法验证它是否属实。我想如果2008a可以做到,为什么不能2012b。
我希望这对我上面提到的问题有所帮助。
答案 0 :(得分:0)
我实际上发现an answer by @horchler似乎完全回答了这个问题。尽管它是作为对不同问题的答案而给出的。
请注意,我引用了答案,但我不会将其放在引用块中以增强可读性:
我认为它是基于方程中变量名的ASCII值的字母顺序排列的。根据{{1}}的{{3}},documentation用于在不提供输出变量名称的情况下解析方程式。 solve
的帮助表示它返回sym/symvar
中的变量,即按字母顺序排列lexicographical order,即使它没有这样说,也可以调用{{3} }})。如果你查看solve.m的实际代码(在命令窗口中输入sym/symvar
)并检查名为edit solve
的子函数(R2012b中的第190行),你会看到它生成致电symvar
,并且有关于字典顺序的评论。
在R2012b(可能更早)中,文档与R2013a的文档不同,其方式似乎与您的问题相关。在R2013a中,setdiff
:
如果明确指定自变量
assignOutputs
,则求解器使用相同的顺序 返回解决方案。
我还在运行R2012b,所以我无法确认这种不同的行为。
答案 1 :(得分:0)
不确定这是否适用于R2012b,但在我的R2010a上,班级sym
有一个disp
方法,该方法在显示您的小功能时运行(当然,所有sym
对象)。以下是相关代码:
allstrs = mupadmex(X.s,0);
allstrs = strrep(allstrs,'MLVar','');
disp(allstrs);
其中X
是sym
对象,s
是private
属性。
顾名思义,函数mupadmex()
是MEX二进制文件。相应的M代码包含:
% MUPADMEX(STMT) executes STMT in MuPAD. STMT must be a string or cell
% array of strings. A cell array is converted into a MuPAD matrix or array.
% Y = MUPADMEX(STMT) executes STMT in MuPAD and returns the result as
% sym object Y. STMT must be a string or cell array of strings. If STMT
% is a cell Y is a string reference instead of a sym.
% Y = MUPADMEX(FCN,ARG1,ARG2, ...) evaluates FCN(ARG1,ARG2,...). The inputs
% must be strings.
% Y = MUPADMEX(... ,0) returns Y as a string instead of a sym.
% Y = MUPADMEX(REF ,1) adds REF to the garbage list.
% Y = MUPADMEX(STMT,2) frees any garbage.
% Y = MUPADMEX(VAL ,3) formats VAL as 'symr'.
% Y = MUPADMEX(VAL ,4) formats VAL as 'symfl'.
% Y = MUPADMEX(VAL ,5) toggles the trace feature. VAL must be 'on' or 'off'.
% Y = MUPADMEX(STMT,6) resets MuPAD.
% Y = MUPADMEX(VAL ,7) toggles the pretty-print feature.
% Y = MUPADMEX(VAL ,8) sets the complex unit. VAL is 'I' or 'sqrtmone'.
% Y = MUPADMEX(... ,9) returns Y as a logical instead of a sym.
% Y = MUPADMEX(VAL ,10) toggles the synchronous evaluation mode (out-of-process kernel only).
% Y = MUPADMEX(... ,11) returns Y as a string reference.
% Y = MUPADMEX(VAL ,12) print out memory usage
% Y = MUPADMEX(VAL ,13) toggles lazy evaluation mode
% Y = MUPADMEX(VAL ,14) evaluates all the lazy statements
% [Y,STATUS] = ... sets STATUS to 0 if the command completes without error
% and otherwise sets STATUS to 1 and Y to the error string.
正如您所看到的,它没有说明格式化字符串。
因此,简而言之,您可以执行以下操作:
写一个这样的显示包装器:
function disp_sym(X)
str = evalc('X');
str = regexp(str, '=', 'split');
fml = strtrim(str{2});
eq = str{1};
fml = regexp(fml, '*', 'split');
fml = fml(end:-1:1);
disp( [eq '=' sprintf('%s*', fml{1:end-1}) fml{end}]);
end
但是,这很快就会变得非常丑陋,过于具体和不便携。