Fortran中是否有一种内在函数可以将数组初始化为零?

6

有没有一种方法可以将Fortran中的数组(向量、矩阵或甚至是标量)设置为零?2003/2008似乎将Fortran提升到了非常现代化的水平,我不禁想知道它们是否已经包含了一种简单的方法来将数组值设置为零,而无需执行其他操作。

do i = 1,X

        do j = 1,Y

            A(i,j) = 0

        enddo

enddo

X是2D矩阵的行数,Y是列数。这个原理可以推广到任意维度。

在Matlab中,可以使用zeros函数轻松实现,例如:

A = zeros(X,Y)

现代Fortran似乎将人们喜欢的Matlab和其他语言的许多特性融入到了它的语言库中,因此我只是好奇它是否已经有了这个简单而基本的任务的内在函数。

或者,在现代Fortran中,初始化数组时不需要清除先前存储的任何值吗?

我想更简短的方法只是去:

real, dimension(X,Y)        :: A

A = A*0.0 ! Set all elements to zero by multiplying matrix by scalar value 0

但是围绕“内在的”问题仍然存在。


6
我认为 A = 0.0 就可以了。 - rici
@rici,你说得对。这是一个非常简单的解决方案,而我一直在过度处理它。 - Charlie Crown
2
你找到了正确的答案,但请注意你的“乘以零”方法是不正确的 - 在表达式中使用未初始化的变量从来都是不正确的。 - Ian Bush
此外,可以通过编译器选项来确保。-finit-local-zero 选项指示编译器为gfortran将本地INTEGER、REAL和COMPLEX变量初始化为零。 - trblnc
2
请不要这样做,这样的假设会导致您的代码不符合标准。 - Ian Bush
1
是的,我的先前评论明确地提到了一种不好的实践,它确实存在,但不建议使用,请参见这里。我想知道除了调试之外还有什么其他足够好的理由来使用那个选项。 - trblnc
1个回答

15

结果证明答案相当简单。

A = 0.0 
或者只是
A = 0

将会把你的数组中所有元素设置为0.0000...


1
这适用于所有版本的Fortran,还是它是在较新的版本中添加的功能? - swimfar
4
@swimfar 自Fortran 90以来。 - Vladimir F Героям слава
1
@VladimirF,这个能做到吗?实数,维度(X,Y):: A = 0? - Herman Toothrot
2
这对任何实数都适用吗?也就是说,我可以这样做:real,dimension(X,Y):: A = 273.15吗? - gram_schmidt
@Echeban 不是很必要。只需real(8), dimension (NL, ML) :: D = 0。而且,使用魔术数字8作为类型是不雅观的,也不具备可移植性,并且不能保证与双精度相同。如果你想要一个类型为8的文字,使用0.0_8,而不是0.0d0。 - undefined
显示剩余3条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接