R不能设置成动态数组
本帖最后由 FLY 于 2014-7-22 14:09 编辑do i=1,200,1
R(1,1)=sqrt(dot_product(A(:,1),A(:,1)))!用Gram_Schmidt分解求QR分解
Q(:,1)=A(:,1)/R(1,1)
do k=2,N,1
forall(j=1:k-1) R(j,k)=dot_product(Q(:,j),A(:,k))
Temp=A(:,k)
do j=1,k-1!此处使用Forall会产生一个警告
Temp=Temp-Q(:,j)*R(j,k)
end do
R(k,k)=sqrt(dot_product(Temp,Temp))
Q(:,k)=Temp/R(k,k)
end do
A=matmul(R,Q)!分解完成,开始迭代
end do
给位,上面的一段程序中,不知为何R不能设置成动态数组,我用的最新的IVF编译器。Q和A都可以设置成动态数组。
事实上,当把R设置成动态数组后,也不会报错,但是计算的结果是不对的。(注:这段程序是用来求解全部的特征值)
求指点。。。
解决了,谢谢围观朋友。特别感谢五楼。我fortran用的时间不长,我以前一直用的VB,搞混了。VB变量不用初始化,默认为0,而FORTRAN需要。
建议你给全代码。或者稍微全一些的代码。最好是给两种:一种是固定大小,一种是动态数组。 vvt 发表于 2014-7-22 11:52
建议你给全代码。或者稍微全一些的代码。最好是给两种:一种是固定大小,一种是动态数组。 ...
前面都是最基本的声明部分
implicit none
real::P_reaArr_A(:,:),EigenValue(:)
real::R(N,N)
real,allocatable::A(:,:),Q(:,:),Temp(:)
real::Err,ds
integer::i,j,k,N,Error
Err=1E-6
N=size(P_reaArr_A,1)
allocate(A(N,N),stat=Error)
allocate(Q(N,N),stat=Error)
!allocate(R(N,N),stat=Error)
!write(*,*) Error
allocate(Temp(N),stat=Error)
A=P_reaArr_A
vvt 发表于 2014-7-22 11:52
建议你给全代码。或者稍微全一些的代码。最好是给两种:一种是固定大小,一种是动态数组。 ...
你看我的声明部分,按理说A,Q,Temp能运行,那么R也能啊,但是如果R是动态数组,那么计算结果是错的 因为你的代码不全,无法帮你跑启动动态调试,只能看代码猜。
你试试 R 分配以后,令 R = 0.0 试试。再把 forall 改为 Do 循环试试。 fcode 发表于 2014-7-22 12:53
因为你的代码不全,无法帮你跑启动动态调试,只能看代码猜。
你试试 R 分配以后,令 R = 0.0 试试。再把 f ...
谢谢,果然如你所说,应该初始化一下
页:
[1]