如何从Fortran中另一个数组中的每个元素中减去数组的元素?

时间:2017-09-10 15:43:47

标签: arrays fortran

我有一个名为zeta_list的2D数组,包含100个X和Y坐标值。我还有另一个名为X的2D数组。现在我想从X数组中的每个元素中减去列表中的第一个X坐标,然后通过Fortran中的do循环将其打开以减去直到第n个X坐标。但是,当我尝试这样做时,我得到错误:操作员在(1)和(1)的排名不一致。我的代码如下:

PROGRAM LensingTest1


DOUBLE PRECISION,DIMENSION(1,1000)::M_list
DOUBLE PRECISION,DIMENSION(100,100)::X,Y,z_m_z_x,z_m_z_y,dist_z_m_z, alpha_x, alpha_y
DOUBLE PRECISION,DIMENSION(2,1000)::zeta_list

open(9,file='/home/amruth/Desktop/Coding/Fortran/Test_Programs/Lensing_Test/zeta_list.txt')
open(8,file='/home/amruth/Desktop/Coding/Fortran/Test_Programs/Lensing_Test/X.txt')
read(9,*)zeta_list
read(8,*)X

write(*,*) X  - zeta_list(1,1:1)#this is the line that causes the error

!The do loop might then be 

!do i=1,size(M_list,1),1
    !z_m_z_x = X - zeta_list(1,i:i)
!end do


END PROGRAM LensingTest1

当我明确检查zeta_list(1,1:1)的值时,它是一个标量值,所以我不明白为什么我应该得到这个错误,因为我可以轻松地从整个数组中减去任何标量值比如X.

1 个答案:

答案 0 :(得分:2)

我认为这些评论很好地提到了这一点 - 你引用了一个1X1数组元素,fortran并不理解它是一个标量,尽管它实际上是有效的。 Agentp提供了一个面对此选项的选项,

    z_m_z_x = X - sum(zeta_list(1,:))

我通常会做一些类似的事情,实际上只是从代理商的建议中以语义方式的不同

    z_m_z_x= X(i,1) - maxval(zetalist(1,:))

在每种情况下,您都可以通过以下方式将数组转换为标量:1)对数组中的所有元素求和,这只是1或2)选择数组中所有元素的maxvalue,这也就是最多只有1个值。 Minval同样有效。但是,如果我理解你的问题 - 你有一个M x 2阵列' X'您试图从zeta_list ---

的第一列中减去值

然后可能有一种方法来矢量化这个操作。如果你试图从X中减去2 X M数组的第一列的值,并且数组都有M行,那么你可以简单地

    X(:,1)=X(:,1) - zetalist(:,1)
    X(:,2)=X(:,2) - zetalist(:,1) 

但是,这种方法只有在数组的行数相同时才有效 - 特定范围需要切片到每个数组中相同数量的行以及切片到右列。如果你试图从X中的每个位置减去1,1数组元素并且你想使用循环那么你可以写

   DO i=1,M 
           X(i,1) = X(i,1)- zetalist(1,1)
           X(i,2) = X(i,2)- zetalist(1,1)
   end DO