我想检查数组的所有行是否符合逻辑条件。我使用了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
有关此错误或如何进行检查的任何想法?
答案 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)