主题:[讨论]jstzhurj老师和各位高手,帮忙矩阵相乘,循环
tianhy2010
[专家分:60] 发布于 2010-09-03 21:46:00
[em1][em1][em1][em2][em2][em2]
在做矩阵相乘,遇到几个问题:一直不知道该怎么解决
eigenvector:矩阵特征向量矩阵,大小为(4mn,4mn),m=4=n,由外部量给出
traneigv:eigenvector的逆矩阵
temp:控制前4行(列)
j:控制后面的行(列)
hx,hy:大小为(4mn,4mn)的矩阵
do temp=1,4
do j=5,4*m*n
ea(temp,:)=traneigv(temp,:).x.hx !ea是4*4mn矩阵
ec(temp,:)=traneigv(temp,:).x.hy !ec是4*4mn矩阵
eb(j,:)=traneigv(j,:).x.hx !eb:(4mn-4)*4mn
ed(j,:)=traneigv(j,:).x.hy !ed:(4mn-4,4mn)
ee(:,temp)=eigenvector(:,temp) !ee:前4个特征向量
eg(:,j)=eigenvector(:,j) !后面特征向量
conduc(temp)=conduc(temp)+(ea(temp,:).x.eg(:,j)).x.((ed(j,:).x.ee(:,temp)))/(eigenvalue(temp)-eigenvalue(j))**2
end do
end do
con=sum(conduc)
我的目的乘法循环过程:
比如:
ea(temp,:).x.eg(:,j): 当temp=1时,ea(1,:)是逆矩阵第一行与hx矩阵相乘得到的结果,是1行4mn列,然后让它跟特征向量矩阵eg(:,j)相乘,得到的结果是1行j列的一维数组,j每改变一个数,就在这行上增加一个数,直到j=4mn,这样一行就有(1,4mn-4)个数,所以最后得到的ea是(4,4mn)的矩阵。
ed(j,:).x.ee(:,temp):还是temp=1,由于ed是特征向量逆矩阵第4行之后的矩阵与hy相乘得到的结果,大小为(4mn-4,4mn),让它与第1 (temp)个特征向量相乘,应该得到一个(4mn-4,1)的向量,一列向量。
然后让上面得到的一行矩阵和一列矩阵相乘,得到一个数,我把它存在conduc(temp)里,用temp表示是第几个temp得到的值,以上面temp=1,4为例,conduc里应该有4个数,每个temp对应自己的conduc.
然后,将conduc求和,所有元素求和,放到con里。
这样描述明白吗?
按照这种思路,我做了下,发现出了很多问题,后来我修改了下:
do temp=1,i
do j=i+1,4*m*n
ea(temp,:)=traneigv(temp,:).x.hx
ec(temp,:)=traneigv(temp,:).x.hy
eb(j,:)=traneigv(j,:).x.hx
ed(j,:)=traneigv(j,:).x.hy
ee(:,temp)=eigenvector(:,temp)
eg(:,j)=eigenvector(:,j)
conduc=conduc+((ea.x.eg).x.((ed.x.ee))-conjg((ea.x.eigenvector).x.(ed.x.eigenvector)))/(eigenvalue(temp)-eigenvalue(j))**2
end do
end do
con=sum(conduc)
虽然程序正常运行了,但是数据明显不合理啊。
程序肯定有问题,高手们帮忙支招吧。
[em8][em8][em8][em8]
回复列表 (共9个回复)
沙发
tianhy2010 [专家分:60] 发布于 2010-09-03 21:48:00
如果哪个地方表达不明白,还请指出来。谢谢啦!!
课题不好做那
板凳
大智若愚 [专家分:90] 发布于 2010-09-03 21:55:00
呜呜,我也在写程序的时候碰到一大堆问题。
求这类型问题的代码,网上好像有吧。
3 楼
tianhy2010 [专家分:60] 发布于 2010-09-03 21:58:00
[quote]呜呜,我也在写程序的时候碰到一大堆问题。
求这类型问题的代码,网上好像有吧。[/quote]
别紧张,慢慢来。我的问题快搞定了。最后一步。。
4 楼
tianhy2010 [专家分:60] 发布于 2010-09-03 22:04:00
.x.是矩阵相乘,我这里是矩阵元素相乘,可能要换成*
5 楼
tianhy2010 [专家分:60] 发布于 2010-09-03 22:11:00
[em2][em2][em2][em2][em2]
最后出现一个语法错误:
do temp=1,i
do j=i+1,4*m*n
ea(temp,:)=traneigv(temp,:).x.hx
ec(temp,:)=traneigv(temp,:).x.hy
eb(j,:)=traneigv(j,:).x.hx
ed(j,:)=traneigv(j,:).x.hy
ee(:,temp)=eigenvector(:,temp)
eg(:,j)=eigenvector(:,j)
conduc(temp)=conduc(temp)+((ea(temp,:)*eg(:,j))*((ed(j,:)*ee(:,temp))-conjg((ea(temp,:)*eg(:,j))*((ed(j,:)*ee(:,temp))))/(eigenvalue(temp)-eigenvalue(j))**2
end do
end do
con=sum(conduc)
Error: Syntax error, found END-OF-STATEMENT when expecting one of: , )
conduc(temp)=conduc......
没看出来在这行什么地方出问题了 [em5][em6][em6][em6][em6][em6][em7][em7][em7][em7][em7][em10][em10][em10][em10][em10]
6 楼
tianhy2010 [专家分:60] 发布于 2010-09-03 22:36:00
[em11][em10][em10][em10][em10][em10]
不知道为什么这样就可以了
do temp=1,i
do j=i+1,4*m*n
do pp=1,4*m*n
ea(temp,:)=traneigv(temp,:).x.hx
ec(temp,:)=traneigv(temp,:).x.hy
eb(j,:)=traneigv(j,:).x.hx
ed(j,:)=traneigv(j,:).x.hy
ee(:,temp)=eigenvector(:,temp)
eg(:,j)=eigenvector(:,j)
conduc(temp)=conduc(temp)+((ea(temp,pp)*eg(pp,j))*(ed(j,pp)*ee(pp,temp))-conjg((ea(temp,pp)*eg(pp,j))*(ed(j,pp)*ee(pp,temp))))/(eigenvalue(temp)-eigenvalue(j))**2
end do
end do
end do
7 楼
tianhy2010 [专家分:60] 发布于 2010-09-03 22:36:00
得到的数据不合理啊
8 楼
jstzhurj [专家分:4680] 发布于 2010-09-04 00:52:00
[quote]得到的数据不合理啊[/quote]
首先,你要理解你的公式,到底该怎么求和。
其次,与j无关的算式,请放到j循环之外,放在外面求一次就可以了,放在里面算了很多次,虽不影响结果,却耗电![em80][em76]
9 楼
BiCGSTAB [专家分:780] 发布于 2010-09-04 02:01:00
多打了两个左括号,仔细查查吧。
另外,第一次编写新程序时,建议把每一步的数学公式写在纸上,然后尽量用矩阵形式编程(即你说的.x.)。完全用矩阵形式写的程序比较简洁,易于调试。验证结果无误之后,再逐句改成循环形式,这样可避免调用不必要的库文件。
[quote]
[em2][em2][em2][em2][em2]
最后出现一个语法错误:
do temp=1,i
do j=i+1,4*m*n
ea(temp,:)=traneigv(temp,:).x.hx
ec(temp,:)=traneigv(temp,:).x.hy
eb(j,:)=traneigv(j,:).x.hx
ed(j,:)=traneigv(j,:).x.hy
ee(:,temp)=eigenvector(:,temp)
eg(:,j)=eigenvector(:,j)
conduc(temp)=conduc(temp)+((ea(temp,:)*eg(:,j))*((ed(j,:)*ee(:,temp))-conjg((ea(temp,:)*eg(:,j))*((ed(j,:)*ee(:,temp))))/(eigenvalue(temp)-eigenvalue(j))**2
end do
end do
con=sum(conduc)
Error: Syntax error, found END-OF-STATEMENT when expecting one of: , )
conduc(temp)=conduc......
没看出来在这行什么地方出问题了 [em5][em6][em6][em6][em6][em6][em7][em7][em7][em7][em7][em10][em10][em10][em10][em10][/quote]
我来回复