为什么 lapack dtrmm.f 似乎无法正常工作?
Why does lapack dtrmm.f seem to not work properly?
我决定使用 lapack 子例程 dtrmm
而不是 matmul
来乘以下三角 (d,d) 矩阵和一般 (d,n) 矩阵。但是,它似乎无法正常工作。以下代码比较 matlum
(顶部)和 dtrmm
的结果
Program test
implicit none
integer, parameter :: n = 3, d = 3 ! arbitrary numbers, no luck with other values
integer :: i
real(8) :: a(d,d), b(d,n), c(d,n)
call random_number(a)
call random_number(b)
do i=2,d
a(1:i-1,i) = 0
end do
c = matmul(a,b)
call dtrmm('L','L','N','N',d,n,1,a,d,b,d) ! documentation linked in the question
print*, 'correct result : '
do i=1,d
print*, c(i,:)
end do
print*, 'dtrmm yields : '
do i=1,d
print*, b(i,:)
end do
End Program test
returns 这个
correct result :
0.75678922130735249 0.51830058846965921 0.51177304237548271
1.1974740765385026 0.46115246753697681 0.98237114765741340
0.98027798241945430 0.53718796235743815 1.0328498570683342
dtrmm yields :
6.7262070844500211E+252 4.6065628207770121E+252 4.5485471599475983E+252
1.0642935166471391E+253 4.0986405551607272E+252 8.7311388520015068E+252
8.7125351741793473E+252 4.7744304178222945E+252 9.1797845822711462E+252
我使用的其他 lapack 子程序工作正常。什么可能导致这种行为不端?这是一个错误,还是我误解了什么?
这是一个简单的数据类型错误。因子 alpha
必须是双精度类型,而您提供的是默认类型的整数。
因此
...
! call dtrmm('L','L','N','N',d,n,1,a,d,b,d) WRONG
call dtrmm('L','L','N','N',d,n,1d0,a,d,b,d) ! note 1d0 instead of 1
...
给出了正确的结果。
我决定使用 lapack 子例程 dtrmm
而不是 matmul
来乘以下三角 (d,d) 矩阵和一般 (d,n) 矩阵。但是,它似乎无法正常工作。以下代码比较 matlum
(顶部)和 dtrmm
Program test
implicit none
integer, parameter :: n = 3, d = 3 ! arbitrary numbers, no luck with other values
integer :: i
real(8) :: a(d,d), b(d,n), c(d,n)
call random_number(a)
call random_number(b)
do i=2,d
a(1:i-1,i) = 0
end do
c = matmul(a,b)
call dtrmm('L','L','N','N',d,n,1,a,d,b,d) ! documentation linked in the question
print*, 'correct result : '
do i=1,d
print*, c(i,:)
end do
print*, 'dtrmm yields : '
do i=1,d
print*, b(i,:)
end do
End Program test
returns 这个
correct result :
0.75678922130735249 0.51830058846965921 0.51177304237548271
1.1974740765385026 0.46115246753697681 0.98237114765741340
0.98027798241945430 0.53718796235743815 1.0328498570683342
dtrmm yields :
6.7262070844500211E+252 4.6065628207770121E+252 4.5485471599475983E+252
1.0642935166471391E+253 4.0986405551607272E+252 8.7311388520015068E+252
8.7125351741793473E+252 4.7744304178222945E+252 9.1797845822711462E+252
我使用的其他 lapack 子程序工作正常。什么可能导致这种行为不端?这是一个错误,还是我误解了什么?
这是一个简单的数据类型错误。因子 alpha
必须是双精度类型,而您提供的是默认类型的整数。
因此
...
! call dtrmm('L','L','N','N',d,n,1,a,d,b,d) WRONG
call dtrmm('L','L','N','N',d,n,1d0,a,d,b,d) ! note 1d0 instead of 1
...
给出了正确的结果。