在fortran中检查数组的所有元素是否存在逻辑条件

时间:2015-06-14 20:23:37

标签: gcc fortran gfortran

我想检查数组的所有行是否符合逻辑条件。我使用了GNU GCC指南https://gcc.gnu.org/onlinedocs/gfortran/ALL.html

中描述的函数ALL

以下是示例代码:

program test3
implicit none
real, allocatable, dimension (:,:) :: mat1
integer :: i,j,k,r
logical :: lg
r=3
allocate(mat1(r,r))
mat1=transpose( reshape( (/-1,-2,-3,-4,-5,-6,-7,-8,-9/), (/3,3/)))
lg=all (abs(mat1)<10,1)
write (*,*) lg
end program

在这个程序中,我想检查所有行中所有元素的绝对值是否小于10.但是我收到错误

lg=all (abs(mat1)<10,1)
Error: Incompatible ranks 0 and 1 in assignment

有关此错误或如何进行检查的任何想法?

2 个答案:

答案 0 :(得分:2)

Error: Incompatible ranks 0 and 1 in assignment

表示您正在尝试将rank-1数组分配给标量变量。

在这种情况下,lg是你的标量左侧。当你想针对每一行测试条件时(正如使用[dim=]1说明符所支持的那样),lg是一个排名为1的数组是有意义的,其元素数与{中的行数一样多{1}}。

也就是说,因为Fortran使用mat1使用列主要存储,这实际上是沿着列给出了测试结果。一般来说,ALL(...,dim=1)的结果形状为ALL(L, dim=n)[d_1, d_2, ..., d_{n-1}, d_{n+1}, ..., d_m]的形状为L

[如another answer所述,[d_1, ..., d_m]的结果是标量。如果这就是你想要的,那么我可能会对ALL(L)的正式描述的语言可能有些混淆。]

答案 1 :(得分:1)

使用它来获得标量逻辑:

lg = all(abs(mat1) < 10)