Fortran95中实现数组值掩膜有哪些替代多条件判断的方法?
Fortran95数组掩膜的替代实现方法
Fortran95提供了多个原生特性可以更简洁地实现数组掩膜需求,无需重复编写冗余的判断逻辑,常用实现方式如下:
- WHERE条件赋值结构(标准原生支持,最推荐)
WHERE是Fortran专门用于数组逐元素条件操作的语法,会自动遍历数组所有元素执行赋值,逻辑和你原有实现完全一致:
! 直接按条件掩膜 WHERE(.NOT. (X == 0 .OR. X == 1 .OR. X == 2 .OR. X == 16 .OR. X == 18)) X = -9999 END WHERE
如果后续需要调整保留的数值列表,可以把保留值存为常量数组,搭配ANY函数简化判断逻辑,修改时只需要调整常量数组即可:
integer, parameter :: keep_list(*) = [0, 1, 2, 16, 18] WHERE(.NOT. ANY(X == spread(keep_list, 1, size(X)), dim=2)) X = -9999 END WHERE
- MERGE函数(单行实现,适合简单逻辑)
MERGE是Fortran的逐元素三元运算函数,参数顺序为条件为真时的取值、条件为假时的取值、判断条件,可以一行完成赋值:
X = MERGE(X, -9999, X == 0 .OR. X == 1 .OR. X == 2 .OR. X == 16 .OR. X == 18)
- 循环搭配扩展IN运算符(兼容性稍弱,写法最简洁)
多数主流Fortran编译器支持IN运算符的语法扩展,可以进一步简化判断逻辑,但该特性不属于标准Fortran95规范,仅适合不需要严格跨编译器兼容的场景:
integer :: i do i = 1, size(X) if (.NOT. (X(i) IN [0,1,2,16,18])) X(i) = -9999 end do
以上三种方式的运行效率和你原有逐元素判断的写法基本一致,编译器会自动做向量化优化,不需要担心性能损失。
内容的提问来源于stack exchange,提问作者Piyushkumar Patel
相关产品推荐
相关产品推荐

