24小时热门版块排行榜    

查看: 1253  |  回复: 5

songjunann

铜虫 (小有名气)

[求助] 帮忙看一下,这两个程序(关于点积的)讲的是什么,为什么要写的这么繁琐

dot.f程序:

  function dot (x,y,n)
cc-begin
c
c-----------------------------------------------------------------------
c
c     dot (x,y,n)
c
c
c     purpose
c     -------
c
c     dot calculates the dot product of the two n-vectors
c     x and y.
c
cc-doc
c     input arguments
c     ---------------
c
c     x       = vector of length n.
c     y       = vector of length n.
c     n       = dimension of x and y.
c
c     output arguments
c     ----------------
c
c     dot     = value of the function, i.e. dot product of x and y.
c
c     notes
c     -----
c
c     1. dot contains a test for n = 0.
c
c-----------------------------------------------------------------------
cc-end
c
      implicit real*8 (a-h,o-z)
      dimension x(*),y(*)
c
      dot = 0.
      if (n .le. 0) return
c      do 100 i = 1,n
c         dot = dot + x(i)*y(i)
c  100 continue
      dot = ddot(n,x,1,y,1)
      end
%%%%%%%%%%%%%%%%%%%%%%%%%
其中ddot.f子程序为:
      DOUBLE PRECISION FUNCTION DDOT(N,DX,INCX,DY,INCY)
*     .. Scalar Arguments ..
      INTEGER INCX,INCY,N
*     ..
*     .. Array Arguments ..
      DOUBLE PRECISION DX(*),DY(*)
*     ..
*
*  Purpose
*  =======
*
*     DDOT forms the dot product of two vectors.
*     uses unrolled loops for increments equal to one.
*
*  Further Details
*  ===============
*
*     jack dongarra, linpack, 3/11/78.
*     modified 12/3/93, array(1) declarations changed to array(*)
*
*  =====================================================================
*
*     .. Local Scalars ..
      DOUBLE PRECISION DTEMP
      INTEGER I,IX,IY,M,MP1
*     ..
*     .. Intrinsic Functions ..
      INTRINSIC MOD
*     ..
      DDOT = 0.0d0
      DTEMP = 0.0d0
      IF (N.LE.0) RETURN
      IF (INCX.EQ.1 .AND. INCY.EQ.1) THEN
*
*        code for both increments equal to 1
*
*
*        clean-up loop
*
         M = MOD(N,5)
         IF (M.NE.0) THEN
            DO I = 1,M
               DTEMP = DTEMP + DX(I)*DY(I)
            END DO
            IF (N.LT.5) THEN
               DDOT=DTEMP
            RETURN
            END IF
         END IF
         MP1 = M + 1
         DO I = MP1,N,5
          DTEMP = DTEMP + DX(I)*DY(I) + DX(I+1)*DY(I+1) +
     $            DX(I+2)*DY(I+2) + DX(I+3)*DY(I+3) + DX(I+4)*DY(I+4)
         END DO
      ELSE
*
*        code for unequal increments or equal increments
*          not equal to 1
*
         IX = 1
         IY = 1
         IF (INCX.LT.0) IX = (-N+1)*INCX + 1
         IF (INCY.LT.0) IY = (-N+1)*INCY + 1
         DO I = 1,N
            DTEMP = DTEMP + DX(IX)*DY(IY)
            IX = IX + INCX
            IY = IY + INCY
         END DO
      END IF
      DDOT = DTEMP
      RETURN
      END

个人感觉不就是两个向量的点积,为什么两个程序要写的这么复杂呢,有什么特别的地方吗,请大家多多指教,谢谢!
回复此楼

» 猜你喜欢

» 本主题相关价值贴推荐,对您同样有帮助:

已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖

snoopyzhao

至尊木虫 (职业作家)

【答案】应助回帖


xzhdty(金币+1): 欢迎常来程序语言看看 2011-09-25 19:19:42
ddot.f 应该是 blas  包中的函数,之所以写成这样,呵呵,或许是受那个时代计算机的计算能力的限制吧,里面有一些手工的向量化操作,呵呵……

在 Fortran 90 后,可以用内置函数dot_product来做这个工作了……
2楼2011-09-25 16:43:23
已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖

songjunann

铜虫 (小有名气)

引用回帖:
2楼: Originally posted by snoopyzhao at 2011-09-25 16:43:23:
ddot.f 应该是 blas  包中的函数,之所以写成这样,呵呵,或许是受那个时代计算机的计算能力的限制吧,里面有一些手工的向量化操作,呵呵……

在 Fortran 90 后,可以用内置函数dot_product来做这个工作了……

那在Visual Compaq Fortran里面,混合用F77和F90的语法,不会冲突吧?
3楼2011-09-25 23:09:13
已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖

snoopyzhao

至尊木虫 (职业作家)

【答案】应助回帖

