回 帖 发 新 帖 刷新版面

主题:[讨论]jstzhurj老师和各位高手,帮忙矩阵相乘,循环

[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个回复)

沙发


如果哪个地方表达不明白,还请指出来。谢谢啦!!

课题不好做那

板凳

呜呜,我也在写程序的时候碰到一大堆问题。
求这类型问题的代码,网上好像有吧。

3 楼

[quote]呜呜,我也在写程序的时候碰到一大堆问题。
求这类型问题的代码,网上好像有吧。[/quote]


别紧张,慢慢来。我的问题快搞定了。最后一步。。

4 楼

.x.是矩阵相乘,我这里是矩阵元素相乘,可能要换成*

5 楼


[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 楼


[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 楼

得到的数据不合理啊

8 楼

[quote]得到的数据不合理啊[/quote]

首先,你要理解你的公式,到底该怎么求和。
其次,与j无关的算式,请放到j循环之外,放在外面求一次就可以了,放在里面算了很多次,虽不影响结果,却耗电![em80][em76]

9 楼


多打了两个左括号,仔细查查吧。

另外,第一次编写新程序时,建议把每一步的数学公式写在纸上,然后尽量用矩阵形式编程(即你说的.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]

我来回复

您尚未登录,请登录后再回复。点此登录或注册