将等级2的数组转换为等级1的数组

时间:2013-01-27 12:51:57

标签: arrays multidimensional-array fortran

我有以下最小例子:

      program main

      double precision, dimension(3)   :: rankone
      double precision, dimension(3,1) :: ranktwo

      double precision, dimension(3)   :: output

      rankone = 1
      ranktwo = 2

      output = rankone + ranktwo

      print *, 'output: ', output

      end program main

Matlab中是否有类似squeeze的函数可以从变量ranktwo中删除单例维度。我正在寻找像

这样的东西
      output = rankone + squeeze(ranktwo)

如果没有,此设置是否有解决方法?

关于这个问题,各种版本的Fortran之间是否有任何差异?

2 个答案:

答案 0 :(得分:3)

试试这个

output = rankone + reshape(ranktwo,[3])

然后查看reshape的文档,看看发生了什么。你也可以写

output = rankone + ranktwo(:,1)

ranktwo中切出一维数组。根据我的经验reshape通常会导致数组副本,因此可能存在使用内存使用效率的参数来优先选择第二个版本。

不,Fortran版本之间没有关于此问题的差异,3x1阵列的形状与长度为3的1D阵列的形状不同。

答案 1 :(得分:1)

或者,在F2003中,你可以指向你的排名为一的数组,其中有一个二级指针,如下所示:

program main

  double precision, dimension(3), target   :: rankone
  double precision, dimension(3,1) :: ranktwo
  double precision, dimension(3,1)   :: output
  double precision, pointer :: pp(:,:)

  rankone(:) = 1
  ranktwo(:,:) = 2
  pp(1:size(rankone),1:1) => rankone

  output = pp + ranktwo

  print *, 'output: ', output

end program main

如果我没记错的话,另一个方向(指向一级指针排名第二的数组)只适用于Fortran 2008。