diff liboctave/dMatrix.cc @ 3723:4c3774db5b3c

[project @ 2000-10-12 05:10:08 by jwe]
author jwe
date Thu, 12 Oct 2000 05:10:09 +0000
parents d9803711e047
children b7d997d593d9
line wrap: on
line diff
--- a/liboctave/dMatrix.cc
+++ b/liboctave/dMatrix.cc
@@ -1873,45 +1873,28 @@
 }
 
 Matrix
-Matrix::cumprod (void) const
+Matrix::cumprod (int dim) const
 {
-  Matrix retval;
-
   int nr = rows ();
   int nc = cols ();
-
-  if (nr == 1)
+  Matrix retval (nr, nc);
+
+  if (nr > 0 && nc >0)
     {
-      retval.resize (1, nc);
-      if (nc > 0)
+      if ((nr == 1 && dim == 0) || dim == 1)
 	{
-	  double prod = elem (0, 0);
-	  for (int j = 0; j < nc; j++)
+	  for (int i = 0; i < nr; i++)
 	    {
-	      retval.elem (0, j) = prod;
-	      if (j < nc - 1)
-		prod *= elem (0, j+1);
+	      double prod = elem (i, 0);
+	      for (int j = 0; j < nc; j++)
+		{
+		  retval.elem (0, j) = prod;
+		  if (j < nc - 1)
+		    prod *= elem (i, j+1);
+		}
 	    }
 	}
-    }
-  else if (nc == 1)
-    {
-      retval.resize (nr, 1);
-      if (nr > 0)
-	{
-	  double prod = elem (0, 0);
-	  for (int i = 0; i < nr; i++)
-	    {
-	      retval.elem (i, 0) = prod;
-	      if (i < nr - 1)
-		prod *= elem (i+1, 0);
-	    }
-	}
-    }
-  else
-    {
-      retval.resize (nr, nc);
-      if (nr > 0 && nc > 0)
+      else
 	{
 	  for (int j = 0; j < nc; j++)
 	    {
@@ -1929,45 +1912,28 @@
 }
 
 Matrix
-Matrix::cumsum (void) const
+Matrix::cumsum (int dim) const
 {
-  Matrix retval;
-
   int nr = rows ();
   int nc = cols ();
-
-  if (nr == 1)
+  Matrix retval (nr, nc);
+
+  if (nr > 0 && nc > 0)
     {
-      retval.resize (1, nc);
-      if (nc > 0)
+      if ((nr == 1 && dim == 0) || dim == 1)
 	{
-	  double sum = elem (0, 0);
-	  for (int j = 0; j < nc; j++)
+	  for (int i = 0; i < nr; i++)
 	    {
-	      retval.elem (0, j) = sum;
-	      if (j < nc - 1)
-		sum += elem (0, j+1);
+	      double sum = elem (i, 0);
+	      for (int j = 0; j < nc; j++)
+		{
+		  retval.elem (i, j) = sum;
+		  if (j < nc - 1)
+		    sum += elem (i, j+1);
+		}
 	    }
 	}
-    }
-  else if (nc == 1)
-    {
-      retval.resize (nr, 1);
-      if (nr > 0)
-	{
-	  double sum = elem (0, 0);
-	  for (int i = 0; i < nr; i++)
-	    {
-	      retval.elem (i, 0) = sum;
-	      if (i < nr - 1)
-		sum += elem (i+1, 0);
-	    }
-	}
-    }
-  else
-    {
-      retval.resize (nr, nc);
-      if (nr > 0 && nc > 0)
+      else
 	{
 	  for (int j = 0; j < nc; j++)
 	    {
@@ -1985,129 +1951,125 @@
 }
 
 Matrix
-Matrix::prod (void) const
+Matrix::prod (int dim) const
 {
   Matrix retval;
 
   int nr = rows ();
   int nc = cols ();
 
-  if (nr == 1)
+  if (nr > 0 && nc > 0)
     {
-      retval.resize (1, 1);
-      retval.elem (0, 0) = 1.0;
-      for (int j = 0; j < nc; j++)
-	retval.elem (0, 0) *= elem (0, j);
-    }
-  else if (nc == 1)
-    {
-      retval.resize (1, 1);
-      retval.elem (0, 0) = 1.0;
-      for (int i = 0; i < nr; i++)
-	retval.elem (0, 0) *= elem (i, 0);
+      if ((nr == 1 && dim == 0) || dim == 1)
+	{
+	  retval.resize(nr, 1);
+	  for (int i = 0; i < nr; i++)
+	    {
+	      retval.elem (i, 0) = 1.0;
+	      for (int j = 0; j < nc; j++)
+		retval.elem (i, 0) *= elem (i, j);
+	    }
+	}
+      else
+	{
+	  retval.resize (1, nc);
+	  for (int j = 0; j < nc; j++)
+	    {
+	      retval.elem (0, j) = 1.0;
+	      for (int i = 0; i < nr; i++)
+		retval.elem (0, j) *= elem (i, j);
+	    }
+	}
     }
   else
     {
-      if (nc == 0)
-	{
-	  retval.resize (1, 1);
-	  retval.elem (0, 0) = 1.0;
-	}
-      else
-	retval.resize (1, nc);
-
-      for (int j = 0; j < nc; j++)
-	{
-	  retval.elem (0, j) = 1.0;
-	  for (int i = 0; i < nr; i++)
-	    retval.elem (0, j) *= elem (i, j);
-	}
+      retval.resize (1, 1);
+      retval.elem (0, 0) = 1.0;
     }
+
   return retval;
 }
 
 Matrix
-Matrix::sum (void) const
+Matrix::sum (int dim) const
 {
   Matrix retval;
 
   int nr = rows ();
   int nc = cols ();
 
-  if (nr == 1)
+  if (nr > 0 && nc > 0)
     {
-      retval.resize (1, 1);
-      retval.elem (0, 0) = 0.0;
-      for (int j = 0; j < nc; j++)
-	retval.elem (0, 0) += elem (0, j);
+      if ((nr == 1 && dim == 0) || dim == 1)
+	{
+	  retval.resize (nr, 1);
+	  for (int i = 0; i < nr; i++)
+	    {
+	      retval.elem (i, 0) = 0.0;
+	      for (int j = 0; j < nc; j++)
+		retval.elem (i, 0) += elem (i, j);
+	    }
+	}
+      else
+	{
+	  retval.resize (1, nc);
+	  for (int j = 0; j < nc; j++)
+	    {
+	      retval.elem (0, j) = 0.0;
+	      for (int i = 0; i < nr; i++)
+		retval.elem (0, j) += elem (i, j);
+	    }
+	}
     }
-  else if (nc == 1)
+  else
     {
       retval.resize (1, 1);
       retval.elem (0, 0) = 0.0;
-      for (int i = 0; i < nr; i++)
-	retval.elem (0, 0) += elem (i, 0);
-    }
-  else
-    {
-      if (nc == 0)
-	{
-	  retval.resize (1, 1);
-	  retval.elem (0, 0) = 0.0;
-	}
-      else
-	retval.resize (1, nc);
-
-      for (int j = 0; j < nc; j++)
-	{
-	  retval.elem (0, j) = 0.0;
-	  for (int i = 0; i < nr; i++)
-	    retval.elem (0, j) += elem (i, j);
-	}
     }
   return retval;
 }
 
 Matrix
-Matrix::sumsq (void) const
+Matrix::sumsq (int dim) const
 {
   Matrix retval;
 
   int nr = rows ();
   int nc = cols ();
 
-  if (nr == 1)
+  if (nr > 0 && nc > 0)
     {
-      retval.resize (1, 1);
-      retval.elem (0, 0) = 0.0;
-      for (int j = 0; j < nc; j++)
+      if ((nr == 1 && dim == 0) || dim == 1)
 	{
-	  double d = elem (0, j);
-	  retval.elem (0, 0) += d * d;
+	  retval.resize (nr, 1);
+	  for (int i = 0; i < nr; i++)
+	    {
+	      retval.elem (i, 0) = 0.0;
+	      for (int j = 0; j < nc; j++)
+		{
+		  double d = elem (i, j);
+		  retval.elem (i, 0) += d * d;
+		}
+	    }
 	}
-    }
-  else if (nc == 1)
-    {
-      retval.resize (1, 1);
-      retval.elem (0, 0) = 0.0;
-      for (int i = 0; i < nr; i++)
+      else
 	{
-	  double d = elem (i, 0);
-	  retval.elem (0, 0) += d * d;
+	  retval.resize (1, nc);
+	  for (int j = 0; j < nc; j++)
+	    {
+	      retval.elem (0, j) = 0.0;
+	      for (int i = 0; i < nr; i++)
+		{
+		  double d = elem (i, j);
+		  retval.elem (0, j) += d * d;
+		}
+	    }
 	}
     }
   else
     {
-      retval.resize (1, nc);
-      for (int j = 0; j < nc; j++)
-	{
-	  retval.elem (0, j) = 0.0;
-	  for (int i = 0; i < nr; i++)
-	    {
-	      double d = elem (i, j);
-	      retval.elem (0, j) += d * d;
-	    }
-	}
+      retval.resize (1, 1);
+      retval.elem (0, 0) = 0.0;
     }
   return retval;
 }