主题:请问两个矢量可以直接用乘号相乘吗?
yeg001
[专家分:14390] 发布于 2009-11-24 22:34:00
例如
real :: a(4)
real :: b(4)
real :: c(4)
c=a*b
可以c=a*b这样吗? 怎么我翻了签名的那本书和fortran2003 handbook都没看到这个用法, 是cvf或ivf的扩展还是标准?
回复列表 (共20个回复)
11 楼
shenjinggege [专家分:3260] 发布于 2009-11-25 15:31:00
嗯。明白了
不知楼主能否能提供例子?
12 楼
yeg001 [专家分:14390] 发布于 2009-11-25 22:26:00
两个矢量: hgz_xy_lower(2*G_N, 1), egz_xy_lower(2*G_N, 1), 是以前师兄这样写, 我就一直没改. 我检查的部分代码为:
open(165, file="1.txt")
open(166, file="2.txt")
write(165, *) hgz_xy_lower
write(166, *) egz_xy_lower
close(165)
close(166)
open(165, file="1.txt")
open(166, file="2.txt")
do i=1, 2*G_N
read(165, *) test_dot_product1(i)
read(166, *) test_dot_product2(i)
end do
close(165)
close(166)
write(*, *) "new_dot:", sum(conjg(test_dot_product1(:))*test_dot_product2(:))
write(*, *) "raw_dot:", DOT_PRODUCT(hgz_xy_lower(:, 1), egz_xy_lower(:, 1))
test_result = 0.0D0
do i=1, G_N !具体程序里面是这样求和的, 这里是抽象出来的计算, 与源程序等价.
test_result = test_result + conjg(hgz_xy_lower(i, 1))*egz_xy_lower(i, 1) + &
conjg(hgz_xy_lower(G_N+i, 1))*egz_xy_lower(G_N+i, 1)
end do
write(*, *) "plus_dot:", test_result
pause 159
结果:
new_dot: (6.387902280440756E-021,-837758877.058318)
raw_dot: (-3.423493760203843E-022,-837758877.058315)
plus_dot: (-4.731990091686164E-022,-837758877.058315)
Fortran Pause - 159
第一个结果是输出到文件再读入计算, 估计是输出那里出现误差. 第二个是原来的dot_product计算, 最后那个是自己加出来.
看来这个误差是在进行加法之后赋值回变量的时候发生的.
13 楼
asymptotic [专家分:16630] 发布于 2009-11-27 19:32:00
yeg001 网友,您是否能给出比较详细的代码呢?目前您给出的代码,吾等无法重复。
14 楼
yeg001 [专家分:14390] 发布于 2009-11-29 10:32:00
我也试过单独测试过子程序, 一个个加起来跟dot_product结果是一样的. 但是放在程序中就有稍微的出入. 我不知道有什么办法能重现那个情景, 要贴整个程序就是在太大了. 不过猜想向量数据需要计算得到而不是直接赋值.
15 楼
shenjinggege [专家分:3260] 发布于 2009-11-29 10:40:00
叫臭石头反汇编看看或许能知道情况
16 楼
trimtrim [专家分:1640] 发布于 2010-05-05 12:52:00
yeg001: 你把写入文件类型改成binary看看有没有问题。我觉得是你写文件的时候出错了。
17 楼
yeg001 [专家分:14390] 发布于 2010-05-05 13:41:00
确实写入文件在读取那个用十进制被截断了.
但是直接求和跟dot_product也有点出入.
幸好这些计算值在程序里面都可以当零抛弃掉.
18 楼
vehicle [专家分:310] 发布于 2010-05-05 18:42:00
我以前遇到过自己编写的矩阵相乘和matmul的计算结果不同。
不知道为什么,现在能用现成的函数,就不自己编写了。
19 楼
yeg001 [专家分:14390] 发布于 2010-05-05 19:46:00
vehicle 你当时发现问题在哪里了吗?
20 楼
vehicle [专家分:310] 发布于 2010-05-07 16:33:00
没有发现哪里出问题了。
可能是大数和小数相加的问题,有些数据很小的。
以后矩阵操作就不用自己编写的东西,不是fortran自带的就是imsl或lapack。
我来回复