diff liboctave/MArray-defs.h @ 6508:184ab67c3bc1

[project @ 2007-04-07 00:43:09 by jwe]
author jwe
date Sat, 07 Apr 2007 00:43:10 +0000
parents 143b556ce725
children 0ce71beb1cf3
line wrap: on
line diff
--- a/liboctave/MArray-defs.h	Fri Apr 06 20:00:38 2007 +0000
+++ b/liboctave/MArray-defs.h	Sat Apr 07 00:43:10 2007 +0000
@@ -321,6 +321,78 @@
   MDIAGARRAY2_DADA_BINOP_FWD_DEFS \
     (R, T, dynamic_cast<const B<T>&>, R, dynamic_cast<const B<T>&>, R)
 
+#define MARRAY_NORM_BODY(TYPE, blas_norm, BLAS_NORM)	\
+ \
+  double retval = octave_NaN; \
+ \
+  octave_idx_type len = length (); \
+ \
+  if (len > 0) \
+    { \
+      const TYPE *d = data (); \
+ \
+      if (p == -1) \
+	{ \
+	  /* Frobenius norm.  */ \
+	  retval = 0; \
+ \
+	  for (octave_idx_type i = 0; i < len; i++) \
+	    { \
+	      double d_abs = std::abs (d[i]); \
+	      retval += d_abs * d_abs; \
+	    } \
+ \
+	  retval = ::sqrt (retval); \
+	} \
+      else if (p == 2) \
+	F77_FCN (blas_norm, BLAS_NORM) (len, d, 1, retval); \
+      else if (xisinf (p)) \
+	{ \
+	  octave_idx_type i = 0; \
+ \
+	  while (i < len && xisnan (d[i])) \
+	    i++; \
+ \
+	  if (i < len) \
+	    retval = std::abs (d[i]); \
+ \
+	  if (p > 0) \
+	    { \
+	      while (i < len) \
+		{ \
+		  double d_abs = std::abs (d[i++]); \
+ \
+		  if (d_abs > retval) \
+		    retval = d_abs; \
+		} \
+	    } \
+	  else \
+	    { \
+	      while (i < len) \
+		{ \
+		  double d_abs = std::abs (d[i++]); \
+ \
+		  if (d_abs < retval) \
+		    retval = d_abs; \
+		} \
+	    } \
+	} \
+      else \
+	{ \
+	  retval = 0; \
+ \
+	  for (octave_idx_type i = 0; i < len; i++) \
+	    { \
+	      double d_abs = std::abs (d[i]); \
+	      retval += pow (d_abs, p); \
+	    } \
+ \
+	  retval = pow (retval, 1/p); \
+	} \
+    } \
+ \
+  return retval
+
 // Now we have all the definitions we need.
 
 #endif