diff liboctave/dNDArray.cc @ 4634:79fe96966ca0

[project @ 2003-11-19 21:22:39 by jwe]
author jwe
date Wed, 19 Nov 2003 21:23:19 +0000
parents 19bfd295f400
children e95c86d48732
line wrap: on
line diff
--- a/liboctave/dNDArray.cc
+++ b/liboctave/dNDArray.cc
@@ -29,11 +29,14 @@
 #include <config.h>
 #endif
 
+#include <cfloat>
+
 #include "Array-util.h"
 #include "dNDArray.h"
 #include "mx-base.h"
 #include "lo-error.h"
 #include "lo-ieee.h"
+#include "lo-mappers.h"
 
 NDArray::NDArray (const boolNDArray& a)
   : MArrayN<double> (a.dims ())
@@ -62,9 +65,111 @@
   return b;
 }
 
+bool
+NDArray::any_element_is_negative (bool neg_zero) const
+{
+  int nel = nelem ();
+
+  if (neg_zero)
+    {
+      for (int i = 0; i < nel; i++)
+	if (lo_ieee_signbit (elem (i)))
+	  return true;
+    }
+  else
+    {
+      for (int i = 0; i < nel; i++)
+	if (elem (i) < 0)
+	  return true;
+    }
+
+  return false;
+}
+
+
+bool
+NDArray::any_element_is_inf_or_nan (void) const
+{
+  int nel = nelem ();
+
+  for (int i = 0; i < nel; i++)
+    {
+      double val = elem (i);
+      if (xisinf (val) || xisnan (val))
+	return true;
+    }
+
+  return false;
+}
+
+bool
+NDArray::all_elements_are_int_or_inf_or_nan (void) const
+{
+  int nel = nelem ();
+
+  for (int i = 0; i < nel; i++)
+    {
+      double val = elem (i);
+      if (xisnan (val) || D_NINT (val) == val)
+	continue;
+      else
+	return false;
+    }
+
+  return true;
+}
+
+// Return nonzero if any element of M is not an integer.  Also extract
+// the largest and smallest values and return them in MAX_VAL and MIN_VAL.
+
+bool
+NDArray::all_integers (double& max_val, double& min_val) const
+{
+  int nel = nelem ();
+
+  if (nel > 0)
+    {
+      max_val = elem (0);
+      min_val = elem (0);
+    }
+  else
+    return false;
+
+  for (int i = 0; i < nel; i++)
+    {
+      double val = elem (i);
+
+      if (val > max_val)
+	max_val = val;
+
+      if (val < min_val)
+	min_val = val;
+
+      if (D_NINT (val) != val)
+	return false;
+    }
+
+  return true;
+}
+
+bool
+NDArray::too_large_for_float (void) const
+{
+  int nel = nelem ();
+
+  for (int i = 0; i < nel; i++)
+    {
+      double val = elem (i);
+
+      if (val > FLT_MAX || val < FLT_MIN)
+	return true;
+    }
+
+  return false;
+}
+
 // XXX FIXME XXX -- this is not quite the right thing.
 
-
 boolNDArray
 NDArray::all (int dim) const
 {
@@ -107,30 +212,39 @@
   MX_ND_REAL_OP_REDUCTION (+= elem (iter_idx), 0);
 }
 
-Matrix
+NDArray
+real (const ComplexNDArray& a)
+{
+  int a_len = a.length ();
+  NDArray retval;
+  if (a_len > 0)
+    retval = NDArray (mx_inline_real_dup (a.data (), a_len), a.dims ());
+  return retval;
+}
+
+NDArray
+imag (const ComplexNDArray& a)
+{
+  int a_len = a.length ();
+  NDArray retval;
+  if (a_len > 0)
+    retval = NDArray (mx_inline_imag_dup (a.data (), a_len), a.dims ());
+  return retval;
+}
+
+NDArray
 NDArray::abs (void) const
 {
-  Matrix retval;
-
-  if (dims () . length () == 2)
-    {
-      int nr = rows ();
-      int nc = cols ();
+  NDArray retval (dims ());
 
-      retval.resize (nr, nc);
-      
-      for (int j = 0; j < nc; j++)
-	for (int i = 0; i < nr; i++)
-	  retval(i,j) = fabs (elem (i, j));
-    }
-  else
-    (*current_liboctave_error_handler)
-      ("abs is not yet implemented for N-d arrays");
+  int nel = nelem ();
+
+  for (int i = 0; i < nel; i++)
+    retval(i) = fabs (elem (i));
 
   return retval;
 }
 
-
 Matrix
 NDArray::matrix_value (void) const
 {
@@ -172,56 +286,6 @@
   return ::compute_index (ra_idx, dimensions);
 }
 
-bool
-NDArray::any_element_is_negative (bool neg_zero) const
-{
-  int n = length (); 
-  if (neg_zero)
-    {
-      for (int i = 0; i < n; i++)
-	if (lo_ieee_signbit (Array<double>::elem (i)))
-	  return true;
-    }
-  else
-    {
-      for (int i = 0; i < n; i++)
-	if (Array<double>::elem (i) < 0)
-	  return true;
-    }
- 
- return false;
-}
-
-bool
-NDArray::all_integers (double& max_val, double& min_val) const
-{
-  int n = length ();
-
-  if (n > 0)
-    {
-      max_val = Array<double>::elem (0);
-      min_val = Array<double>::elem (0);
-    }
-  else 
-    return false;
-
-  for (int i = 0; i < n; i++)
-    {
-      double val = Array<double>::elem (0);
-      
-      if (val > max_val)
-	max_val = val;
-
-      if (val < min_val)
-	min_val = val;
-
-      if (D_NINT (val) != val)
-	return false;
-    }
-
-  return true;
-}
-
 NDS_CMP_OPS(NDArray, , double, )
 NDS_BOOL_OPS(NDArray, double, 0.0)