If statement 若数组1中的元素大于数组2中的元素,则
我刚开始使用fortran,我对if语句有一些问题。我试着写一些东西,如果数组1中的元素大于数组2中的元素,那么让h=some表达式,否则h=0。我已经在下面修改了我的密码If statement 若数组1中的元素大于数组2中的元素,则,if-statement,fortran,If Statement,Fortran,我刚开始使用fortran,我对if语句有一些问题。我试着写一些东西,如果数组1中的元素大于数组2中的元素,那么让h=some表达式,否则h=0。我已经在下面修改了我的密码 DO I=1,NPOIN IF ((X(I)*COS(0.0)+0.0*Y(I)*COS(0.0)+0.1)*0.15 .GT. ZF(I)) THEN H%R(I) =0.15*((X(I)*COS(0.0))+(0.0*Y(I)*COS(0.0))+0.1) ELSE H%R(I) =
DO I=1,NPOIN
IF ((X(I)*COS(0.0)+0.0*Y(I)*COS(0.0)+0.1)*0.15 .GT. ZF(I)) THEN
H%R(I) =0.15*((X(I)*COS(0.0))+(0.0*Y(I)*COS(0.0))+0.1)
ELSE
H%R(I) = 1
ENDIF
ENDDO
我得到的错误是:
IF ((X(I)*COS(0.0)+0.0*Y(I)*COS(0.0)+0.1)*0.15 .GT. ZF(I)) THEN
Error: Syntax error in IF-expression at (1)
如果这是很明显的事情,我表示歉意,但到目前为止,我已经尝试了各种方法来解决它,但没有任何乐趣。任何帮助都将不胜感激
可能有更好的方法来比较这两个数组,但实际上我尝试将ZF作为我的主数组,但是当H大于ZF时,我希望将ZF值替换为H值。所以本质上我有一个新的数组,在两个数组之间有可能的最大值
提前感谢可能有更好的方法来比较这两个阵列,但实际上我尝试将ZF作为我的主阵列,但是当H大于ZF时,我希望用H值替换ZF值。所以本质上我有一个新的数组,在两个数组之间有可能的最大值
如果h
和zf
具有相同的形状,您可以简单地编写:
where (h>zf)
zf = h
end where
如果它们的形状不一样,请说明你想做什么
(现代)Fortran是一种数组语言(达到一级近似值),因此请考虑整个数组操作,而不是循环。它们可能更快,更可能不是,但它们写得更快,更容易理解。如果性能不够好,请考虑执行循环替换。表达式编译得很好。。。我假设
real::X(NPOIN),Y(NPOIN),ZF(NPOIN),R(NPOIN)
并交换了'H%R'->'R'。也许还有别的地方出了问题。你能发布一些可编译的东西吗?这个表达式--(X(I)*COS(0.0)+0.0*Y(I)*COS(0.0)+0.1)
--在你的代码中出现两次,可以简化为X(I)+0.1
。我不认为这些额外的术语是你报告的问题的根源,但它们妨碍了你和我们努力理解正在发生的事情。摆脱它们。如果使用固定源格式,请确保不要超过第72列。请阅读Fortran 90及更高版本语言中的MERGE语句。甚至zf=MAX(zf,h)
?性能可能比where
结构更差,但它的意图可能更清晰。@francescalus:是的,你的方式更好。