24小时热门版块排行榜    

查看: 1014  |  回复: 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的回帖

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的回帖
查看全部 6 个回答

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的回帖

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的回帖
信息提示
请填处理意见