【问题标题】:How to write in Fortran the equivalent of MATLAB's diff function?如何在 Fortran 中编写相当于 MATLAB 的 diff 函数?
【发布时间】:2016-05-14 04:25:27
【问题描述】:

我想在 Fortran90 中写一个function/subroutine,它与 MATLAB 的diff 函数相同,即它接收一个多维数组A 和一个整数dim 并计算差异在A 的相邻元素之间沿dim 指定的数组维度。

首先,应该是function 还是subroutine?为什么?

A的尺寸怎么处理?例如,如果A 的大小为(a,b,c),则如果dim 的大小为2,则输出的大小应为(a,b-1,c);和

我认为每个维度的长度都不是问题。但我不知道处理维度的数量。

编辑: 我明白了关于内在函数eoshift 的观点,也就是说,我可以eoshift 矩阵A 沿着维度dim,然后从原来的矩阵中减去它。这样做,不幸的是,输出矩阵的大小将与A 相同,而沿维度dim 的范围应该减少1。从这个意义上说,我不知道如何声明一个基于给定的形状(REAL, DIMENSION(shape(A)) :: B 不起作用)。实际上,我现在不知道如何在 function/subroutine 中声明一个未知等级的变量。

【问题讨论】:

  • 应通过为 1D、2D、...7D 的特定实现创建通用接口来处理不同的维度。我会将其作为具有可分配结果的函数来执行。你需要 Fortran 2003,但 Fortran 90 已经过时了。
  • 你不应该声明一个未知等级的变量,你应该使用泛型,我已经写过了。只需分配结果并使其可分配(Fortran 2003)。很简单(分配)。
  • 难道不能在 Fortran 90/95 中做到这一点吗?

标签: fortran fortran90 difference


【解决方案1】:

最后我选择了遵循@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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-11-18
    • 1970-01-01
    • 1970-01-01
    • 2018-07-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多