我有一个名为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.
答案 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