diff liboctave/dMatrix.cc @ 5983:ae09df27153f

[project @ 2006-09-12 02:15:47 by jwe]
author jwe
date Tue, 12 Sep 2006 02:15:47 +0000
parents 85c7dc4afe6b
children b3c425131211
line wrap: on
line diff
--- a/liboctave/dMatrix.cc
+++ b/liboctave/dMatrix.cc
@@ -83,6 +83,18 @@
 			   F77_CHAR_ARG_LEN_DECL);
 
   F77_RET_T
+  F77_FUNC (dgemv, DGEMV) (F77_CONST_CHAR_ARG_DECL,
+			   const octave_idx_type&, const octave_idx_type&, const double&,
+			   const double*, const octave_idx_type&, const double*,
+			   const octave_idx_type&, const double&, double*,
+			   const octave_idx_type&
+			   F77_CHAR_ARG_LEN_DECL);
+
+  F77_RET_T
+  F77_FUNC (xddot, XDDOT) (const octave_idx_type&, const double*, const octave_idx_type&,
+			   const double*, const octave_idx_type&, double&);
+
+  F77_RET_T
   F77_FUNC (dgetrf, DGETRF) (const octave_idx_type&, const octave_idx_type&, double*, const octave_idx_type&,
 		      octave_idx_type*, octave_idx_type&);
 
@@ -2993,12 +3005,23 @@
 	  retval.resize (nr, a_nc);
 	  double *c = retval.fortran_vec ();
 
-	  F77_XFCN (dgemm, DGEMM, (F77_CONST_CHAR_ARG2 ("N", 1),
-				   F77_CONST_CHAR_ARG2 ("N", 1),
-				   nr, a_nc, nc, 1.0, m.data (),
-				   ld, a.data (), lda, 0.0, c, nr
-				   F77_CHAR_ARG_LEN (1)
-				   F77_CHAR_ARG_LEN (1)));
+	  if (a_nc == 1)
+	    {
+	      if (nr == 1)
+		F77_FUNC (xddot, XDDOT) (nc, m.data (), 1, a.data (), 1, *c);
+	      else
+		F77_XFCN (dgemv, DGEMV, (F77_CONST_CHAR_ARG2 ("N", 1),
+					 nr, nc, 1.0,  m.data (), ld,
+					 a.data (), 1, 0.0, c, 1
+					 F77_CHAR_ARG_LEN (1)));
+            }
+	  else
+	    F77_XFCN (dgemm, DGEMM, (F77_CONST_CHAR_ARG2 ("N", 1),
+				     F77_CONST_CHAR_ARG2 ("N", 1),
+				     nr, a_nc, nc, 1.0, m.data (),
+				     ld, a.data (), lda, 0.0, c, nr
+				     F77_CHAR_ARG_LEN (1)
+				     F77_CHAR_ARG_LEN (1)));
 
 	  if (f77_exception_encountered)
 	    (*current_liboctave_error_handler)