当前位置: 首页 > 面试题库 >

如何获取先验未知数组作为Fortran中函数的输出

仲霍英
2023-03-14
问题内容

Python中

def select(x):
    y = []
    for e in x:
        if e!=0:
            y.append(e)
    return y

的工作方式为:

x = [1,0,2,0,0,3]
选择(x)
[1,2,3]

要翻译成 Fortran

function select(x,n) result(y)
    implicit none
    integer:: x(n),n,i,j,y(?)
    j = 0
    do i=1,n
        if (x(i)/=0) then
            j = j+1
            y(j) = x(i)
        endif
    enddo
end function

问题在Fortran中:

  1. 如何声明y(?)
  2. 如何为x声明预定义值
  3. 如何避免尺寸信息n

如果定义为 y(n) ,则为1,则输出为:

x =(/ 1,0,2,0,0,3 /)
打印*,select(x,6)
1,2,3,0,0,0

这是不希望的!
!-------------------------------
注释:
1- 所有给定的答案在这篇文章中都是有用的。特别是MSB和eryksun。
2-
我尝试针对我的问题调整想法并进行编译,F2Py但是没有成功。我已经使用GFortran调试了它们,一切都成功了。可能是错误,F2Py或者是我不知道如何正确使用它。我将尝试在另一篇文章中介绍这个问题。


问题答案:

我希望有一个真正的Fortran程序员,但是在没有更好建议的情况下,我只会指定形状而不是大小x(:),使用一个临时数组temp(size(x)),并输出y
allocatable。然后,在第一遍之后,allocate(y(j))从临时数组中复制值。但是我不能强调自己不是Fortran程序员,所以我不能说该语言是否具有可增长的数组或是否存在用于后者的库。

program test
    implicit none
    integer:: x(10) = (/1,0,2,0,3,0,4,0,5,0/)
    print "(10I2.1)", select(x)

contains

    function select(x) result(y)
        implicit none
        integer, intent(in):: x(:) 
        integer:: i, j, temp(size(x))
        integer, allocatable:: y(:)

        j = 0
        do i = 1, size(x)
            if (x(i) /= 0) then
                j = j + 1
                temp(j) = x(i)
            endif
        enddo

        allocate(y(j))
        y = temp(:j)
    end function select

end program test

编辑:

基于MSB的答案,这里是一种生长功能的修订版 温度 y与超额分配。 与之前一样,它将结果复制到y的末尾。
事实证明,我没有必要以最终大小显式分配新数组。相反,它可以通过分配自动完成。

    function select(x) result(y)
        implicit none
        integer, intent(in):: x(:) 
        integer:: i, j, dsize
        integer, allocatable:: temp(:), y(:)

        dsize = 0; allocate(y(0))

        j = 0
        do i = 1, size(x)
            if (x(i) /= 0) then
                j = j + 1

                if (j >= dsize) then         !grow y using temp
                    dsize = j + j / 8 + 8 
                    allocate(temp(dsize))
                    temp(:size(y)) = y
                    call move_alloc(temp, y) !temp gets deallocated
                endif

                y(j) = x(i)
            endif
        enddo
        y = y(:j)
    end function select


 类似资料:
  • 问题内容: 我有并想要一些函数,调用的结果是新数组。 问题答案: 看一眼

  • 本文向大家介绍Fortran 函数语法,包括了Fortran 函数语法的使用技巧和注意事项,需要的朋友参考一下 示例 可以使用几种类型的语法编写函数 函数通过函数结果返回值。除非函数语句具有result子句,否则函数的结果与函数的名称相同。随着result功能的结果是,由给定result。在上面的前两个示例中,每个函数的结果由给出name;在第三条中res。 函数结果必须在函数执行期间定义。 函数

  • 问题内容: 我有以下列举。 我需要将所有原始值存储为字符串数组(例如)。 我将此方法添加到枚举中。 但我收到以下错误。 找不到类型’GeneratorOf’的初始化程序,该初始化程序接受类型’(()-> _)’的参数列表 有没有更简单,更好或更优雅的方式来做到这一点? 问题答案: 有一个协议: 对于Swift <4.2 不,您无法查询包含的值。看到这篇文章。您必须定义一个列出所有值的数组。还可以在

  • 我在Vannila JS中制作了一个随机密码生成器,我在下面的代码中遇到了一个未知的问题: 在这段代码中,如果将语句括在大括号{}中,则Object.values(item)[0]不起作用: 我不明白为什么会发生这种情况,我试着搜索文档,但没有用,谢谢!

  • 我在react JS应用程序上调用API: 然后输出日志: 如何获取数组上的数据? 我需要城市名单

  • 问题内容: 我正在使用大量的fortran库来进行一些数学计算。因此,numpy中的所有数组都必须是 Fortran-contiguous的 。 目前,我使用numpy.asfortranarray()完成此操作。 我的问题是: 这是一种告诉numpy数组应该以fortran样式存储的快速方法还是有一种更快的方法? 是否可以设置一些numpy标志,以使创建的每个数组都具有fortran风格? 问题