Arrays 将秩2的数组转换为秩1的数组

Arrays 将秩2的数组转换为秩1的数组,arrays,multidimensional-array,fortran,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 + rankt

我有以下最简单的例子:

      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中是否有类似于
squere
的函数,用于从变量
ranktwo
中删除单态维度。我在找像这样的东西

      output = rankone + squeeze(ranktwo)
如果没有,此设置是否有解决方法

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

试试这个

output = rankone + reshape(ranktwo,[3])
然后查看
重塑
的文档以了解发生了什么。你也可以写

output = rankone + ranktwo(:,1)
它从
ranktwo
中分割出一个1D数组。根据我的经验重塑通常会导致数组复制,因此可能会有内存使用效率参数来首选第二个版本

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

试试这个

output = rankone + reshape(ranktwo,[3])
然后查看
重塑
的文档以了解发生了什么。你也可以写

output = rankone + ranktwo(:,1)
它从
ranktwo
中分割出一个1D数组。根据我的经验重塑通常会导致数组复制,因此可能会有内存使用效率参数来首选第二个版本


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

或者,在F2003中,您可以用秩2指针指向秩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

如果我没记错的话,另一个方向(用秩1指针指向秩2数组)仅在Fortran 2008中有效。

或者,在F2003中,您可以用秩2指针指向秩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

如果我没记错的话,另一个方向(用秩1指针指向秩2数组)只在Fortran 2008中有效。

谢谢。你的第二个建议对我没有帮助,因为在我实际遇到这个问题的代码中,秩2的值是由函数返回的。今天,内存使用问题不再是一个真正的问题。你认为使用整形也会降低运行速度吗?我认为整形对运行时间的影响一点都不重要,你所测量的就是你需要关心的。谢谢。你的第二个建议对我没有帮助,因为在我实际遇到这个问题的代码中,秩2的值是由函数返回的。今天,内存使用问题不再是一个真正的问题。你认为使用整形也会降低运行速度吗?我认为整形对运行时间的影响一点都不重要,你所测量的就是你需要关心的一切。但是您已经将
输出
更改为秩2,在原始版本中为秩1。可以使用秩1指针指向秩2数组的秩1切片。是的,确实,这是一个好的点。最初的帖子有点不清楚应该实现什么,允许改变什么。但是您已经将
输出
更改为秩2,在原始版本中为秩1。可以使用秩1指针指向秩2数组的秩1切片。是的,确实,这是一个好的点。最初的帖子有点不清楚应该实现什么以及允许改变什么。