diff src/DLD-FUNCTIONS/minmax.cc @ 3747:50f30e40abca

[project @ 2000-12-07 05:47:06 by jwe]
author jwe
date Thu, 07 Dec 2000 05:47:07 +0000
parents a908150a3a32
children 13905c3a24af
line wrap: on
line diff
--- a/src/DLD-FUNCTIONS/minmax.cc	Thu Nov 30 01:11:42 2000 +0000
+++ b/src/DLD-FUNCTIONS/minmax.cc	Thu Dec 07 05:47:07 2000 +0000
@@ -37,12 +37,18 @@
 // XXX FIXME XXX -- it would be nice to share code among the min/max
 // functions below.
 
+#define EMPTY_RETURN_CHECK(T) \
+  if (nr == 0 || nc == 0) \
+    return T (0, 0)
+
 static Matrix
 min (double d, const Matrix& m)
 {
   int nr = m.rows ();
   int nc = m.columns ();
 
+  EMPTY_RETURN_CHECK (Matrix);
+
   Matrix result (nr, nc);
 
   for (int j = 0; j < nc; j++)
@@ -58,6 +64,8 @@
   int nr = m.rows ();
   int nc = m.columns ();
 
+  EMPTY_RETURN_CHECK (Matrix);
+
   Matrix result (nr, nc);
 
   for (int j = 0; j < nc; j++)
@@ -73,6 +81,8 @@
   int nr = m.rows ();
   int nc = m.columns ();
 
+  EMPTY_RETURN_CHECK (ComplexMatrix);
+
   ComplexMatrix result (nr, nc);
 
   for (int j = 0; j < nc; j++)
@@ -88,6 +98,8 @@
   int nr = m.rows ();
   int nc = m.columns ();
 
+  EMPTY_RETURN_CHECK (ComplexMatrix);
+
   ComplexMatrix result (nr, nc);
 
   for (int j = 0; j < nc; j++)
@@ -102,12 +114,15 @@
 {
   int nr = a.rows ();
   int nc = a.columns ();
+
   if (nr != b.rows () || nc != b.columns ())
     {
       error ("two-arg min expecting args of same size");
       return Matrix ();
     }
 
+  EMPTY_RETURN_CHECK (Matrix);
+
   Matrix result (nr, nc);
 
   for (int j = 0; j < nc; j++)
@@ -122,12 +137,15 @@
 {
   int nr = a.rows ();
   int nc = a.columns ();
+
   if (nr != b.rows () || nc != b.columns ())
     {
       error ("two-arg min expecting args of same size");
       return ComplexMatrix ();
     }
 
+  EMPTY_RETURN_CHECK (ComplexMatrix);
+
   ComplexMatrix result (nr, nc);
 
   for (int j = 0; j < nc; j++)
@@ -161,6 +179,8 @@
   int nr = m.rows ();
   int nc = m.columns ();
 
+  EMPTY_RETURN_CHECK (Matrix);
+
   Matrix result (nr, nc);
 
   for (int j = 0; j < nc; j++)
@@ -176,6 +196,8 @@
   int nr = m.rows ();
   int nc = m.columns ();
 
+  EMPTY_RETURN_CHECK (Matrix);
+
   Matrix result (nr, nc);
 
   for (int j = 0; j < nc; j++)
@@ -191,6 +213,8 @@
   int nr = m.rows ();
   int nc = m.columns ();
 
+  EMPTY_RETURN_CHECK (ComplexMatrix);
+
   ComplexMatrix result (nr, nc);
 
   for (int j = 0; j < nc; j++)
@@ -206,6 +230,8 @@
   int nr = m.rows ();
   int nc = m.columns ();
 
+  EMPTY_RETURN_CHECK (ComplexMatrix);
+
   ComplexMatrix result (nr, nc);
 
   for (int j = 0; j < nc; j++)
@@ -220,12 +246,15 @@
 {
   int nr = a.rows ();
   int nc = a.columns ();
+
   if (nr != b.rows () || nc != b.columns ())
     {
       error ("two-arg max expecting args of same size");
       return Matrix ();
     }
 
+  EMPTY_RETURN_CHECK (Matrix);
+
   Matrix result (nr, nc);
 
   for (int j = 0; j < nc; j++)
@@ -240,12 +269,15 @@
 {
   int nr = a.rows ();
   int nc = a.columns ();
+
   if (nr != b.rows () || nc != b.columns ())
     {
       error ("two-arg max expecting args of same size");
       return ComplexMatrix ();
     }
 
+  EMPTY_RETURN_CHECK (ComplexMatrix);
+
   ComplexMatrix result (nr, nc);
 
   for (int j = 0; j < nc; j++)
@@ -273,6 +305,239 @@
   return result;
 }
 
+#define MINMAX_BODY(FCN) \
+ \
+  octave_value_list retval;  \
+ \
+  int nargin = args.length (); \
+ \
+  if (nargin < 1 || nargin > 2 || nargout > 2) \
+    { \
+      print_usage (#FCN); \
+      return retval; \
+    } \
+ \
+  octave_value arg1; \
+  octave_value arg2; \
+ \
+  switch (nargin) \
+    { \
+    case 2: \
+      arg2 = args(1); \
+ \
+    case 1: \
+      arg1 = args(0); \
+      break; \
+ \
+    default: \
+      panic_impossible (); \
+      break; \
+    } \
+ \
+  if (nargin == 1 && (nargout == 1 || nargout == 0)) \
+    { \
+      if (arg1.is_real_type ()) \
+	{ \
+	  Matrix m = arg1.matrix_value (); \
+ \
+	  if (! error_state) \
+	    { \
+	      if (m.rows () == 1) \
+		retval(0) = m.row_ ## FCN (); \
+	      else \
+		{ \
+		  if (m.rows () == 0 || m.columns () == 0) \
+		    retval(0) = Matrix (); \
+		  else \
+		    retval(0) = m.column_ ## FCN (); \
+		} \
+	    } \
+	} \
+      else if (arg1.is_complex_type ()) \
+	{ \
+	  ComplexMatrix m = arg1.complex_matrix_value (); \
+ \
+	  if (! error_state) \
+	    { \
+	      if (m.rows () == 1) \
+		retval(0) = m.row_ ## FCN (); \
+	      else \
+		{ \
+		  if (m.rows () == 0 || m.columns () == 0) \
+		    retval(0) = Matrix (); \
+		  else \
+		    retval(0) = m.column_ ## FCN (); \
+		} \
+	    } \
+	} \
+      else \
+	gripe_wrong_type_arg (#FCN, arg1); \
+    } \
+  else if (nargin == 1 && nargout == 2) \
+    { \
+      Array<int> index; \
+ \
+      if (arg1.is_real_type ()) \
+	{ \
+	  Matrix m = arg1.matrix_value (); \
+ \
+	  if (! error_state) \
+	    { \
+	      retval.resize (2); \
+ \
+	      if (m.rows () == 1) \
+		retval(0) = m.row_ ## FCN (index); \
+	      else \
+		{ \
+		  if (m.rows () == 0 || m.columns () == 0) \
+		    retval(0) = Matrix (); \
+		  else \
+		    retval(0) = m.column_ ## FCN (index); \
+		} \
+	    } \
+	} \
+      else if (arg1.is_complex_type ()) \
+	{ \
+	  ComplexMatrix m = arg1.complex_matrix_value (); \
+ \
+	  if (! error_state) \
+	    { \
+	      retval.resize (2); \
+ \
+	      if (m.rows () == 1) \
+		retval(0) = m.row_ ## FCN (index); \
+	      else \
+		{ \
+		  if (m.rows () == 0 || m.columns () == 0) \
+		    retval(0) = Matrix (); \
+		  else \
+		    retval(0) = m.column_ ## FCN (index); \
+		} \
+	    } \
+	} \
+      else \
+	gripe_wrong_type_arg (#FCN, arg1); \
+ \
+      int len = index.length (); \
+ \
+      if (len > 0) \
+	{ \
+	  RowVector idx (len); \
+ \
+	  for (int i = 0; i < len; i++) \
+	    { \
+	      int tmp = index.elem (i) + 1; \
+	      idx.elem (i) = (tmp <= 0) \
+		? octave_NaN : static_cast<double> (tmp); \
+	    } \
+ \
+	  retval(1) = idx; \
+	} \
+      else \
+	retval(1) = Matrix (); \
+    } \
+  else if (nargin == 2) \
+    { \
+      int arg1_is_scalar = arg1.is_scalar_type (); \
+      int arg2_is_scalar = arg2.is_scalar_type (); \
+ \
+      int arg1_is_complex = arg1.is_complex_type (); \
+      int arg2_is_complex = arg2.is_complex_type (); \
+ \
+      if (arg1_is_scalar) \
+	{ \
+	  if (arg1_is_complex || arg2_is_complex) \
+	    { \
+	      Complex c1 = arg1.complex_value (); \
+	      ComplexMatrix m2 = arg2.complex_matrix_value (); \
+	      if (! error_state) \
+		{ \
+		  ComplexMatrix result = FCN (c1, m2); \
+		  if (! error_state) \
+		    retval(0) = result; \
+		} \
+	    } \
+	  else \
+	    { \
+	      double d1 = arg1.double_value (); \
+	      Matrix m2 = arg2.matrix_value (); \
+ \
+	      if (! error_state) \
+		{ \
+		  Matrix result = FCN (d1, m2); \
+		  if (! error_state) \
+		    retval(0) = result; \
+		} \
+	    } \
+	} \
+      else if (arg2_is_scalar) \
+	{ \
+	  if (arg1_is_complex || arg2_is_complex) \
+	    { \
+	      ComplexMatrix m1 = arg1.complex_matrix_value (); \
+ \
+	      if (! error_state) \
+		{ \
+		  Complex c2 = arg2.complex_value (); \
+		  ComplexMatrix result = FCN (m1, c2); \
+		  if (! error_state) \
+		    retval(0) = result; \
+		} \
+	    } \
+	  else \
+	    { \
+	      Matrix m1 = arg1.matrix_value (); \
+ \
+	      if (! error_state) \
+		{ \
+		  double d2 = arg2.double_value (); \
+		  Matrix result = FCN (m1, d2); \
+		  if (! error_state) \
+		    retval(0) = result; \
+		} \
+	    } \
+	} \
+      else \
+	{ \
+	  if (arg1_is_complex || arg2_is_complex) \
+	    { \
+	      ComplexMatrix m1 = arg1.complex_matrix_value (); \
+ \
+	      if (! error_state) \
+		{ \
+		  ComplexMatrix m2 = arg2.complex_matrix_value (); \
+ \
+		  if (! error_state) \
+		    { \
+		      ComplexMatrix result = FCN (m1, m2); \
+		      if (! error_state) \
+			retval(0) = result; \
+		    } \
+		} \
+	    } \
+	  else \
+	    { \
+	      Matrix m1 = arg1.matrix_value (); \
+ \
+	      if (! error_state) \
+		{ \
+		  Matrix m2 = arg2.matrix_value (); \
+ \
+		  if (! error_state) \
+		    { \
+		      Matrix result = FCN (m1, m2); \
+		      if (! error_state) \
+			retval(0) = result; \
+		    } \
+		} \
+	    } \
+	} \
+    } \
+  else \
+    panic_impossible (); \
+ \
+  return retval
+
 DEFUN_DLD (min, args, nargout,
   "-*- texinfo -*-\n\
 For a vector argument, return the minimum value.  For a matrix\n\
@@ -298,215 +563,7 @@
 @noindent\n\
 returns @var{x} = 0 and @var{ix} = 3.")
 {
-  octave_value_list retval;
-
-  int nargin = args.length ();
-
-  if (nargin < 1 || nargin > 2 || nargout > 2)
-    {
-      print_usage ("min");
-      return retval;
-    }
-
-  octave_value arg1;
-  octave_value arg2;
-
-  switch (nargin)
-    {
-    case 2:
-      arg2 = args(1);
-      // Fall through...
-
-    case 1:
-      arg1 = args(0);
-      break;
-
-    default:
-      panic_impossible ();
-      break;
-    }
-
-  if (nargin == 1 && (nargout == 1 || nargout == 0))
-    {
-      if (arg1.is_real_type ())
-	{
-	  Matrix m = arg1.matrix_value ();
-
-	  if (! error_state)
-	    {
-	      if (m.rows () == 1)
-		retval(0) = m.row_min ();
-	      else
-		retval(0) = m.column_min ();
-	    }
-	}
-      else if (arg1.is_complex_type ())
-	{
-	  ComplexMatrix m = arg1.complex_matrix_value ();
-
-	  if (! error_state)
-	    {
-	      if (m.rows () == 1)
-		retval(0) = m.row_min ();
-	      else
-		retval(0) = m.column_min ();
-	    }
-	}
-      else
-	gripe_wrong_type_arg ("min", arg1);
-    }
-  else if (nargin == 1 && nargout == 2)
-    {
-      Array<int> index;
-
-      if (arg1.is_real_type ())
-	{
-	  Matrix m = arg1.matrix_value ();
-
-	  if (! error_state)
-	    {
-	      retval.resize (2);
-
-	      if (m.rows () == 1)
-		retval(0) = m.row_min (index);
-	      else
-		retval(0) = m.column_min (index);
-	    }
-	}
-      else if (arg1.is_complex_type ())
-	{
-	  ComplexMatrix m = arg1.complex_matrix_value ();
-
-	  if (! error_state)
-	    {
-	      retval.resize (2);
-
-	      if (m.rows () == 1)
-		retval(0) = m.row_min (index);
-	      else
-		retval(0) = m.column_min (index);
-	    }
-	}
-      else
-	gripe_wrong_type_arg ("min", arg1);
-
-      int len = index.length ();
-
-      if (len > 0)
-	{
-	  RowVector idx (len);
-
-	  for (int i = 0; i < len; i++)
-	    {
-	      int tmp = index.elem (i) + 1;
-	      idx.elem (i) = (tmp <= 0)
-		? octave_NaN : static_cast<double> (tmp);
-	    }
-
-	  retval(1) = idx;
-	}
-    }
-  else if (nargin == 2)
-    {
-      int arg1_is_scalar = arg1.is_scalar_type ();
-      int arg2_is_scalar = arg2.is_scalar_type ();
-
-      int arg1_is_complex = arg1.is_complex_type ();
-      int arg2_is_complex = arg2.is_complex_type ();
-
-      if (arg1_is_scalar)
-	{
-	  if (arg1_is_complex || arg2_is_complex)
-	    {
-	      Complex c1 = arg1.complex_value ();
-	      ComplexMatrix m2 = arg2.complex_matrix_value ();
-	      if (! error_state)
-		{
-		  ComplexMatrix result = min (c1, m2);
-		  if (! error_state)
-		    retval(0) = result;
-		}
-	    }
-	  else
-	    {
-	      double d1 = arg1.double_value ();
-	      Matrix m2 = arg2.matrix_value ();
-
-	      if (! error_state)
-		{
-		  Matrix result = min (d1, m2);
-		  if (! error_state)
-		    retval(0) = result;
-		}
-	    }
-	}
-      else if (arg2_is_scalar)
-	{
-	  if (arg1_is_complex || arg2_is_complex)
-	    {
-	      ComplexMatrix m1 = arg1.complex_matrix_value ();
-
-	      if (! error_state)
-		{
-		  Complex c2 = arg2.complex_value ();
-		  ComplexMatrix result = min (m1, c2);
-		  if (! error_state)
-		    retval(0) = result;
-		}
-	    }
-	  else
-	    {
-	      Matrix m1 = arg1.matrix_value ();
-
-	      if (! error_state)
-		{
-		  double d2 = arg2.double_value ();
-		  Matrix result = min (m1, d2);
-		  if (! error_state)
-		    retval(0) = result;
-		}
-	    }
-	}
-      else
-	{
-	  if (arg1_is_complex || arg2_is_complex)
-	    {
-	      ComplexMatrix m1 = arg1.complex_matrix_value ();
-
-	      if (! error_state)
-		{
-		  ComplexMatrix m2 = arg2.complex_matrix_value ();
-
-		  if (! error_state)
-		    {
-		      ComplexMatrix result = min (m1, m2);
-		      if (! error_state)
-			retval(0) = result;
-		    }
-		}
-	    }
-	  else
-	    {
-	      Matrix m1 = arg1.matrix_value ();
-
-	      if (! error_state)
-		{
-		  Matrix m2 = arg2.matrix_value ();
-
-		  if (! error_state)
-		    {
-		      Matrix result = min (m1, m2);
-		      if (! error_state)
-			retval(0) = result;
-		    }
-		}
-	    }
-	}
-    }
-  else
-    panic_impossible ();
-
-  return retval;
+  MINMAX_BODY (min);
 }
 
 DEFUN_DLD (max, args, nargout,
@@ -534,215 +591,7 @@
 @noindent\n\
 returns @var{x} = 5 and @var{ix} = 3.")
 {
-  octave_value_list retval;
-
-  int nargin = args.length ();
-
-  if (nargin < 1 || nargin > 2 || nargout > 2)
-    {
-      print_usage ("max");
-      return retval;
-    }
-
-  octave_value arg1;
-  octave_value arg2;
-
-  switch (nargin)
-    {
-    case 2:
-      arg2 = args(1);
-      // Fall through...
-
-    case 1:
-      arg1 = args(0);
-      break;
-
-    default:
-      panic_impossible ();
-      break;
-    }
-
-  if (nargin == 1 && (nargout == 1 || nargout == 0))
-    {
-      if (arg1.is_real_type ())
-	{
-	  Matrix m = arg1.matrix_value ();
-
-	  if (! error_state)
-	    {
-	      if (m.rows () == 1)
-		retval(0) = m.row_max ();
-	      else
-		retval(0) = m.column_max ();
-	    }
-	}
-      else if (arg1.is_complex_type ())
-	{
-	  ComplexMatrix m = arg1.complex_matrix_value ();
-
-	  if (! error_state)
-	    {
-	      if (m.rows () == 1)
-		retval(0) = m.row_max ();
-	      else
-		retval(0) = m.column_max ();
-	    }
-	}
-      else
-	gripe_wrong_type_arg ("max", arg1);
-    }
-  else if (nargin == 1 && nargout == 2)
-    {
-      Array<int> index;
-
-      if (arg1.is_real_type ())
-	{
-	  Matrix m = arg1.matrix_value ();
-
-	  if (! error_state)
-	    {
-	      retval.resize (2);
-
-	      if (m.rows () == 1)
-		retval(0) = m.row_max (index);
-	      else
-		retval(0) = m.column_max (index);
-	    }
-	}
-      else if (arg1.is_complex_type ())
-	{
-	  ComplexMatrix m = arg1.complex_matrix_value ();
-
-	  if (! error_state)
-	    {
-	      retval.resize (2);
-
-	      if (m.rows () == 1)
-		retval(0) = m.row_max (index);
-	      else
-		retval(0) = m.column_max (index);
-	    }
-	}
-      else
-	gripe_wrong_type_arg ("max", arg1);
-
-      int len = index.length ();
-
-      if (len > 0)
-	{
-	  RowVector idx (len);
-
-	  for (int i = 0; i < len; i++)
-	    {
-	      int tmp = index.elem (i) + 1;
-	      idx.elem (i) = (tmp <= 0)
-		? octave_NaN : static_cast<double> (tmp);
-	    }
-
-	  retval(1) = idx;
-	}
-    }
-  else if (nargin == 2)
-    {
-      int arg1_is_scalar = arg1.is_scalar_type ();
-      int arg2_is_scalar = arg2.is_scalar_type ();
-
-      int arg1_is_complex = arg1.is_complex_type ();
-      int arg2_is_complex = arg2.is_complex_type ();
-
-      if (arg1_is_scalar)
-	{
-	  if (arg1_is_complex || arg2_is_complex)
-	    {
-	      Complex c1 = arg1.complex_value ();
-	      ComplexMatrix m2 = arg2.complex_matrix_value ();
-	      if (! error_state)
-		{
-		  ComplexMatrix result = max (c1, m2);
-		  if (! error_state)
-		    retval(0) = result;
-		}
-	    }
-	  else
-	    {
-	      double d1 = arg1.double_value ();
-	      Matrix m2 = arg2.matrix_value ();
-
-	      if (! error_state)
-		{
-		  Matrix result = max (d1, m2);
-		  if (! error_state)
-		    retval(0) = result;
-		}
-	    }
-	}
-      else if (arg2_is_scalar)
-	{
-	  if (arg1_is_complex || arg2_is_complex)
-	    {
-	      ComplexMatrix m1 = arg1.complex_matrix_value ();
-
-	      if (! error_state)
-		{
-		  Complex c2 = arg2.complex_value ();
-		  ComplexMatrix result = max (m1, c2);
-		  if (! error_state)
-		    retval(0) = result;
-		}
-	    }
-	  else
-	    {
-	      Matrix m1 = arg1.matrix_value ();
-
-	      if (! error_state)
-		{
-		  double d2 = arg2.double_value ();
-		  Matrix result = max (m1, d2);
-		  if (! error_state)
-		    retval(0) = result;
-		}
-	    }
-	}
-      else
-	{
-	  if (arg1_is_complex || arg2_is_complex)
-	    {
-	      ComplexMatrix m1 = arg1.complex_matrix_value ();
-
-	      if (! error_state)
-		{
-		  ComplexMatrix m2 = arg2.complex_matrix_value ();
-
-		  if (! error_state)
-		    {
-		      ComplexMatrix result = max (m1, m2);
-		      if (! error_state)
-			retval(0) = result;
-		    }
-		}
-	    }
-	  else
-	    {
-	      Matrix m1 = arg1.matrix_value ();
-
-	      if (! error_state)
-		{
-		  Matrix m2 = arg2.matrix_value ();
-
-		  if (! error_state)
-		    {
-		      Matrix result = max (m1, m2);
-		      if (! error_state)
-			retval(0) = result;
-		    }
-		}
-	    }
-	}
-    }
-  else
-    panic_impossible ();
-
-  return retval;
+  MINMAX_BODY (max);
 }
 
 /*