回 帖 发 新 帖 刷新版面

主题:关于三个矩阵相乘(高人看到顶下)

程序相乘有关
求得一个矩阵c(n*n)的特征值和特征向量,另外还有一矩阵b=c+1,以及c的特征向量构成的矩阵的转置矩阵。
目的要实现以下过程:
让某个特征值对应的特征向量的转置矩阵跟b相乘,然后再乘以该特征向量本身。为了得到特征向量的转置,我先将特征向量构成的矩阵转置(d),然后再求该特征向量对应的行。比如,原来第二个特征值对应的特征向量在第二列,现在它的转置在第二行了,这样就得到了这个特征向量对应的转置了。然后让它跟b相乘,得到1行n列的矩阵,然后再让它跟第二个特征向量本身相乘,由于特征向量是n行1列的,所以就得到了一个具体的数。但是,我不知道该怎么用两个矩阵相乘得到的矩阵跟第三个矩阵相乘啊,试了几次都失败了。请看下面两个程序:

程序1.矩阵特征向量的转置与矩阵b相乘,这个已经得到结果了。正确
program ex1
use imsl
implicit none
integer i

real,dimension(:)::eigenvalue(3)
real,dimension(:,:):: eigenvector(3,3)

real,dimension(:)::d(3,3),b(3,3)
real:: c(3,3)=reshape((/1,2,3,4,5,6,7,8,9/),(/3,3/))
  eigenvalue=eig(c,v=eigenvector)
b=c+1
open(1,file='liu.txt')
do i=1,3

 write(1,*)'eigenvalue=',eigenvalue(i)
 write(1,*)'eigenvector=' ,  eigenvector(:,i)
end do
close(1)
d=transpose(eigenvector)

 write(*,*)  matmul(d(1,:),b)  !这里是特征向量的转置与b相乘,给出结果了


end


程序2。再跟特征向量本身相乘出错啦

program ex1
use imsl
implicit none
integer i

real,dimension(:)::eigenvalue(3)
real,dimension(:,:):: eigenvector(3,3)

real,dimension(:)::b(3,3),d(3,3)
real:: c(3,3)=reshape((/1,2,3,4,5,6,7,8,9/),(/3,3/))
 b=c+1 
  
  eigenvalue=eig(c,v=eigenvector)

open(1,file='liu.txt')
do i=1,3

 write(1,*)'eigenvalue=',eigenvalue(i)
 write(1,*)'eigenvector=' ,  eigenvector(:,i)
end do
close(1)

d=transpose(eigenvector)

 write(*,*)  matmul(d(2,:),b)  
 write(*,*)  matmul(matmul(d(2,:),b) ,eigenvector(:,2))!!这里出错啦
end

出错信息:Error: The shapes of the arguments are inconsistent or nonconformable.   [MATMUL]
 write(*,*)  matmul(matmul(d(2,:),b) ,eigenvector(:,2))

回复列表 (共2个回复)

沙发


result = MATMUL (matrix_a, matrix_b)


matrix_a 
(Input) Must be an array of rank one or two. It must be of numeric (integer, real, or complex) or logical type.

matrix_b 
(Input) Must be an array of rank one or two. It must be of numeric type if matrix_a is of numeric type or logical type if matrix_a is logical type. 
[color=FF0000]At least one argument must be of rank two.[/color] The size of the first (or only) dimension of matrix_b must equal the size of the last (or only) dimension of matrix_a.

If matrix_a has shape (n, m) and matrix_b has shape (m, k), the result is a rank-two array with shape (n, k).
If matrix_a has shape (m) and matrix_b has shape (m, k), the result is a rank-one array with shape (k).
If matrix_a has shape (n, m) and matrix_b has shape (m), the result is a rank-one array with shape (n). 

红色部分之前我也没怎么注意. 你出错的那行代码, 最后matmul的都是rank one, 不符合matmul的规定. 可以考虑:
real :: e(3)
e=matmul(d(2,:),b)
write(*,*)  e
write(*,*)  dot_product(e ,eigenvector(:,2))

以前在网上看都某个帖子说matmul不要套用, 会降低效率并且有可能带来错误. 不知道真实性有多高. 但曾经在cvf下把嵌套的matmul拆开来就得到合理结果, 于是没追查下去.

板凳

你的方法很好,可以用

我来回复

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