回 帖 发 新 帖 刷新版面

主题:请问两个矢量可以直接用乘号相乘吗?

例如
real :: a(4)
real :: b(4)
real :: c(4)
c=a*b
可以c=a*b这样吗? 怎么我翻了签名的那本书和fortran2003 handbook都没看到这个用法, 是cvf或ivf的扩展还是标准?

回复列表 (共20个回复)

11 楼

嗯。明白了
不知楼主能否能提供例子?

12 楼

两个矢量: 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 楼

yeg001 网友,您是否能给出比较详细的代码呢?目前您给出的代码,吾等无法重复。

14 楼

我也试过单独测试过子程序, 一个个加起来跟dot_product结果是一样的. 但是放在程序中就有稍微的出入. 我不知道有什么办法能重现那个情景, 要贴整个程序就是在太大了. 不过猜想向量数据需要计算得到而不是直接赋值.

15 楼

叫臭石头反汇编看看或许能知道情况

16 楼

yeg001: 你把写入文件类型改成binary看看有没有问题。我觉得是你写文件的时候出错了。

17 楼

确实写入文件在读取那个用十进制被截断了. 
但是直接求和跟dot_product也有点出入.
幸好这些计算值在程序里面都可以当零抛弃掉.

18 楼

我以前遇到过自己编写的矩阵相乘和matmul的计算结果不同。
不知道为什么,现在能用现成的函数,就不自己编写了。

19 楼

vehicle 你当时发现问题在哪里了吗?

20 楼

没有发现哪里出问题了。
可能是大数和小数相加的问题,有些数据很小的。
以后矩阵操作就不用自己编写的东西,不是fortran自带的就是imsl或lapack。

我来回复

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