diff src/minmax.cc @ 839:b8530da02bb7

[project @ 1994-10-19 21:44:00 by jwe]
author jwe
date Wed, 19 Oct 1994 21:44:46 +0000
parents efdb7d3eddd8
children 9e6bdfdfcf86
line wrap: on
line diff
--- a/src/minmax.cc	Wed Oct 19 20:58:27 1994 +0000
+++ b/src/minmax.cc	Wed Oct 19 21:44:46 1994 +0000
@@ -1,4 +1,4 @@
-// f-minmax.cc                                           -*- C++ -*-
+// f-minmax.cc						 -*- C++ -*-
 /*
 
 Copyright (C) 1994 John W. Eaton
@@ -41,6 +41,91 @@
 #define MIN(a,b) ((a) < (b) ? (a) : (b))
 #endif
 
+// This file could probably be condensed quite a bit by an appropriate
+// amount of C preprocessor abuse.
+
+static Matrix
+min (double d, const Matrix& m)
+{
+  int nr = m.rows ();
+  int nc = m.columns ();
+
+  Matrix result (nr, nc);
+
+  for (int j = 0; j < nc; j++)
+    for (int i = 0; i < nr; i++)
+      {
+	double m_elem = m.elem (i, j);
+	result.elem (i, j) = MIN (d, m_elem);
+      }
+
+  return result;
+}
+
+static Matrix
+min (const Matrix& m, double d)
+{
+  int nr = m.rows ();
+  int nc = m.columns ();
+
+  Matrix result (nr, nc);
+
+  for (int j = 0; j < nc; j++)
+    for (int i = 0; i < nr; i++)
+      {
+	double m_elem = m.elem (i, j);
+	result.elem (i, j) = MIN (m_elem, d);
+      }
+
+  return result;
+}
+
+static ComplexMatrix
+min (const Complex& c, const ComplexMatrix& m)
+{
+  int nr = m.rows ();
+  int nc = m.columns ();
+
+  ComplexMatrix result (nr, nc);
+
+  double abs_c = abs (c);
+
+  for (int j = 0; j < nc; j++)
+    for (int i = 0; i < nr; i++)
+      {
+	double abs_m_elem = abs (m.elem (i, j));
+	if (abs_c < abs_m_elem)
+	  result.elem (i, j) = c;
+	else
+	  result.elem (i, j) = m.elem (i, j);
+      }
+
+  return result;
+}
+
+static ComplexMatrix
+min (const ComplexMatrix& m, const Complex& c)
+{
+  int nr = m.rows ();
+  int nc = m.columns ();
+
+  ComplexMatrix result (nr, nc);
+
+  double abs_c = abs (c);
+
+  for (int j = 0; j < nc; j++)
+    for (int i = 0; i < nr; i++)
+      {
+	double abs_m_elem = abs (m.elem (i, j));
+	if (abs_m_elem < abs_c)
+	  result.elem (i, j) = m.elem (i, j);
+	else
+	  result.elem (i, j) = c;
+      }
+
+  return result;
+}
+
 static Matrix
 min (const Matrix& a, const Matrix& b)
 {
@@ -81,12 +166,94 @@
   for (int j = 0; j < nc; j++)
     for (int i = 0; i < nr; i++)
       {
-        double abs_a_elem = abs (a.elem (i, j));
-        double abs_b_elem = abs (b.elem (i, j));
-        if (abs_a_elem < abs_b_elem)
-          result.elem (i, j) = a.elem (i, j);
-        else
-          result.elem (i, j) = b.elem (i, j);
+	double abs_a_elem = abs (a.elem (i, j));
+	double abs_b_elem = abs (b.elem (i, j));
+	if (abs_a_elem < abs_b_elem)
+	  result.elem (i, j) = a.elem (i, j);
+	else
+	  result.elem (i, j) = b.elem (i, j);
+      }
+
+  return result;
+}
+
+static Matrix
+max (double d, const Matrix& m)
+{
+  int nr = m.rows ();
+  int nc = m.columns ();
+
+  Matrix result (nr, nc);
+
+  for (int j = 0; j < nc; j++)
+    for (int i = 0; i < nr; i++)
+      {
+	double m_elem = m.elem (i, j);
+	result.elem (i, j) = MAX (d, m_elem);
+      }
+
+  return result;
+}
+
+static Matrix
+max (const Matrix& m, double d)
+{
+  int nr = m.rows ();
+  int nc = m.columns ();
+
+  Matrix result (nr, nc);
+
+  for (int j = 0; j < nc; j++)
+    for (int i = 0; i < nr; i++)
+      {
+	double m_elem = m.elem (i, j);
+	result.elem (i, j) = MAX (m_elem, d);
+      }
+
+  return result;
+}
+
+static ComplexMatrix
+max (const Complex& c, const ComplexMatrix& m)
+{
+  int nr = m.rows ();
+  int nc = m.columns ();
+
+  ComplexMatrix result (nr, nc);
+
+  double abs_c = abs (c);
+
+  for (int j = 0; j < nc; j++)
+    for (int i = 0; i < nr; i++)
+      {
+	double abs_m_elem = abs (m.elem (i, j));
+	if (abs_c > abs_m_elem)
+	  result.elem (i, j) = c;
+	else
+	  result.elem (i, j) = m.elem (i, j);
+      }
+
+  return result;
+}
+
+static ComplexMatrix
+max (const ComplexMatrix& m, const Complex& c)
+{
+  int nr = m.rows ();
+  int nc = m.columns ();
+
+  ComplexMatrix result (nr, nc);
+
+  double abs_c = abs (c);
+
+  for (int j = 0; j < nc; j++)
+    for (int i = 0; i < nr; i++)
+      {
+	double abs_m_elem = abs (m.elem (i, j));
+	if (abs_m_elem > abs_c)
+	  result.elem (i, j) = m.elem (i, j);
+	else
+	  result.elem (i, j) = c;
       }
 
   return result;
@@ -132,18 +299,17 @@
   for (int j = 0; j < nc; j++)
     for (int i = 0; i < nr; i++)
       {
-        double abs_a_elem = abs (a.elem (i, j));
-        double abs_b_elem = abs (b.elem (i, j));
-        if (abs_a_elem > abs_b_elem)
-          result.elem (i, j) = a.elem (i, j);
-        else
-          result.elem (i, j) = b.elem (i, j);
+	double abs_a_elem = abs (a.elem (i, j));
+	double abs_b_elem = abs (b.elem (i, j));
+	if (abs_a_elem > abs_b_elem)
+	  result.elem (i, j) = a.elem (i, j);
+	else
+	  result.elem (i, j) = b.elem (i, j);
       }
 
   return result;
 }
 
-
 DEFUN_DLD_BUILTIN ("min", Fmin, Smin, 3, 2,
   "min (X): minimum value(s) of a vector (matrix)")
 {
@@ -183,7 +349,7 @@
 	}
       else if (arg1.is_complex_scalar ())
 	{
-          retval(0) = arg1.complex_value ();
+	  retval(0) = arg1.complex_value ();
 	}
       else if (arg1.is_real_type ())
 	{
@@ -218,7 +384,7 @@
   else if (nargin == 1 && nargout == 2)
     {
       if (arg1.is_real_scalar ())
-        {
+	{
 	  retval(1) = 1;
 	  retval(0) = arg1.double_value ();
 	}
@@ -267,30 +433,72 @@
 	{
 	  gripe_wrong_type_arg ("min", arg1);
 	  return retval;
-        }
+	}
     }
   else if (nargin == 2)
     {
-      if (arg1.rows () == arg2.rows ()
-	  && arg1.columns () == arg2.columns ())
+      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_real_type () && arg2.is_real_type ())
+	  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)
 		{
-		  Matrix m2 = arg2.matrix_value ();
-
+		  double d2 = arg2.double_value ();
+		  Matrix result = min (m1, d2);
 		  if (! error_state)
-		    {
-		      Matrix result = min (m1, m2);
-		      if (! error_state)
-			retval(0) = result;
-		    }
+		    retval(0) = result;
 		}
 	    }
-	  else if (arg1.is_complex_type () || arg2.is_complex_type ())
+	}
+      else
+	{
+	  if (arg1_is_complex || arg2_is_complex)
 	    {
 	      ComplexMatrix m1 = arg1.complex_matrix_value ();
 
@@ -308,12 +516,21 @@
 	    }
 	  else
 	    {
-	      gripe_wrong_type_arg ("min", arg1);
-	      return retval;
+	      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
-	error ("min: nonconformant matrices");
     }
   else
     panic_impossible ();
@@ -360,23 +577,31 @@
 	}
       else if (arg1.is_complex_scalar ())
 	{
-          retval(0) = arg1.complex_value ();
+	  retval(0) = arg1.complex_value ();
 	}
       else if (arg1.is_real_type ())
 	{
 	  Matrix m = arg1.matrix_value ();
-	  if (m.rows () == 1)
-	    retval(0) = m.row_max ();
-	  else
-	    retval(0) = tree_constant (m.column_max (), 0);
+
+	  if (! error_state)
+	    {
+	      if (m.rows () == 1)
+		retval(0) = m.row_max ();
+	      else
+		retval(0) = tree_constant (m.column_max (), 0);
+	    }
 	}
       else if (arg1.is_complex_type ())
 	{
 	  ComplexMatrix m = arg1.complex_matrix_value ();
-	  if (m.rows () == 1)
-	    retval(0) = m.row_max ();
-	  else
-	    retval(0) = tree_constant (m.column_max (), 0);
+
+	  if (! error_state)
+	    {
+	      if (m.rows () == 1)
+		retval(0) = m.row_max ();
+	      else
+		retval(0) = tree_constant (m.column_max (), 0);
+	    }
 	}
       else
 	{
@@ -399,29 +624,37 @@
       else if (arg1.is_real_type ())
 	{
 	  Matrix m = arg1.matrix_value ();
-	  if (m.rows () == 1)
+
+	  if (! error_state)
 	    {
-	      retval(1) = m.row_max_loc ();
-	      retval(0) = m.row_max ();
-	    }
-	  else
-	    {
-	      retval(1) = tree_constant (m.column_max_loc (), 0);
-	      retval(0) = tree_constant (m.column_max (), 0);
+	      if (m.rows () == 1)
+		{
+		  retval(1) = m.row_max_loc ();
+		  retval(0) = m.row_max ();
+		}
+	      else
+		{
+		  retval(1) = tree_constant (m.column_max_loc (), 0);
+		  retval(0) = tree_constant (m.column_max (), 0);
+		}
 	    }
 	}
       else if (arg1.is_complex_type ())
 	{
 	  ComplexMatrix m = arg1.complex_matrix_value ();
-	  if (m.rows () == 1)
+
+	  if (! error_state)
 	    {
-	      retval(1) = m.row_max_loc ();
-	      retval(0) = m.row_max ();
-	    }
-	  else
-	    {
-	      retval(1) = tree_constant (m.column_max_loc (), 0);
-	      retval(0) = tree_constant (m.column_max (), 0);
+	      if (m.rows () == 1)
+		{
+		  retval(1) = m.row_max_loc ();
+		  retval(0) = m.row_max ();
+		}
+	      else
+		{
+		  retval(1) = tree_constant (m.column_max_loc (), 0);
+		  retval(0) = tree_constant (m.column_max (), 0);
+		}
 	    }
 	}
       else
@@ -432,50 +665,100 @@
     }
   else if (nargin == 2)
     {
-      if (arg1.rows () == arg2.rows ()
-	  && arg1.columns () == arg2.columns ())
+      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)
 	{
-// XXX FIXME XXX -- I don't think this is quite right.
-          if (arg1.is_real_scalar ())
-            {
-	      double result;
-	      double a_elem = arg1.double_value ();
-	      double b_elem = arg2.double_value ();
-	      result = MAX (a_elem, b_elem);
-	      retval(0) = result;
+	  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 if (arg1.is_complex_scalar ())
+	  else
 	    {
-	      Complex result;
-	      Complex a_elem = arg1.complex_value ();
-	      Complex b_elem = arg2.complex_value ();
-	      if (abs (a_elem) > abs (b_elem))
-		result = a_elem;
-	      else
-		result = b_elem;
-	      retval(0) = result;
+	      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 (arg1.is_real_type ())
+	}
+      else if (arg2_is_scalar)
+	{
+	  if (arg1_is_complex || arg2_is_complex)
 	    {
-	      Matrix result;
-	      result = max (arg1.matrix_value (), arg2.matrix_value ());
-	      retval(0) = result;
+	      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 if (arg1.is_complex_type ())
+	  else
 	    {
-	      ComplexMatrix result;
-	      result = max (arg1.complex_matrix_value (),
-			    arg2.complex_matrix_value ());
-	      retval(0) = result;
-	    }
-	  else 
-	    {
-	      gripe_wrong_type_arg ("max", arg1);
-	      return retval;
+	      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
-	error ("max: nonconformant matrices");
+	{
+	  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 ();