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

时间:2016-11-07 13:25:09

标签: matlab symbolic-math

我可以控制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。
我希望这对我上面提到的问题有所帮助。

2 个答案:

答案 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);

其中Xsym对象,sprivate属性。

顾名思义,函数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.

正如您所看到的,它没有说明格式化字符串。

因此,简而言之,您可以执行以下操作:

  1. 您必须更改工具箱代码
  2. 写一个这样的显示包装器:

    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
    

    但是,这很快就会变得非常丑陋,过于具体和不便携。