主题:[讨论]jstzhurj老师和各位高手,帮忙矩阵相乘,循环
			 tianhy2010
				 [专家分:60]  发布于 2010-09-03 21:46:00
 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
tianhy2010 [专家分:60]  发布于 2010-09-03 21:48:00				
				
如果哪个地方表达不明白,还请指出来。谢谢啦!!
课题不好做那
							 
						
				板凳
				
					 大智若愚 [专家分:90]  发布于 2010-09-03 21:55:00
大智若愚 [专家分:90]  发布于 2010-09-03 21:55:00				
				呜呜,我也在写程序的时候碰到一大堆问题。
求这类型问题的代码,网上好像有吧。
							 
						
				3 楼
				
					 tianhy2010 [专家分:60]  发布于 2010-09-03 21:58:00
tianhy2010 [专家分:60]  发布于 2010-09-03 21:58:00				
				[quote]呜呜,我也在写程序的时候碰到一大堆问题。
求这类型问题的代码,网上好像有吧。[/quote]
别紧张,慢慢来。我的问题快搞定了。最后一步。。
							 
						
				4 楼
				
					 tianhy2010 [专家分:60]  发布于 2010-09-03 22:04:00
tianhy2010 [专家分:60]  发布于 2010-09-03 22:04:00				
				.x.是矩阵相乘,我这里是矩阵元素相乘,可能要换成*
							 
						
				5 楼
				
					 tianhy2010 [专家分:60]  发布于 2010-09-03 22:11:00
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
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
tianhy2010 [专家分:60]  发布于 2010-09-03 22:36:00				
				得到的数据不合理啊
							 
						
				8 楼
				
					 jstzhurj [专家分:4680]  发布于 2010-09-04 00:52:00
jstzhurj [专家分:4680]  发布于 2010-09-04 00:52:00				
				[quote]得到的数据不合理啊[/quote]
首先,你要理解你的公式,到底该怎么求和。
其次,与j无关的算式,请放到j循环之外,放在外面求一次就可以了,放在里面算了很多次,虽不影响结果,却耗电![em80][em76]
							 
						
				9 楼
				
					 BiCGSTAB [专家分:780]  发布于 2010-09-04 02:01:00
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]
							 
									
			
我来回复