如何用 Fortran 编写相当于 MATLAB 的 diff 函数?
How to write in Fortran the equivalent of MATLAB's diff function?
我想用Fortran90写一个function
/subroutine
,和MATLAB的diff
函数一样,就是接收一个多维数组A
和一个整数 dim
并计算 A
的相邻元素之间沿着由 dim
.
指定的数组维度的差异
首先,应该是function
还是subroutine
?为什么?
如何处理A
的维度?例如,如果 A
的大小为 (a,b,c)
,如果 dim
为 2
,则输出的大小应为 (a,b-1,c)
;和
我觉得每个维度的长度都不是问题。但是我不知道如何处理维数。
编辑:
我明白了关于内在函数 eoshift
的要点,也就是说,我可以 eoshift
沿维度 dim
的矩阵 A
然后从原始矩阵中减去它。不幸的是,这样做,输出矩阵的大小将与 A
相同,而它应该沿维度 dim
的范围减去 1。从这个意义上说,我不知道如何声明基于给定形状的数组(REAL, DIMENSION(shape(A)) :: B
不起作用)。实际上,我现在不知道如何在 function
/subroutine
.
中声明未知等级的变量
最后我选择了@Vladimir F提出的路径(对吗?)
MODULE module1
IMPLICIT NONE
INTERFACE lininterpmid1D
MODULE PROCEDURE midpoint_1D
MODULE PROCEDURE midpoint_2D
MODULE PROCEDURE midpoint_3D
MODULE PROCEDURE midpoint_4D
MODULE PROCEDURE midpoint_5D
MODULE PROCEDURE midpoint_6D
MODULE PROCEDURE midpoint_7D
END INTERFACE lininterpmid1D
PRIVATE
PUBLIC :: lininterpmid1D
CONTAINS
... ! here are the 7 functions of the interface
END MODULE module1
我想用Fortran90写一个function
/subroutine
,和MATLAB的diff
函数一样,就是接收一个多维数组A
和一个整数 dim
并计算 A
的相邻元素之间沿着由 dim
.
首先,应该是function
还是subroutine
?为什么?
如何处理A
的维度?例如,如果 A
的大小为 (a,b,c)
,如果 dim
为 2
,则输出的大小应为 (a,b-1,c)
;和
我觉得每个维度的长度都不是问题。但是我不知道如何处理维数。
编辑:
我明白了关于内在函数 eoshift
的要点,也就是说,我可以 eoshift
沿维度 dim
的矩阵 A
然后从原始矩阵中减去它。不幸的是,这样做,输出矩阵的大小将与 A
相同,而它应该沿维度 dim
的范围减去 1。从这个意义上说,我不知道如何声明基于给定形状的数组(REAL, DIMENSION(shape(A)) :: B
不起作用)。实际上,我现在不知道如何在 function
/subroutine
.
最后我选择了@Vladimir F提出的路径(对吗?)
MODULE module1
IMPLICIT NONE
INTERFACE lininterpmid1D
MODULE PROCEDURE midpoint_1D
MODULE PROCEDURE midpoint_2D
MODULE PROCEDURE midpoint_3D
MODULE PROCEDURE midpoint_4D
MODULE PROCEDURE midpoint_5D
MODULE PROCEDURE midpoint_6D
MODULE PROCEDURE midpoint_7D
END INTERFACE lininterpmid1D
PRIVATE
PUBLIC :: lininterpmid1D
CONTAINS
... ! here are the 7 functions of the interface
END MODULE module1