0

我有以下最小示例:

      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

是否有像squeezeMatlab 中那样从变量中删除单例维度的函数ranktwo。我正在寻找类似的东西

      output = rankone + squeeze(ranktwo)

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

对于这个问题,不同版本的 Fortran 有什么不同吗?

4

2 回答 2

3

试试这个

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

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

output = rankone + ranktwo(:,1)

它将一维数组从ranktwo. 根据我的经验reshape,通常会导致数组复制,因此可能存在内存使用效率参数来支持第二个版本。

不,对于这个问题,Fortran 版本之间没有区别,3x1 数组与长度为 3 的一维数组的形状不同。

于 2013-01-27T13:39:51.727 回答
1

或者,在 F2003 中,您可以使用 Rank 2 指针指向您的 Rank 1 数组,如下所示:

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 中有效。

于 2013-01-28T10:52:26.170 回答