jjdg: 感谢参与 2011-09-27 00:42:46
songjunann(金币+20): 谢谢,再问一个小问题, 2011-09-27 01:00:08
引用回帖:
3楼: Originally posted by songjunann at 2011-09-25 23:09:13:
那在Visual Compaq Fortran里面,混合用F77和F90的语法,不会冲突吧?

应该没有什么问题,但从编程规范的角度来说,不建议这样做……
4楼2011-09-25 23:49:31
已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖

songjunann

铜虫 (小有名气)

引用回帖:
3楼: Originally posted by songjunann at 2011-09-25 23:09:13:
那在Visual Compaq Fortran里面,混合用F77和F90的语法,不会冲突吧?

F77里面:
implicit real*8 (a-h,o-z)
dimension a(*),b(*),mdiag(*)
这样的定义用在哪里呢,a,b的大小是动态的吗?
5楼2011-09-27 01:01:29
已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖

snoopyzhao

至尊木虫 (职业作家)


余泽成(金币+1): 谢谢参与应助! 2011-09-28 10:31:43
引用回帖:
5楼: Originally posted by songjunann at 2011-09-27 01:01:29:
F77里面:
implicit real*8 (a-h,o-z)
dimension a(*),b(*),mdiag(*)
这样的定义用在哪里呢,a,b的大小是动态的吗?

这个不叫动态的,而叫 assumed size array,一般用在子程序中,用以表示 dummy variable 的维度是由实际传递的参数决定的。
6楼2011-09-27 01:28:01
已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖
相关版块跳转 我要订阅楼主 songjunann 的主题更新
最具人气热帖推荐 [查看全部] 作者 回/看 最后发表
[基金申请] 什么时候开奖? +4 CrisMessi 2026-08-18 4/200 2026-08-19 00:53 by gatelove
[基金申请] 咱们一起用铁证分析2026国家社科基金中标与否 +7 启萌科技 2026-08-12 27/1350 2026-08-18 21:44 by Noways
[教师之家] 为什么余额宝的年化利率越来越低?主要原因有哪些? +3 瞬息宇宙 2026-08-15 3/150 2026-08-18 21:40 by xiaohuixin
[基金申请] 朋友圈看到的 +4 wangzilk 2026-08-18 5/250 2026-08-18 19:25 by wangzilk
[基金申请] 欢迎发来filecode的Mz6后的代码验证其规律 +51 医学老男孩 2026-08-13 110/5500 2026-08-18 19:07 by icerianxia
[基金申请] 明天放榜? +5 Shxjjxjkx 2026-08-18 5/250 2026-08-18 18:14 by -大大大大大-
[基金申请] 时间戳变了,能看出什么问题? +8 基诺咪客 2026-08-17 11/550 2026-08-18 17:13 by 悠然熊猫
[基金申请] 重要消息,中午系统在维护 +9 yuleib84 2026-08-18 10/500 2026-08-18 16:52 by archvillain
[论文投稿] 投稿咨询 +4 wwm09 2026-08-17 6/300 2026-08-18 15:36 by wwm09
[基金申请] 时间戳又变了8-15 +14 archvillain 2026-08-15 26/1300 2026-08-18 13:37 by phantomgost
[基金申请] 今天维护系统维护 祝所有人 高中 +8 gjjjzhong 2026-08-18 9/450 2026-08-18 13:01 by 家与远方
[基金申请] 哪位老哥知道今年的国自然具体哪一天放榜? +13 Ldrop2023 2026-08-13 16/800 2026-08-18 12:25 by 淀粉搬运工
[基金申请] 快农历七夕节了,轻松一下,男人悄悄话,女施主请不要进来。 +4 Tide man 2026-08-14 5/250 2026-08-18 11:35 by Tide man
[基金申请] 93BebMhtakh前后11位开头都是大写 +4 且听虎啸 2026-08-17 5/250 2026-08-18 00:49 by 蔡棒棒菂
[基金申请] filecode=后面第一个是大写字母 +8 wangze12014 2026-08-14 10/500 2026-08-17 17:05 by xter9665
[基金申请] 今天系统多次维护,明天很可能放榜! +8 zju2000 2026-08-16 9/450 2026-08-17 12:20 by lmz0216
[精细化工] 招聘 金属平磨液,抛光液研发工程师 +3 小天0311 2026-08-14 3/150 2026-08-16 07:31 by H9PLUS
[基金申请] 各位道友,我要去昆明玩几天,回来见。 +7 Tide man 2026-08-14 8/400 2026-08-15 01:11 by arzu_hma
[基金申请] Filecode 又变了,巨变 +3 WH3796 2026-08-12 4/200 2026-08-13 14:13 by 小木虫6752397
[基金申请] 结合人工智能,周易传统文化,filecode打分制来了,3分以上希望很大。 +3 Tide man 2026-08-12 4/200 2026-08-13 08:35 by ZJTJZ
信息提示
请填处理意见