我正在将符号表达式从Matlab导出到Fortran。请考虑以下示例
>> syms a b c d real;
>> expr=(a+b+c)+(a+b+c)^2+(a+b+c)^3+(a+b+c)^4+(a+b+c)^5+(a+b+c)^6+(a+b+c)^7+(a+b+c)^8+(a+b+c)^9+(a+b+c)^10+(a+b+c)^11+(a+b+c)^12;
>> fortran(expr)
Matlab的输出是:
t0 = a+b+c+(a+b+c)**2+(a+b+c)**3+(a+b+c)**4+(a+b+c)**5+(a+b+c)**6+
&(a+b+c)**7+(a+b+c)**8+(a+b+c)**9+(a+b+c)**10+(a+b+c)**11+(a+b+c)**
&12
这对Fortran的所谓“固定形式”来说是正常的,其中在每行的开头出现一个&符号。但是,Fortran的“自由格式”或自由格式也需要在每行末尾加上&符号,即
t0 = a+b+c+(a+b+c)**2+(a+b+c)**3+(a+b+c)**4+(a+b+c)**5+(a+b+c)**6+&
&(a+b+c)**7+(a+b+c)**8+(a+b+c)**9+(a+b+c)**10+(a+b+c)**11+(a+b+c)**&
&12
当使用非常大的表达式时,这显然很烦人,因为要么在每行的末尾手动放置每个&符号,要么制作一个shell脚本来执行它。是否有任何Matlab输出以我展示的最新格式导出表达式?
答案 0 :(得分:1)
自由形态中不需要连续线上的&符号。您可以使用简单的字符串替换来解决此问题:
ee=(a+b+c)+(a+b+c)^2+(a+b+c)^3+(a+b+c)^4+(a+b+c)^5+(a+b+c)^6+(a+b+c)^7+(a+b+c)^8+(a+b+c)^9+(a+b+c)^10+(a+b+c)^11+(a+b+c)^12;
fstring=fortran(ee)
t0 = a+b+c+(a+b+c)**2+(a+b+c)**3+(a+b+c)**4+(a+b+c)**5+(a+b+c)**6+ +(a+b+c)**7+(a+b+c)**8+(a+b+c)**9+(a+b+c)**10+(a+b+c)**11+(a+b+c)** +12
strrep(fstring,[char(10) ' +'],[' &' char(10)])
t0 = a+b+c+(a+b+c)**2+(a+b+c)**3+(a+b+c)**4+(a+b+c)**5+(a+b+c)**6+ & (a+b+c)**7+(a+b+c)**8+(a+b+c)**9+(a+b+c)**10+(a+b+c)**11+(a+b+c)** & 12
注意我的matlab使用了' +'对于固定形式的延续标记。你必须在结尾使用一个&符号以获得自由形式。
你也可以摆脱延续:
strrep(fstring,[char(10) ' +'],'')
t0 = a+b+c+(a+b+c)**2+(a+b+c)**3+(a+b+c)**4+(a+b+c)**5+(a+b+c)**6+(a+b+c)**7+(a+b+c)**8+(a+b+c)**9+(a+b+c)**10+(a+b+c)**11+(a+b+c)**12
对于合理数量的代码我会这样做,然后根据需要手动插入换行符。 (标准自由形式有130个字符/行限制)