首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何有效地转置数组并赋值给具有不同类型的数组

如何有效地转置数组并赋值给具有不同类型的数组
EN

Stack Overflow用户
提问于 2012-07-26 01:44:06
回答 2查看 5.4K关注 0票数 1

请考虑以下几点:

代码语言:javascript
复制
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),因为我在某处读到它很重要... )。它在其他编译器上也是这样的吗?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2012-07-26 03:22:37

你可以试一试

代码语言:javascript
复制
floats = transpose(real(ints))

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

您也可以尝试

代码语言:javascript
复制
forall (J=1:N, K=1:M) floats(K, J) = real(ints(J, K))

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

票数 2
EN

Stack Overflow用户

发布于 2012-07-27 06:40:08

代码语言:javascript
复制
do i = 1, n
do j = 1, m
    floats(j,i) = real(ints(i,j))
enddo
enddo

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

代码语言:javascript
复制
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)
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/11655533

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档