【问题标题】:How can I efficiently transpose array and assign to an array with a different type如何有效地转置数组并分配给具有不同类型的数组
【发布时间】:2012-07-25 17:44:05
【问题描述】:

考虑以下几点:

program main
integer, parameter :: n=10, m=20
integer ints(n,m)
real floats(m,n)

!... initialize ints
! ...

floats=transpose(ints)
!... do stuff with floats

end

查看 gfortran 的文档,transpose(ints) 似乎将返回一个整数数组,然后将其转换为实数。在此操作中,编译器 (gfortran) 为转置后的数组创建了一个临时数组,这似乎很浪费(使用 gfortran -O3 -Warray-temporaries -o test test.f90 编译)。另请注意,如果您将 real 数组“浮动”更改为 integer 数组,警告就会消失。

有没有办法在不生成临时数组的情况下做到这一点(对于任意类型)? (我也试过floats(:,:)=transpose(ints),因为我在某处读到它很重要......)。它与其他编译器的行为方式相同吗?

【问题讨论】:

    标签: fortran fortran90


    【解决方案1】:

    你可以试试

    floats = transpose(real(ints))
    

    但如果 gfortran(或任何其他编译器)生成一个临时数组来实现它,我不会感到非常惊讶。如果没有,我会更惊讶。

    你也可以试试

    forall (J=1:N, K=1:M) floats(K, J) = real(ints(J, K))
    

    同样,如果编译器创建了一个临时数组来实现这一点,我不会感到惊讶。

    【讨论】:

    • 我希望你能回答。第一个仍然生成一个临时的(在 gfortran 中)。第二个没有(或者至少它没有警告我)。另外,如果我在real(ints(j,k)) 中删除real,那么它应该适用于任意类型。 (主要是我需要整数、实数和双精度的所有排列)。在我看来,编译器在这种情况下需要生成临时数组似乎很愚蠢(我可以编写一个模块来使用子例程并根据需要重载),但也许我只是天真。
    • 就地换位并非易事。参见,例如,en.wikipedia.org/wiki/In-place_matrix_transposition
    • @M.S.B.我不是在谈论就地进行——事实上,我不想就地进行。 (我不希望 ints 被更改)- 但是,我确实有一个非常好的地方可以让结果去 (floats)。我想这里的部分困难是transpose 可以用作更大表达式的一部分,其中需要临时...
    【解决方案2】:
    do i = 1, n
    do j = 1, m
        floats(j,i) = real(ints(i,j))
    enddo
    enddo
    

    您可以创建自己的transpose 接口来处理不同的数据类型,尽管它必须是子例程而不是函数。

    interface transpose_
        module procedure transpose_ints_to_reals
    end interface
    
    subroutine transpose_ints_to_reals(ints_in, reals_out)
    ...
    end subroutine
    
    call transpose_(ints,floats)
    

    【讨论】:

    • 是的,我知道我可以做到这一点,但是,这很容易出错,因为我必须为不同的类型多次复制相同的例程。如果 Fortran 有某种机制可以为不同类型自动生成函数并重载它,那将是完美的,但 AFIK,该机制不存在。
    • 是的,Fortran 没有很多好的特性 :(
    • Fortran 确实为数字提供了很多不错的功能。 transpose 函数的存在非常好。
    猜你喜欢
    • 2019-07-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-03-03
    • 2018-09-21
    • 1970-01-01
    • 1970-01-01
    • 2018-01-24
    相关资源
    最近更新 更多