Matlab 控制符号表达式的输出顺序

Matlab 控制符号表达式的输出顺序,matlab,symbolic-math,Matlab,Symbolic Math,我可以控制MATLAB符号表达式的输出顺序吗 例如: syms x y f=y*x MATLAB通常会返回: f= x*y 但我想得到: f= y*x 我使用的是MatlabR2012B。我该怎么做 新编辑2016/11/9 我昨天发现了这些,我觉得很奇怪: 根据R2008a %%feedback.m function H=feedback(G1,G2,key) if nargin==2 key=-1; end H=G1/(sym(1)-key*G1*G

我可以控制MATLAB符号表达式的输出顺序吗

例如:

syms x y  
f=y*x   
MATLAB通常会返回:

f=  
x*y  
但我想得到:

f=  
y*x 
我使用的是MatlabR2012B。我该怎么做

新编辑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不行。
我希望这可能对我上面所问的问题有所帮助。

我实际上找到了似乎能完全回答这个问题的答案。尽管这是对另一个问题的回答

请注意,我引用了答案,但我不会将其放在引号块中以增强可读性:


我相信它是根据等式中变量名的ASCII值按字母顺序排列的。根据for
solve
,用于在不提供输出变量名称的情况下解析方程。
sym/symvar
的帮助表明,它以字母顺序返回变量(通过调用来执行相同的操作,尽管它没有这样说)。如果查看solve.m的实际代码(在命令窗口中键入
edit solve
),并检查名为
assignOutputs
(R2012b中的第190行)的子函数,您将看到它调用了,并且有关于词典顺序的注释

R2012b(可能更早)中的文档与R2013a中的文档在某种程度上不同,这似乎与您的问题有关。在R2013a中:

如果显式指定自变量
vars
,则解算器使用相同的顺序 返回解决方案


我仍在运行R2012b,因此无法确认这种不同的行为。

不确定这是否适用于R2012b,但在我的R2010a上,类
sym
有一个
disp
方法,在显示小函数(当然还有所有
sym
对象)时运行该方法。以下是相关代码:

allstrs = mupadmex(X.s,0);
allstrs = strrep(allstrs,'MLVar','');
disp(allstrs);
其中,
X
sym
对象,
s
是其
私有
属性

函数
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
    
    但是,这很快就会变得非常复杂、过于具体和不可移植


  • 这不是问题所在,但为什么要使用4,5年前的MATLAB版本?这将导致许多不推荐使用的函数和与新版本的兼容性问题。@Adrian:不幸的是,这是事实:老实说,这是工具的一个现实,它让我远离了它——MATLAB并没有考虑到长期的支持。就像:每一个新版本似乎都有一些东西至少会破坏一些旧代码。有时候,非常糟糕。大多数其他语言至少提供了跨版本向后兼容性的某种保证。这也是我大部分时间仍在使用MATLAB R2010a的部分原因,因为我的公司确实启动了需要长期支持的项目,而这些项目在至少2年内不会使用R2010a完成。如果你只是想逆转排序,请参阅我找到的答案。如果你想做更复杂的事情,我怀疑会有一个简单的方法。(因为任何解决方案显然都应该适用于所有可能的情况)。@Adriaan我完全同意Rody Oldenhuis的观点。MATLAB每半年有一个新版本。最令人恼火的是,新版本总是有很大的变化。有时它甚至会改变我以前使用的功能。这简直让我发疯……@Sam.X。示例中变量的顺序是如何“控制”的?对我来说,这看起来很随机,首先是G2 G3,在另一个地方是G3 G2,我喜欢这种创意,但我认为这个特定的显示包装只是一个例子,可能适用于所有情况,也可能不适用于所有情况。(最后一行已经暗示了这一点,但明确的警告似乎是个好主意)我没有试着测试它,但是我可以想象,当你有复杂的表达式,比如a乘以b到c次幂时,会发生一些奇怪的事情d@DennisJaheruddin事实上,这一个是特定于OP的用例的,这可能是不够的,也可能是不够的。无论如何,我强烈建议不要这样做,但在某些情况下,糟糕的建议是唯一可能的建议。@Rody Oldenhuis:我认为更改工具箱代码可能有风险,所以我更喜欢第二种解决方案。但是仍然存在一个问题:在使用disp_sym函数之后,我发现这个函数只是反向显示表达式,但是在MATLAB中没有保存变量。我想要的是:在使用(自定义)函数后,MATLAB可以保存一个sym变量,例如,它的值是y*x。这可能吗???@Sam.X。。。但是
    y*x==x*y
    ?那么,除了它的显示方式,您还想更改什么?@Sam.X。这与“控制输出顺序”是完全不同的问题,因为这也意味着AB+BA不应简化。由于这是一个不同的问题,我建议你仔细思考你想要什么,并在一个新问题中清楚地描述它。如果你认为这里写的问题被回答,考虑接受任何答案(或者如果你认为这里写的问题对未来的访问者毫无意义,考虑删除它)。另外请注意,您可以定义合成矩阵,以防这是您实际需要的。我知道这可能和我的问题有关,但我还是不明白。首先,我没有使用solve函数。我确实看到了上面提到的子功能,