我有以下最小例子:
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之间是否有任何差异?
答案 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。