Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/fortran/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
将符号表达式从Matlab导出到Fortran时使用自由形式而不是固定形式_Matlab_Fortran - Fatal编程技术网

将符号表达式从Matlab导出到Fortran时使用自由形式而不是固定形式

将符号表达式从Matlab导出到Fortran时使用自由形式而不是固定形式,matlab,fortran,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+

我正在将符号表达式从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“固定格式”来说是正常的,其中每行的开头都会出现一个符号AND。但是,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的输出以我展示的最新格式导出表达式

自由形式不需要续行上的符号。您可以通过简单的字符串替换来解决此问题:

 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)

对于合理数量的代码,我会这样做,然后根据需要手动插入换行符。(标准自由形式有130个字符/行的限制)

我认为这不一定是个坏问题,但最好澄清一下,以避免被否决。我假设您正在寻找一种方法,如何从MATLAB导出自由源代码形式的Fortran,而不是固定形式的Fortran?还可以展示您是如何进行导出的,以及一个使用符号的代码示例。我假设您需要自由格式(.f90),因为源代码的其余部分是自由格式的,对吗?谢谢您的回答Vladimir。我尝试导出以下符号行:>>ans=((D33-1)^2*(E11^2*+2*…通过使用fortran(expr),我得到,>>((D33-1.0D0)…*2-&E11*E2..**2*E2&**2*n..E22**2*E,即,符号位于每行的开头,而不是在开头和结尾。我忽略了它属于哪种格式,因为我本身不是FORTRAN程序员,但我正在使用它将本构行为合并到fem例程中…希望它是清楚的,并且如果您有任何建议,我将不胜感激。最好!请编辑此问题,无法理解您在评论中的意思。谢谢Vladimir。我已经编辑了此问题。感谢您的回复和建议,但在这种情况下,我认为使用批处理文件(MSDOS see)或shell脚本(UNIX、LINUX、MAC see)更简单在每一行的末尾添加这样的符号。我希望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
 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
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