在 Fortran 中检查数组的所有元素是否符合逻辑条件

Checking all elements of array for a logical condition in fortran

我想检查数组的所有行是否符合逻辑条件。我按照 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

知道这个错误或如何进行检查吗?

使用它来获取标量逻辑:

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

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

在这种情况下,lg 是您的标量左侧。当你想针对每一行测试条件时(使用 [dim=]1 说明符支持),lg 是一个 rank-1 的数组,其中元素的数量与 mat1.

也就是说,因为 Fortran 使用 ALL(...,dim=1) 以列为主存储,所以这里实际上是按列为您提供测试结果。一般来说,ALL(L, dim=n) 的结果是 [d_1, d_2, ..., d_{n-1}, d_{n+1}, ..., d_m] 的形状,而 L 的形状是 [d_1, ..., d_m].

[如 中所述,ALL(L) 的结果是一个标量。如果这就是你想要的,那么我可能会对 ALL.]

的正式描述语言的潜在混淆说点什么