diff src/ov-cx-diag.cc @ 8381:ad896677a2e2

implement binary saving of diag & perm matrices
author Jaroslav Hajek <highegg@gmail.com>
date Mon, 08 Dec 2008 12:31:57 +0100
parents 8b1a2555c4e2
children d95282fa0579
line wrap: on
line diff
--- a/src/ov-cx-diag.cc
+++ b/src/ov-cx-diag.cc
@@ -24,12 +24,15 @@
 #include <config.h>
 #endif
 
+#include "byte-swap.h"
+
 #include "ov-cx-diag.h"
 #include "ov-flt-cx-diag.h"
 #include "ov-re-diag.h"
 #include "ov-base-diag.cc"
 #include "ov-complex.h"
 #include "ov-cx-mat.h"
+#include "ls-utils.h"
 
 template class octave_base_diag<ComplexDiagMatrix, ComplexMatrix>;
 
@@ -156,3 +159,64 @@
   return ::imag (matrix);
 }
 
+bool 
+octave_complex_diag_matrix::save_binary (std::ostream& os, bool& save_as_floats)
+{
+
+  int32_t r = matrix.rows (), c = matrix.cols ();
+  os.write (reinterpret_cast<char *> (&r), 4);
+  os.write (reinterpret_cast<char *> (&c), 4);
+
+  ComplexMatrix m = ComplexMatrix (matrix.diag ());
+  save_type st = LS_DOUBLE;
+  if (save_as_floats)
+    {
+      if (m.too_large_for_float ())
+	{
+	  warning ("save: some values too large to save as floats --");
+	  warning ("save: saving as doubles instead");
+	}
+      else
+	st = LS_FLOAT;
+    }
+  else if (matrix.length () > 4096) // FIXME -- make this configurable.
+    {
+      double max_val, min_val;
+      if (m.all_integers (max_val, min_val))
+	st = get_save_type (max_val, min_val);
+    }
+
+  const Complex *mtmp = m.data ();
+  write_doubles (os, reinterpret_cast<const double *> (mtmp), st, 2 * m.numel ());
+
+  return true;
+}
+
+bool 
+octave_complex_diag_matrix::load_binary (std::istream& is, bool swap,
+				 oct_mach_info::float_format fmt)
+{
+  int32_t r, c;
+  char tmp;
+  if (! (is.read (reinterpret_cast<char *> (&r), 4)
+         && is.read (reinterpret_cast<char *> (&c), 4)
+         && is.read (reinterpret_cast<char *> (&tmp), 1)))
+    return false;
+  if (swap)
+    {
+      swap_bytes<4> (&r);
+      swap_bytes<4> (&c);
+    }
+
+  ComplexDiagMatrix m (r, c);
+  Complex *im = m.fortran_vec ();
+  octave_idx_type len = m.length ();
+  read_doubles (is, reinterpret_cast<double *> (im),
+                static_cast<save_type> (tmp), 2 * len, swap, fmt);
+  if (error_state || ! is)
+    return false;
+  matrix = m;
+
+  return true;
+}
+