如何用 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),如果 dim2,则输出的大小应为 (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