将符号表达式从Matlab导出到Fortran

时间:2017-03-29 13:11:48

标签: matlab fortran

我正在将符号表达式从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输出以我展示的最新格式导出表达式?

1 个答案:

答案 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个字符/行限制)