changeset 1989:a4b0826e240c

[project @ 1996-03-02 00:33:22 by jwe]
author jwe
date Sat, 02 Mar 1996 00:34:12 +0000
parents 7b56630a1e05
children e0ee423d053d
files liboctave/Array-C.cc liboctave/Array-ch.cc liboctave/Array-d.cc liboctave/Array-i.cc liboctave/Array-idx.h liboctave/Array-s.cc liboctave/Array.cc liboctave/Array.h liboctave/CDiagMatrix.cc liboctave/CDiagMatrix.h liboctave/CMatrix.h liboctave/MArray-C.cc liboctave/MArray-ch.cc liboctave/MArray-d.cc liboctave/MArray-i.cc liboctave/MArray-s.cc liboctave/MArray.cc liboctave/MArray.h liboctave/chMatrix.h liboctave/dDiagMatrix.h liboctave/dMatrix.h
diffstat 21 files changed, 163 insertions(+), 1444 deletions(-) [+]
line wrap: on
line diff
--- a/liboctave/Array-C.cc
+++ b/liboctave/Array-C.cc
@@ -23,14 +23,12 @@
 
 // Instantiate Arrays of Complex values.
 
+#include "oct-cmplx.h"
+
 #include "Array.h"
 #include "Array.cc"
 
-#include "oct-cmplx.h"
-
 template class Array<Complex>;
-template class Array2<Complex>;
-template class DiagArray<Complex>;
 
 template void assign (Array<Complex>&, const Array<Complex>&);
 template void assign (Array<Complex>&, const Array<double>&);
@@ -38,12 +36,22 @@
 template void assign (Array<Complex>&, const Array<short>&);
 template void assign (Array<Complex>&, const Array<char>&);
 
+#include "Array2.h"
+#include "Array2.cc"
+
+template class Array2<Complex>;
+
 template void assign (Array2<Complex>&, const Array2<Complex>&);
 template void assign (Array2<Complex>&, const Array2<double>&);
 template void assign (Array2<Complex>&, const Array2<int>&);
 template void assign (Array2<Complex>&, const Array2<short>&);
 template void assign (Array2<Complex>&, const Array2<char>&);
 
+#include "DiagArray2.h"
+#include "DiagArray2.cc"
+
+template class DiagArray2<Complex>;
+
 /*
 ;;; Local Variables: ***
 ;;; mode: C++ ***
--- a/liboctave/Array-ch.cc
+++ b/liboctave/Array-ch.cc
@@ -23,22 +23,25 @@
 
 // Instantiate Arrays of char values.
 
-#define NO_DIAG_ARRAY 1
-
 #include "Array.h"
 #include "Array.cc"
 
 template class Array<char>;
-template class Array2<char>;
-
-#ifndef NO_DIAG_ARRAY
-template class DiagArray<char>;
-#endif
 
 template void assign (Array<char>&, const Array<char>&);
 
+#include "Array2.h"
+#include "Array2.cc"
+
+template class Array2<char>;
+
 template void assign (Array2<char>&, const Array2<char>&);
 
+#include "DiagArray2.h"
+#include "DiagArray2.cc"
+
+template class DiagArray2<char>;
+
 /*
 ;;; Local Variables: ***
 ;;; mode: C++ ***
--- a/liboctave/Array-d.cc
+++ b/liboctave/Array-d.cc
@@ -27,19 +27,27 @@
 #include "Array.cc"
 
 template class Array<double>;
-template class Array2<double>;
-template class DiagArray<double>;
 
 template void assign (Array<double>&, const Array<double>&);
 template void assign (Array<double>&, const Array<int>&);
 template void assign (Array<double>&, const Array<short>&);
 template void assign (Array<double>&, const Array<char>&);
 
+#include "Array2.h"
+#include "Array2.cc"
+
+template class Array2<double>;
+
 template void assign (Array2<double>&, const Array2<double>&);
 template void assign (Array2<double>&, const Array2<int>&);
 template void assign (Array2<double>&, const Array2<short>&);
 template void assign (Array2<double>&, const Array2<char>&);
 
+#include "DiagArray2.h"
+#include "DiagArray2.cc"
+
+template class DiagArray2<double>;
+
 /*
 ;;; Local Variables: ***
 ;;; mode: C++ ***
--- a/liboctave/Array-i.cc
+++ b/liboctave/Array-i.cc
@@ -23,26 +23,29 @@
 
 // Instantiate Arrays of integer values.
 
-#define NO_DIAG_ARRAY 1
-
 #include "Array.h"
 #include "Array.cc"
 
 template class Array<int>;
-template class Array2<int>;
-
-#ifndef NO_DIAG_ARRAY
-template class DiagArray<int>;
-#endif
 
 template void assign (Array<int>&, const Array<int>&);
 template void assign (Array<int>&, const Array<short>&);
 template void assign (Array<int>&, const Array<char>&);
 
+#include "Array2.h"
+#include "Array2.cc"
+
+template class Array2<int>;
+
 template void assign (Array2<int>&, const Array2<int>&);
 template void assign (Array2<int>&, const Array2<short>&);
 template void assign (Array2<int>&, const Array2<char>&);
 
+#include "DiagArray2.h"
+#include "DiagArray2.cc"
+
+template class DiagArray2<int>;
+
 /*
 ;;; Local Variables: ***
 ;;; mode: C++ ***
--- a/liboctave/Array-idx.h
+++ b/liboctave/Array-idx.h
@@ -217,6 +217,7 @@
   return retval;
 }
 
+#if 0 /* XXX */
 template <class T>
 Array2<T>
 Array2<T>::value (void)
@@ -787,6 +788,7 @@
   assert (0);
   return 0;
 }
+#endif
 
 /*
 ;;; Local Variables: ***
--- a/liboctave/Array-s.cc
+++ b/liboctave/Array-s.cc
@@ -23,24 +23,27 @@
 
 // Instantiate Arrays of short int values.
 
-#define NO_DIAG_ARRAY 1
-
 #include "Array.h"
 #include "Array.cc"
 
 template class Array<short>;
-template class Array2<short>;
-
-#ifndef NO_DIAG_ARRAY
-template class DiagArray<short>;
-#endif
 
 template void assign (Array<short>&, const Array<short>&);
 template void assign (Array<short>&, const Array<char>&);
 
+#include "Array2.h"
+#include "Array2.cc"
+
+template class Array2<short>;
+
 template void assign (Array2<short>&, const Array2<short>&);
 template void assign (Array2<short>&, const Array2<char>&);
 
+#include "DiagArray2.h"
+#include "DiagArray2.cc"
+
+template class DiagArray2<short>;
+
 /*
 ;;; Local Variables: ***
 ;;; mode: C++ ***
--- a/liboctave/Array.cc
+++ b/liboctave/Array.cc
@@ -211,383 +211,6 @@
   return rep->data;
 }
 
-// Two dimensional array class.
-
-template <class T>
-T&
-Array2<T>::checkelem (int i, int j)
-{
-  if (i < 0 || j < 0 || i >= d1 || j >= d2)
-    {
-      (*current_liboctave_error_handler) ("range error");
-      static T foo;
-      return foo;
-    }
-  return Array<T>::elem (d1*j+i);
-}
-
-template <class T>
-T
-Array2<T>::elem (int i, int j) const
-{
-  return Array<T>::elem (d1*j+i);
-}
-
-template <class T>
-T
-Array2<T>::checkelem (int i, int j) const
-{
-  if (i < 0 || j < 0 || i >= d1 || j >= d2)
-    {
-      (*current_liboctave_error_handler) ("range error");
-      T foo;
-      static T *bar = &foo;
-      return foo;
-    }
-  return Array<T>::elem (d1*j+i);
-}
-
-template <class T>
-T
-Array2<T>::operator () (int i, int j) const
-{
-  if (i < 0 || j < 0 || i >= d1 || j >= d2)
-    {
-      (*current_liboctave_error_handler) ("range error");
-      T foo;
-      static T *bar = &foo;
-      return foo;
-    }
-  return Array<T>::elem (d1*j+i);
-}
-
-template <class T>
-void
-Array2<T>::resize (int r, int c)
-{
-  if (r < 0 || c < 0)
-    {
-      (*current_liboctave_error_handler) ("can't resize to negative dimension");
-      return;
-    }
-
-  if (r == dim1 () && c == dim2 ())
-    return;
-
-  ArrayRep *old_rep = rep;
-  const T *old_data = data ();
-
-  int old_d1 = dim1 ();
-  int old_d2 = dim2 ();
-  int old_len = length ();
-
-  rep = new ArrayRep (r*c);
-
-  d1 = r;
-  d2 = c;
-
-  if (old_data && old_len > 0)
-    {
-      int min_r = old_d1 < r ? old_d1 : r;
-      int min_c = old_d2 < c ? old_d2 : c;
-
-      for (int j = 0; j < min_c; j++)
-	for (int i = 0; i < min_r; i++)
-	  xelem (i, j) = old_data[old_d1*j+i];
-    }
-
-  if (--old_rep->count <= 0)
-    delete old_rep;
-}
-
-template <class T>
-void
-Array2<T>::resize (int r, int c, const T& val)
-{
-  if (r < 0 || c < 0)
-    {
-      (*current_liboctave_error_handler) ("can't resize to negative dimension");
-      return;
-    }
-
-  if (r == dim1 () && c == dim2 ())
-    return;
-
-  ArrayRep *old_rep = rep;
-  const T *old_data = data ();
-  int old_d1 = dim1 ();
-  int old_d2 = dim2 ();
-  int old_len = length ();
-
-  rep = new ArrayRep (r*c);
-
-  d1 = r;
-  d2 = c;
-
-  int min_r = old_d1 < r ? old_d1 : r;
-  int min_c = old_d2 < c ? old_d2 : c;
-
-  if (old_data && old_len > 0)
-    {
-      for (int j = 0; j < min_c; j++)
-	for (int i = 0; i < min_r; i++)
-	  xelem (i, j) = old_data[old_d1*j+i];
-    }
-
-  for (int j = 0; j < min_c; j++)
-    for (int i = min_r; i < r; i++)
-      xelem (i, j) = val;
-
-  for (int j = min_c; j < c; j++)
-    for (int i = 0; i < r; i++)
-      xelem (i, j) = val;
-
-  if (--old_rep->count <= 0)
-    delete old_rep;
-}
-
-template <class T>
-Array2<T>&
-Array2<T>::insert (const Array2<T>& a, int r, int c)
-{
-  int a_rows = a.rows ();
-  int a_cols = a.cols ();
-
-  if (r < 0 || r + a_rows > rows () || c < 0 || c + a_cols > cols ())
-    {
-      (*current_liboctave_error_handler) ("range error for insert");
-      return *this;
-    }
-
-  for (int j = 0; j < a_cols; j++)
-    for (int i = 0; i < a_rows; i++)
-      elem (r+i, c+j) = a.elem (i, j);
-
-  return *this;
-}
-
-// Three dimensional array class.
-
-template <class T>
-T&
-Array3<T>::checkelem (int i, int j, int k)
-{
-  if (i < 0 || j < 0 || k < 0 || i >= d1 || j >= d2 || k >= d3)
-    {
-      (*current_liboctave_error_handler) ("range error");
-      static T foo;
-      return foo;
-    }
-  return Array2<T>::elem (i, d1*k+j);
-}
-
-template <class T>
-T
-Array3<T>::elem (int i, int j, int k) const
-{
-  return Array2<T>::elem (i, d2*k+j);
-}
-
-template <class T>
-T
-Array3<T>::checkelem (int i, int j, int k) const
-{
-  if (i < 0 || j < 0 || k < 0 || i >= d1 || j >= d2 || k >= d3)
-    {
-      (*current_liboctave_error_handler) ("range error");
-      T foo;
-      static T *bar = &foo;
-      return foo;
-    }
-  return Array2<T>::elem (i, d1*k+j);
-}
-
-template <class T>
-T
-Array3<T>::operator () (int i, int j, int k) const
-{
-  if (i < 0 || j < 0 || k < 0 || i >= d1 || j >= d2 || k >= d3)
-    {
-      (*current_liboctave_error_handler) ("range error");
-      T foo;
-      static T *bar = &foo;
-      return foo;
-    }
-  return Array2<T>::elem (i, d2*k+j);
-}
-
-template <class T>
-void
-Array3<T>::resize (int n, int m, int k)
-{
-  assert (0); // XXX FIXME XXX
-}
-
-template <class T>
-void
-Array3<T>::resize (int n, int m, int k, const T& val)
-{
-  assert (0); // XXX FIXME XXX
-}
-
-// A two-dimensional array with diagonal elements only.
-
-#ifndef NO_DIAG_ARRAY
-#if 1
-template <class T>
-T&
-DiagArray<T>::elem (int r, int c)
-{
-  static T foo (0);
-  return (r == c) ? Array<T>::elem (r) : foo;
-}
-
-template <class T>
-T&
-DiagArray<T>::checkelem (int r, int c)
-{
-  static T foo (0);
-  if (r < 0 || c < 0 || r >= nr || c >= nc)
-    {
-      (*current_liboctave_error_handler) ("range error");
-      return foo;
-    }
-  return (r == c) ? Array<T>::elem (r) : foo;
-}
-
-template <class T>
-T&
-DiagArray<T>::operator () (int r, int c)
-{
-  static T foo (0);
-  if (r < 0 || c < 0 || r >= nr || c >= nc)
-    {
-      (*current_liboctave_error_handler) ("range error");
-      return foo;
-    }
-  return (r == c) ? Array<T>::elem (r) : foo;
-}
-#endif
-
-template <class T>
-T&
-DiagArray<T>::xelem (int r, int c)
-{
-  static T foo (0);
-  return (r == c) ? Array<T>::xelem (r) : foo;
-}
-
-template <class T>
-T
-DiagArray<T>::elem (int r, int c) const
-{
-  return (r == c) ? Array<T>::elem (r) : T (0);
-}
-
-template <class T>
-T
-DiagArray<T>::checkelem (int r, int c) const
-{
-  if (r < 0 || c < 0 || r >= nr || c >= nc)
-    {
-      (*current_liboctave_error_handler) ("range error");
-      T foo;
-      static T *bar = &foo;
-      return foo;
-    }
-  return (r == c) ? Array<T>::elem (r) : T (0);
-}
-
-template <class T>
-T
-DiagArray<T>::operator () (int r, int c) const
-{
-  if (r < 0 || c < 0 || r >= nr || c >= nc)
-    {
-      (*current_liboctave_error_handler) ("range error");
-      T foo;
-      static T *bar = &foo;
-      return foo;
-    }
-  return (r == c) ? Array<T>::elem (r) : T (0);
-}
-
-template <class T>
-void
-DiagArray<T>::resize (int r, int c)
-{
-  if (r < 0 || c < 0)
-    {
-      (*current_liboctave_error_handler) ("can't resize to negative dimensions");
-      return;
-    }
-
-  if (r == dim1 () && c == dim2 ())
-    return;
-
-  ArrayRep *old_rep = rep;
-  const T *old_data = data ();
-  int old_len = length ();
-
-  int new_len = r < c ? r : c;
-
-  rep = new ArrayRep (new_len);
-
-  nr = r;
-  nc = c;
-
-  if (old_data && old_len > 0)
-    {
-      int min_len = old_len < new_len ? old_len : new_len;
-
-      for (int i = 0; i < min_len; i++)
-	xelem (i, i) = old_data[i];
-    }
-
-  if (--old_rep->count <= 0)
-    delete old_rep;
-}
-
-template <class T>
-void
-DiagArray<T>::resize (int r, int c, const T& val)
-{
-  if (r < 0 || c < 0)
-    {
-      (*current_liboctave_error_handler) ("can't resize to negative dimensions");
-      return;
-    }
-
-  if (r == dim1 () && c == dim2 ())
-    return;
-
-  ArrayRep *old_rep = rep;
-  const T *old_data = data ();
-  int old_len = length ();
-
-  int new_len = r < c ? r : c;
-
-  rep = new ArrayRep (new_len);
-
-  nr = r;
-  nc = c;
-
-  int min_len = old_len < new_len ? old_len : new_len;
-
-  if (old_data && old_len > 0)
-    {
-      for (int i = 0; i < min_len; i++)
-	xelem (i, i) = old_data[i];
-    }
-
-  for (int i = min_len; i < new_len; i++)
-    xelem (i, i) = val;
-
-  if (--old_rep->count <= 0)
-    delete old_rep;
-}
-#endif
-
 /*
 ;;; Local Variables: ***
 ;;; mode: C++ ***
--- a/liboctave/Array.h
+++ b/liboctave/Array.h
@@ -37,16 +37,6 @@
 
 class idx_vector;
 
-// Classes we declare.
-
-template <class T> class Array;
-template <class T> class Array2;
-template <class T> class Array3;
-
-#ifndef NO_DIAG_ARRAY
-template <class T> class DiagArray;
-#endif
-
 // One dimensional array class.  Handles the reference counting for
 // all the derived classes.
 
@@ -173,13 +163,14 @@
   T& checkelem (int n);
   T& operator () (int n) { return checkelem (n); }
 
+  T elem (int n) const;
+  T checkelem (int n) const;
+  T operator () (int n) const;
+
   // No checking.
 
   T& xelem (int n) { return rep->elem (n); }
-
-  T elem (int n) const;
-  T checkelem (int n) const;
-  T operator () (int n) const;
+  T xelem (int n) const { return rep->elem (n); }
 
   void resize (int n);
   void resize (int n, const T& val);
@@ -221,410 +212,6 @@
 template <class LT, class RT>
 int assign (Array<LT>& lhs, const Array<RT>& rhs);
 
-// Two dimensional array class.
-
-template <class T>
-class Array2 : public Array<T>
-{
-protected:
-
-  Array2 (T *d, int n, int m) : Array<T> (d, n*m)
-    {
-      d1 = n;
-      d2 = m;
-      set_max_indices (2);
-    }
-
-public:
-
-  // These really need to be protected (and they will be in the
-  // future, so don't depend on them being here!), but they can't be
-  // until template friends work correctly in g++.
-
-  int d1;
-  int d2;
-
-  Array2 (void) : Array<T> ()
-    {
-      d1 = 0;
-      d2 = 0;
-      set_max_indices (2);
-    }
-
-  Array2 (int n, int m) : Array<T> (n*m)
-    {
-      d1 = n;
-      d2 = m;
-      set_max_indices (2);
-    }
-
-  Array2 (int n, int m, const T& val) : Array<T> (n*m, val)
-    {
-      d1 = n;
-      d2 = m;
-      set_max_indices (2);
-    }
-
-  Array2 (const Array2<T>& a) : Array<T> (a)
-    {
-      d1 = a.d1;
-      d2 = a.d2;
-      set_max_indices (2);
-    }
-
-  Array2 (const Array<T>& a, int n, int m) : Array<T> (a)
-    {
-      d1 = n;
-      d2 = m;
-      set_max_indices (2);
-    }
-
-#ifndef NO_DIAG_ARRAY
-  Array2 (const DiagArray<T>& a) : Array<T> (a.rows () * a.cols (), T (0))
-    {
-      for (int i = 0; i < a.length (); i++)
-	elem (i, i) = a.elem (i, i);
-
-      set_max_indices (2);
-    }
-#endif
-
-  ~Array2 (void) { }
-
-  Array2<T>& operator = (const Array2<T>& a)
-    {
-      if (this != &a && rep != a.rep)
-	{
-	  Array<T>::operator = (a);
-	  d1 = a.d1;
-	  d2 = a.d2;
-	}
-
-      return *this;
-    }
-
-  int dim1 (void) const { return d1; }
-  int dim2 (void) const { return d2; }
-
-  int rows (void) const { return d1; }
-  int cols (void) const { return d2; }
-  int columns (void) const { return d2; }
-
-  T& elem (int i, int j) { return Array<T>::elem (d1*j+i); }
-  T& checkelem (int i, int j);
-  T& operator () (int i, int j) { return checkelem (i, j); }
-
-  // No checking.
-
-  T& xelem (int i, int j) { return Array<T>::xelem (d1*j+i); }
-
-  T elem (int i, int j) const;
-  T checkelem (int i, int j) const;
-  T operator () (int i, int j) const;
-
-  void resize (int n, int m);
-  void resize (int n, int m, const T& val);
-
-  Array2<T>& insert (const Array2<T>& a, int r, int c);
-
-#ifdef HEAVYWEIGHT_INDEXING
-  void maybe_delete_elements (idx_vector& i, idx_vector& j);
-
-  Array2<T> value (void);
-#endif
-};
-
-template <class LT, class RT>
-int assign (Array2<LT>& lhs, const Array2<RT>& rhs);
-
-// Three dimensional array class.
-
-template <class T>
-class Array3 : public Array2<T>
-{
-protected:
-
-  int d3;
-
-  Array3 (T *d, int n, int m, int k) : Array2<T> (d, n, m*k)
-    {
-      d2 = m;
-      d3 = k;
-      set_max_indices (3);
-    }
-
-public:
-
-  Array3 (void) : Array2<T> ()
-    {
-      d2 = 0;
-      d3 = 0;
-      set_max_indices (3);
-    }
-
-  Array3 (int n, int m, int k) : Array2<T> (n, m*k)
-    {
-      d2 = m;
-      d3 = k;
-      set_max_indices (3);
-    }
-
-  Array3 (int n, int m, int k, const T& val) : Array2<T> (n, m*k, val)
-    {
-      d2 = m;
-      d3 = k;
-      set_max_indices (3);
-    }
-
-  Array3 (const Array3<T>& a) : Array2<T> (a)
-    {
-      d2 = a.d2;
-      d3 = a.d3;
-      set_max_indices (3);
-    }
-
-  ~Array3 (void) { }
-
-  Array3<T>& operator = (const Array3<T>& a)
-    {
-      if (this != &a && rep != a.rep)
-	{
-	  Array<T>::operator = (a);
-	  d1 = a.d1;
-	  d2 = a.d2;
-	  d3 = a.d3;
-	}
-
-      return *this;
-    }
-
-  int dim3 (void) const { return d3; }
-
-  T& elem (int i, int j, int k) { return Array2<T>::elem (i, d2*k+j); }
-  T& checkelem (int i, int j, int k);
-  T& operator () (int i, int j, int k) { return checkelem (i, j, k); }
-
-  // No checking.
-
-  T& xelem (int i, int j, int k) { return Array2<T>::xelem (i, d2*k+j); }
-
-  T elem (int i, int j, int k) const;
-  T checkelem (int i, int j, int k) const;
-  T operator () (int i, int j, int k) const;
-
-  void resize (int n, int m, int k);
-  void resize (int n, int m, int k, const T& val);
-
-#ifdef HEAVYWEIGHT_INDEXING
-  void maybe_delete_elements (idx_vector& i, idx_vector& j, idx_vector& k);
-
-  Array3<T> value (void);
-#endif
-};
-
-template <class LT, class RT>
-int assign (Array3<LT>& lhs, const Array3<RT>& rhs);
-
-// A two-dimensional array with diagonal elements only.
-//
-// Idea and example code for Proxy class and functions from:
-//
-// From: kanze@us-es.sel.de (James Kanze)
-// Subject: Re: How to overload [] to do READ/WRITE differently ?
-// Message-ID: <KANZE.93Nov29151407@slsvhdt.us-es.sel.de>
-// Sender: news@us-es.sel.de
-// Date: 29 Nov 1993 14:14:07 GMT
-// --
-// James Kanze                             email: kanze@us-es.sel.de
-// GABI Software, Sarl., 8 rue du Faisan, F-67000 Strasbourg, France
-
-#ifndef NO_DIAG_ARRAY
-template <class T>
-class DiagArray : public Array<T>
-{
-private:
-  T get (int i) { return Array<T>::elem (i); }
-  void set (const T& val, int i) { Array<T>::elem (i) = val; }
-
-  class Proxy
-  {
-  public:
-
-    Proxy (DiagArray<T> *ref, int r, int c)
-      : i (r), j (c), object (ref) { } 
-
-    const Proxy& operator = (const T& val) const
-      {
-	if (i == j)
-	  {
-	    if (object)
-	      object->set (val, i);
-	  }
-	else
-	  (*current_liboctave_error_handler) ("invalid assignment to off-diagonal in diagonal array");
-
-	return *this;
-      }
-
-    operator T () const
-      {
-	if (object && i == j)
-	  return object->get (i);
-	else
-	  {
-	    static T foo (0);
-	    return foo;
-	  }
-      }
-
-  private:
-
-    // XXX FIXME XXX -- this is declared private to keep the user from
-    // taking the address of a Proxy.  Maybe it should be implemented
-    // by means of a companion function in the DiagArray class.
-
-    T *operator& () const { assert (0); return (T *) 0; }
-
-    int i;
-    int j;
-
-    DiagArray<T> *object;
-
-  };
-
-friend class Proxy;
-
-protected:
-
-  int nr;
-  int nc;
-
-  DiagArray (T *d, int r, int c) : Array<T> (d, r < c ? r : c)
-    {
-      nr = r;
-      nc = c;
-      set_max_indices (2);
-    }
-
-public:
-
-  DiagArray (void) : Array<T> ()
-    {
-      nr = 0;
-      nc = 0;
-      set_max_indices (2);
-    }
-
-  DiagArray (int n) : Array<T> (n)
-    {
-      nr = n;
-      nc = n;
-      set_max_indices (2);
-    }
-
-  DiagArray (int n, const T& val) : Array<T> (n, val)
-    {
-      nr = n;
-      nc = n;
-      set_max_indices (2);
-    }
-
-  DiagArray (int r, int c) : Array<T> (r < c ? r : c)
-    {
-      nr = r;
-      nc = c;
-      set_max_indices (2);
-    }
-
-  DiagArray (int r, int c, const T& val) : Array<T> (r < c ? r : c, val)
-    {
-      nr = r;
-      nc = c;
-      set_max_indices (2);
-    }
-
-  DiagArray (const Array<T>& a) : Array<T> (a)
-    {
-      nr = nc = a.length ();
-      set_max_indices (2);
-    }
-
-  DiagArray (const DiagArray<T>& a) : Array<T> (a)
-    {
-      nr = a.nr;
-      nc = a.nc;
-      set_max_indices (2);
-    }
-
-  ~DiagArray (void) { }
-
-  DiagArray<T>& operator = (const DiagArray<T>& a)
-    {
-      if (this != &a)
-	{
-	  Array<T>::operator = (a);
-	  nr = a.nr;
-	  nc = a.nc;
-	}
-
-      return *this;
-    }
-
-  int dim1 (void) const { return nr; }
-  int dim2 (void) const { return nc; }
-
-  int rows (void) const { return nr; }
-  int cols (void) const { return nc; }
-  int columns (void) const { return nc; }
-
-#if 0
-  Proxy elem (int r, int c)
-    {
-      return Proxy (this, r, c);
-    }
-
-  Proxy checkelem (int r, int c)
-    {
-      if (r < 0 || c < 0 || r >= nr || c >= nc)
-	{
-	  (*current_liboctave_error_handler) ("range error");
-	  return Proxy (0, r, c);
-	}
-      else
-	return Proxy (this, r, c);
-    }
-
-  Proxy operator () (int r, int c)
-    {
-      if (r < 0 || c < 0 || r >= nr || c >= nc)
-	{
-	  (*current_liboctave_error_handler) ("range error");
-	  return Proxy (0, r, c);
-	}
-      else
-	return Proxy (this, r, c);
-  }
-#else
-  T& elem (int r, int c);
-  T& checkelem (int r, int c);
-  T& operator () (int r, int c);
-#endif
-
-  // No checking.
-
-  T& xelem (int r, int c);
-
-  T elem (int r, int c) const;
-  T checkelem (int r, int c) const;
-  T operator () (int r, int c) const;
-
-  void resize (int n, int m);
-  void resize (int n, int m, const T& val);
-
-  void maybe_delete_elements (idx_vector& i, idx_vector& j);
-};
-#endif
-
 #endif
 
 /*
--- a/liboctave/CDiagMatrix.cc
+++ b/liboctave/CDiagMatrix.cc
@@ -38,22 +38,8 @@
 
 // Complex Diagonal Matrix class
 
-ComplexDiagMatrix::ComplexDiagMatrix (const RowVector& a)
-  : MDiagArray<Complex> (a.length ())
-{
-  for (int i = 0; i < length (); i++)
-    elem (i, i) = a.elem (i);
-}
-
-ComplexDiagMatrix::ComplexDiagMatrix (const ColumnVector& a)
-  : MDiagArray<Complex> (a.length ())
-{
-  for (int i = 0; i < length (); i++)
-    elem (i, i) = a.elem (i);
-}
-
 ComplexDiagMatrix::ComplexDiagMatrix (const DiagMatrix& a)
-  : MDiagArray<Complex> (a.rows (), a.cols ())
+  : MDiagArray2<Complex> (a.rows (), a.cols ())
 {
   for (int i = 0; i < length (); i++)
     elem (i, i) = a.elem (i, i);
--- a/liboctave/CDiagMatrix.h
+++ b/liboctave/CDiagMatrix.h
@@ -28,7 +28,7 @@
 #pragma interface
 #endif
 
-#include "MArray.h"
+#include "MDiagArray2.h"
 
 #include "dRowVector.h"
 #include "CRowVector.h"
@@ -37,30 +37,29 @@
 
 #include "mx-defs.h"
 
-class ComplexDiagMatrix : public MDiagArray<Complex>
+class ComplexDiagMatrix : public MDiagArray2<Complex>
 {
 public:
 
-  ComplexDiagMatrix (void) : MDiagArray<Complex> () { }
-  ComplexDiagMatrix (int n) : MDiagArray<Complex> (n) { }
-  ComplexDiagMatrix (int n, const Complex& val)
-    : MDiagArray<Complex> (n, n, val) { }
-  ComplexDiagMatrix (int r, int c) : MDiagArray<Complex> (r, c) { }
+  ComplexDiagMatrix (void) : MDiagArray2<Complex> () { }
+  ComplexDiagMatrix (int r, int c) : MDiagArray2<Complex> (r, c) { }
   ComplexDiagMatrix (int r, int c, const Complex& val)
-    : MDiagArray<Complex> (r, c, val) { }
-  ComplexDiagMatrix (const RowVector& a);
-  ComplexDiagMatrix (const ComplexRowVector& a) : MDiagArray<Complex> (a) { }
-  ComplexDiagMatrix (const ColumnVector& a);
+    : MDiagArray2<Complex> (r, c, val) { }
+  ComplexDiagMatrix (const RowVector& a)
+    : MDiagArray2<Complex> (ComplexRowVector (a)) { }
+  ComplexDiagMatrix (const ComplexRowVector& a) : MDiagArray2<Complex> (a) { }
+  ComplexDiagMatrix (const ColumnVector& a)
+    : MDiagArray2<Complex> (ComplexColumnVector (a)) { }
   ComplexDiagMatrix (const ComplexColumnVector& a)
-    : MDiagArray<Complex> (a) { }
+    : MDiagArray2<Complex> (a) { }
   ComplexDiagMatrix (const DiagMatrix& a);
-  ComplexDiagMatrix (const MDiagArray<Complex>& a)
-    : MDiagArray<Complex> (a) { }
-  ComplexDiagMatrix (const ComplexDiagMatrix& a) : MDiagArray<Complex> (a) { }
+  ComplexDiagMatrix (const MDiagArray2<Complex>& a)
+    : MDiagArray2<Complex> (a) { }
+  ComplexDiagMatrix (const ComplexDiagMatrix& a) : MDiagArray2<Complex> (a) { }
 
   ComplexDiagMatrix& operator = (const ComplexDiagMatrix& a)
     {
-      MDiagArray<Complex>::operator = (a);
+      MDiagArray2<Complex>::operator = (a);
       return *this;
     }
 
@@ -159,7 +158,7 @@
 private:
 
   ComplexDiagMatrix (Complex *d, int nr, int nc)
-    : MDiagArray<Complex> (d, nr, nc) { }
+    : MDiagArray2<Complex> (d, nr, nc) { }
 };
 
 #endif
--- a/liboctave/CMatrix.h
+++ b/liboctave/CMatrix.h
@@ -28,7 +28,8 @@
 #pragma interface
 #endif
 
-#include "MArray.h"
+#include "MArray2.h"
+#include "MDiagArray2.h"
 
 #include "mx-defs.h"
 #include "oct-cmplx.h"
@@ -54,7 +55,7 @@
   ComplexMatrix (const MArray2<Complex>& a) : MArray2<Complex> (a) { }
   ComplexMatrix (const ComplexMatrix& a) : MArray2<Complex> (a) { }
   ComplexMatrix (const DiagMatrix& a);
-  ComplexMatrix (const MDiagArray<Complex>& a) : MArray2<Complex> (a) { }
+  //  ComplexMatrix (const MDiagArray2<Complex>& a) : MArray2<Complex> (a) { }
   ComplexMatrix (const ComplexDiagMatrix& a);
 
   ComplexMatrix (const charMatrix& a);
--- a/liboctave/MArray-C.cc
+++ b/liboctave/MArray-C.cc
@@ -23,17 +23,27 @@
 
 // Instantiate MArrays of Complex values.
 
+#include "oct-cmplx.h"
+
 #include "MArray.h"
 #include "MArray.cc"
 
-#include "oct-cmplx.h"
-
 template class MArray<Complex>;
-template class MArray2<Complex>;
-template class MDiagArray<Complex>;
 
 INSTANTIATE_MARRAY_FRIENDS (Complex)
+
+#include "MArray2.h"
+#include "MArray2.cc"
+
+template class MArray2<Complex>;
+
 INSTANTIATE_MARRAY2_FRIENDS (Complex)
+
+#include "MDiagArray2.h"
+#include "MDiagArray2.cc"
+
+template class MDiagArray2<Complex>;
+
 INSTANTIATE_MDIAGARRAY_FRIENDS (Complex)
 
 /*
--- a/liboctave/MArray-ch.cc
+++ b/liboctave/MArray-ch.cc
@@ -23,22 +23,26 @@
 
 // Instantiate MArrays of char values.
 
-#define NO_DIAG_ARRAY 1
-
 #include "MArray.h"
 #include "MArray.cc"
 
 template class MArray<char>;
+
+INSTANTIATE_MARRAY_FRIENDS (char)
+
+#include "MArray2.h"
+#include "MArray2.cc"
+
 template class MArray2<char>;
 
-INSTANTIATE_MARRAY_FRIENDS (char)
 INSTANTIATE_MARRAY2_FRIENDS (char)
 
-#ifndef NO_DIAG_ARRAY
-template class MDiagArray<char>;
+#include "MDiagArray2.h"
+#include "MDiagArray2.cc"
+
+template class MDiagArray2<char>;
 
 INSTANTIATE_MDIAGARRAY_FRIENDS (char)
-#endif
 
 /*
 ;;; Local Variables: ***
--- a/liboctave/MArray-d.cc
+++ b/liboctave/MArray-d.cc
@@ -27,107 +27,22 @@
 #include "MArray.cc"
 
 template class MArray<double>;
-template class MArray2<double>;
-template class MDiagArray<double>;
 
-template MArray<double>
-operator + (const MArray<double>& a, const double& s);
-
-template MArray<double>
-operator - (const MArray<double>& a, const double& s);
-
-template MArray<double>
-operator * (const MArray<double>& a, const double& s);
-
-template MArray<double>
-operator / (const MArray<double>& a, const double& s);
-
-template MArray<double>
-operator + (const double& s, const MArray<double>& a);
-
-template MArray<double>
-operator - (const double& s, const MArray<double>& a);
-
-template MArray<double>
-operator * (const double& s, const MArray<double>& a);
+INSTANTIATE_MARRAY_FRIENDS (double)
 
-template MArray<double>
-operator / (const double& s, const MArray<double>& a);
-
-template MArray<double>
-operator + (const MArray<double>& a, const MArray<double>& b);
-
-template MArray<double>
-operator - (const MArray<double>& a, const MArray<double>& b);
-
-template MArray<double>
-product (const MArray<double>& a, const MArray<double>& b); 
+#include "MArray2.h"
+#include "MArray2.cc"
 
-template MArray<double>
-quotient (const MArray<double>& a, const MArray<double>& b);
-
-template MArray<double>
-operator - (const MArray<double>& a);
-
-template MArray2<double>
-operator + (const MArray2<double>& a, const double& s);
-
-template MArray2<double>
-operator - (const MArray2<double>& a, const double& s);
-
-template MArray2<double>
-operator * (const MArray2<double>& a, const double& s);
+template class MArray2<double>;
 
-template MArray2<double>
-operator / (const MArray2<double>& a, const double& s);
-
-template MArray2<double>
-operator + (const double& s, const MArray2<double>& a);
-
-template MArray2<double>
-operator - (const double& s, const MArray2<double>& a);
-
-template MArray2<double>
-operator * (const double& s, const MArray2<double>& a);
-
-template MArray2<double>
-operator / (const double& s, const MArray2<double>& a);
-
-template MArray2<double>
-operator + (const MArray2<double>& a, const MArray2<double>& b);
-
-template MArray2<double>
-operator - (const MArray2<double>& a, const MArray2<double>& b);
-
-template MArray2<double>
-product (const MArray2<double>& a, const MArray2<double>& b);
+INSTANTIATE_MARRAY2_FRIENDS (double)
 
-template MArray2<double>
-quotient (const MArray2<double>& a, const MArray2<double>& b);
-
-template MArray2<double>
-operator - (const MArray2<double>& a);
-
-template MDiagArray<double>
-operator * (const MDiagArray<double>& a, const double& s);
-
-template MDiagArray<double>
-operator / (const MDiagArray<double>& a, const double& s);
+#include "MDiagArray2.h"
+#include "MDiagArray2.cc"
 
-template MDiagArray<double>
-operator * (const double& s, const MDiagArray<double>& a);
-
-template MDiagArray<double>
-operator + (const MDiagArray<double>& a, const MDiagArray<double>& b);
+template class MDiagArray2<double>;
 
-template MDiagArray<double>
-operator - (const MDiagArray<double>& a, const MDiagArray<double>& b);
-
-template MDiagArray<double>
-product (const MDiagArray<double>& a, const MDiagArray<double>& b);
-
-template MDiagArray<double>
-operator - (const MDiagArray<double>& a);
+INSTANTIATE_MDIAGARRAY_FRIENDS (double)
 
 /*
 ;;; Local Variables: ***
--- a/liboctave/MArray-i.cc
+++ b/liboctave/MArray-i.cc
@@ -23,22 +23,26 @@
 
 // Instantiate MArrays of int values.
 
-#define NO_DIAG_ARRAY 1
-
 #include "MArray.h"
 #include "MArray.cc"
 
 template class MArray<int>;
+
+INSTANTIATE_MARRAY_FRIENDS (int)
+
+#include "MArray2.h"
+#include "MArray2.cc"
+
 template class MArray2<int>;
 
-INSTANTIATE_MARRAY_FRIENDS (int)
 INSTANTIATE_MARRAY2_FRIENDS (int)
 
-#ifndef NO_DIAG_ARRAY
-template class MDiagArray<int>;
+#include "MDiagArray2.h"
+#include "MDiagArray2.cc"
+
+template class MDiagArray2<int>;
 
 INSTANTIATE_MDIAGARRAY_FRIENDS (int)
-#endif
 
 /*
 ;;; Local Variables: ***
--- a/liboctave/MArray-s.cc
+++ b/liboctave/MArray-s.cc
@@ -23,22 +23,26 @@
 
 // Instantiate MArrays of short int values.
 
-#define NO_DIAG_ARRAY 1
-
 #include "MArray.h"
 #include "MArray.cc"
 
 template class MArray<short>;
+
+INSTANTIATE_MARRAY_FRIENDS (short)
+
+#include "MArray2.h"
+#include "MArray2.cc"
+
 template class MArray2<short>;
 
-INSTANTIATE_MARRAY_FRIENDS (short)
 INSTANTIATE_MARRAY2_FRIENDS (short)
 
-#ifndef NO_DIAG_ARRAY
-template class MDiagArray<short>;
+#include "MDiagArray2.h"
+#include "MDiagArray2.cc"
+
+template class MDiagArray2<short>;
 
 INSTANTIATE_MDIAGARRAY_FRIENDS (short)
-#endif
 
 /*
 ;;; Local Variables: ***
--- a/liboctave/MArray.cc
+++ b/liboctave/MArray.cc
@@ -32,72 +32,7 @@
 #include "MArray.h"
 #include "lo-error.h"
 
-// Nothing like a little CPP abuse to brighten everyone's day.  Would
-// have been nice to do this with template functions but as of 2.5.x,
-// g++ seems to fail to resolve them properly.
-
-#define DO_VS_OP(OP) \
-  int l = a.length (); \
-  T *result = 0; \
-  if (l > 0) \
-    { \
-      result = new T [l]; \
-      const T *x = a.data (); \
-      for (int i = 0; i < l; i++) \
-	result[i] = x[i] OP s; \
-    }
-
-#define DO_SV_OP(OP) \
-  int l = a.length (); \
-  T *result = 0; \
-  if (l > 0) \
-    { \
-      result = new T [l]; \
-      const T *x = a.data (); \
-      for (int i = 0; i < l; i++) \
-	result[i] = s OP x[i]; \
-    }
-
-#define DO_VV_OP(OP) \
-  T *result = 0; \
-  if (l > 0) \
-    { \
-      result = new T [l]; \
-      const T *x = a.data (); \
-      const T *y = b.data (); \
-      for (int i = 0; i < l; i++) \
-	result[i] = x[i] OP y[i]; \
-    }
-
-#define NEG_V \
-  int l = a.length (); \
-  T *result = 0; \
-  if (l > 0) \
-    { \
-      result = new T [l]; \
-      const T *x = a.data (); \
-      for (int i = 0; i < l; i++) \
-	result[i] = -x[i]; \
-    }
-
-#define DO_VS_OP2(OP) \
-  int l = a.length (); \
-  if (l > 0) \
-    { \
-      T *tmp = a.fortran_vec (); \
-      for (int i = 0; i < l; i++) \
-	tmp[i] OP s; \
-    }
-
-#define DO_VV_OP2(OP) \
-  do \
-    { \
-      T *a_tmp = a.fortran_vec (); \
-      const T *b_tmp = b.data (); \
-      for (int i = 0; i < l; i++) \
-	a_tmp[i] += b_tmp[i]; \
-    } \
-  while (0)
+#include "MArray-defs.h"
 
 // One dimensional array with math ops.
 
@@ -220,264 +155,6 @@
   return MArray<T> (result, l);
 }
 
-// Two dimensional array with math ops.
-
-#ifndef NO_DIAG_ARRAY
-template <class T>
-MArray2<T>::MArray2 (const MDiagArray<T>& a)
-  : Array2<T> (a.rows (), a.cols (), T (0))
-{
-  for (int i = 0; i < a.length (); i++)
-    elem (i, i) = a.elem (i, i);
-}
-#endif
-
-// Element by element MArray2 by scalar ops.
-
-template <class T>
-MArray2<T>&
-operator += (MArray2<T>& a, const T& s)
-{
-  DO_VS_OP2 (+=)
-  return a;
-}
-
-template <class T>
-MArray2<T>&
-operator -= (MArray2<T>& a, const T& s)
-{
-  DO_VS_OP2 (-=)
-  return a;
-}
-
-// Element by element MArray2 by MArray2 ops.
-
-template <class T>
-MArray2<T>&
-operator += (MArray2<T>& a, const MArray2<T>& b)
-{
-  int r = a.rows ();
-  int c = a.cols ();
-  if (r != b.rows () || c != b.cols ())
-    {
-      (*current_liboctave_error_handler)
-	("nonconformant += array operation attempted");
-    }
-  else
-    {
-      if (r > 0 && c > 0)
-	{
-	  int l = a.length ();
-	  DO_VV_OP2 (+=);
-	}
-    }
-  return a;
-}
-
-template <class T>
-MArray2<T>&
-operator -= (MArray2<T>& a, const MArray2<T>& b)
-{
-  int r = a.rows ();
-  int c = a.cols ();
-  if (r != b.rows () || c != b.cols ())
-    {
-      (*current_liboctave_error_handler)
-	("nonconformant -= array operation attempted");
-    }
-  else
-    {
-      if (r > 0 && c > 0)
-	{
-	  int l = a.length ();
-	  DO_VV_OP2 (-=);
-	}
-    }
-  return a;
-}
-
-// Element by element MArray2 by scalar ops.
-
-#define MARRAY_A2S_OP(OP) \
-  template <class T> \
-  MArray2<T> \
-  operator OP (const MArray2<T>& a, const T& s) \
-  { \
-    DO_VS_OP (OP); \
-    return MArray2<T> (result, a.rows (), a.cols ()); \
-  }
-
-MARRAY_A2S_OP (+)
-MARRAY_A2S_OP (-)
-MARRAY_A2S_OP (*)
-MARRAY_A2S_OP (/)
-
-// Element by element scalar by MArray2 ops.
-
-#define MARRAY_SA2_OP(OP) \
-  template <class T> \
-  MArray2<T> \
-  operator OP (const T& s, const MArray2<T>& a) \
-  { \
-    DO_SV_OP (OP); \
-    return MArray2<T> (result, a.rows (), a.cols ()); \
-  }
-
-MARRAY_SA2_OP (+)
-MARRAY_SA2_OP (-)
-MARRAY_SA2_OP (*)
-MARRAY_SA2_OP (/)
-
-// Element by element MArray2 by MArray2 ops.
-
-#define MARRAY_A2A2_OP(FCN, OP, OP_STR) \
-  template <class T> \
-  MArray2<T> \
-  FCN (const MArray2<T>& a, const MArray2<T>& b) \
-  { \
-    int r = a.rows (); \
-    int c = a.cols (); \
-    if (r != b.rows () || c != b.cols ()) \
-      { \
-	(*current_liboctave_error_handler) \
-	  ("nonconformant array " OP_STR " attempted"); \
-	return MArray2<T> (); \
-      } \
-    if (r == 0 || c == 0) \
-      return MArray2<T> (); \
-    int l = a.length (); \
-    DO_VV_OP (OP); \
-    return MArray2<T> (result, r, c); \
-  }
-
-MARRAY_A2A2_OP (operator +, +, "addition")
-MARRAY_A2A2_OP (operator -, -, "subtraction")
-MARRAY_A2A2_OP (product,    *, "product")
-MARRAY_A2A2_OP (quotient,   /, "quotient")
-
-// Unary MArray2 ops.
-
-template <class T>
-MArray2<T>
-operator - (const MArray2<T>& a)
-{
-  NEG_V;
-  return MArray2<T> (result, a.rows (), a.cols ());
-}
-
-// Two dimensional diagonal array with math ops.
-
-#ifndef NO_DIAG_ARRAY
-
-// Element by element MDiagArray by MDiagArray ops.
-
-template <class T>
-MDiagArray<T>&
-operator += (MDiagArray<T>& a, const MDiagArray<T>& b)
-{
-  int r = a.rows ();
-  int c = a.cols ();
-  if (r != b.rows () || c != b.cols ())
-    {
-      (*current_liboctave_error_handler)
-	("nonconformant array " OP_STR " attempted");
-      return MArray2<T> ();
-    }
-  else
-    {
-      int l = a.length ();
-      T *a_tmp = a.fortran_vec ();
-      const T *b_tmp = b.data ();
-      for (int i = 0; i < l; i++)
-	a_tmp[i] += b_tmp[i];
-    }
-  return a;
-}
-
-template <class T>
-MDiagArray<T>&
-operator -= (MDiagArray<T>& a, const MDiagArray<T>& b)
-{
-  int r = a.rows ();
-  int c = a.cols ();
-  if (r != b.rows () || c != b.cols ())
-    {
-      (*current_liboctave_error_handler)
-	("nonconformant array " OP_STR " attempted");
-      return MArray2<T> ();
-    }
-  else
-    {
-      int l = a.length ();
-      T *a_tmp = a.fortran_vec ();
-      const T *b_tmp = b.data ();
-      for (int i = 0; i < l; i++)
-	a_tmp[i] -= b_tmp[i];
-    }
-  return a;
-}
-
-// Element by element MDiagArray by scalar ops.
-
-#define MARRAY_DAS_OP(OP) \
-  template <class T> \
-  MDiagArray<T> \
-  operator OP (const MDiagArray<T>& a, const T& s) \
-  { \
-    DO_VS_OP (OP); \
-    return MDiagArray<T> (result, a.rows (), a.cols ()); \
-  }
-
-MARRAY_DAS_OP (*)
-MARRAY_DAS_OP (/)
-
-// Element by element scalar by MDiagArray ops.
-
-template <class T>
-MDiagArray<T>
-operator * (const T& s, const MDiagArray<T>& a)
-{
-  DO_SV_OP (*);
-  return MDiagArray<T> (result, a.rows (), a.cols ());
-}
-
-// Element by element MDiagArray by MDiagArray ops.
-
-#define MARRAY_DADA_OP(FCN, OP, OP_STR) \
-  template <class T> \
-  MDiagArray<T> \
-  FCN (const MDiagArray<T>& a, const MDiagArray<T>& b) \
-  { \
-    int r = a.rows (); \
-    int c = a.cols (); \
-    if (r != b.rows () || c != b.cols ()) \
-      { \
-	(*current_liboctave_error_handler) \
-	  ("nonconformant diagonal array " OP_STR " attempted"); \
-	return MDiagArray<T> (); \
-      } \
-    if (c == 0 || r == 0) \
-      return MDiagArray<T> (); \
-    int l = a.length (); \
-    DO_VV_OP (OP); \
-    return MDiagArray<T> (result, r, c); \
-  }
-
-MARRAY_DADA_OP (operator +, +, "addition")
-MARRAY_DADA_OP (operator -, -, "subtraction")
-MARRAY_DADA_OP (product,    *, "product")
-
-// Unary MDiagArray ops.
-
-template <class T>
-MDiagArray<T>
-operator - (const MDiagArray<T>& a)
-{
-  NEG_V;
-  return MDiagArray<T> (result, a.rows (), a.cols ());
-}
-#endif
-
 /*
 ;;; Local Variables: ***
 ;;; mode: C++ ***
--- a/liboctave/MArray.h
+++ b/liboctave/MArray.h
@@ -30,15 +30,6 @@
 
 #include "Array.h"
 
-// Classes we declare.
-
-template <class T> class MArray;
-template <class T> class MArray2;
-
-#ifndef NO_DIAG_ARRAY
-template <class T> class MDiagArray;
-#endif
-
 // One dimensional array with math ops.
 
 template <class T>
@@ -53,7 +44,7 @@
   MArray (void) : Array<T> () { }
   MArray (int n) : Array<T> (n) { }
   MArray (int n, const T& val) : Array<T> (n, val) { }
-  MArray (const Array<T>& a) : Array<T> (a) { }
+//  MArray (const Array<T>& a) : Array<T> (a) { }
   MArray (const MArray<T>& a) : Array<T> (a) { }
 
   ~MArray (void) { }
@@ -100,127 +91,20 @@
   friend MArray<T> operator - (const MArray<T>& a);
 };
 
-// Two dimensional array with math ops.
-
-template <class T>
-class MArray2 : public Array2<T>
-{
-protected:
-
-  MArray2 (T *d, int n, int m) : Array2<T> (d, n, m) { }
-
-public:
-
-  MArray2 (void) : Array2<T> () { }
-  MArray2 (int n, int m) : Array2<T> (n, m) { }
-  MArray2 (int n, int m, const T& val) : Array2<T> (n, m, val) { }
-  MArray2 (const Array2<T>& a) : Array2<T> (a) { }
-  MArray2 (const MArray2<T>& a) : Array2<T> (a) { }
-
-#ifndef NO_DIAG_ARRAY
-  MArray2 (const MDiagArray<T>& a);
-#endif
-
-  ~MArray2 (void) { }
-
-  MArray2<T>& operator = (const MArray2<T>& a)
-    {
-      Array2<T>::operator = (a);
-      return *this;
-    }
-
-  // element by element MArray2 by scalar ops
-
-  friend MArray2<T>& operator += (MArray2<T>& a, const T& s);
-  friend MArray2<T>& operator -= (MArray2<T>& a, const T& s);
-
-  // element by element MArray2 by MArray2 ops
-
-  friend MArray2<T>& operator += (MArray2<T>& a, const MArray2<T>& b);
-  friend MArray2<T>& operator -= (MArray2<T>& a, const MArray2<T>& b);
-
-  // element by element MArray2 by scalar ops
-
-  friend MArray2<T> operator + (const MArray2<T>& a, const T& s);
-  friend MArray2<T> operator - (const MArray2<T>& a, const T& s);
-  friend MArray2<T> operator * (const MArray2<T>& a, const T& s);
-  friend MArray2<T> operator / (const MArray2<T>& a, const T& s);
-
-  // element by element scalar by MArray2 ops
-
-  friend MArray2<T> operator + (const T& s, const MArray2<T>& a);
-  friend MArray2<T> operator - (const T& s, const MArray2<T>& a);
-  friend MArray2<T> operator * (const T& s, const MArray2<T>& a);
-  friend MArray2<T> operator / (const T& s, const MArray2<T>& a);
-
-  // element by element MArray2 by MArray2 ops
-
-  friend MArray2<T> operator + (const MArray2<T>& a, const MArray2<T>& b);
-  friend MArray2<T> operator - (const MArray2<T>& a, const MArray2<T>& b);
-
-  friend MArray2<T> product (const MArray2<T>& a, const MArray2<T>& b);
-  friend MArray2<T> quotient (const MArray2<T>& a, const MArray2<T>& b);
-
-  friend MArray2<T> operator - (const MArray2<T>& a);
-};
-
-// Two dimensional diagonal array with math ops.
-
-#ifndef NO_DIAG_ARRAY
-template <class T>
-class MDiagArray : public DiagArray<T>
-{
-protected:
-
-  MDiagArray (T *d, int r, int c) : DiagArray<T> (d, r, c) { }
-
-public:
-  
-  MDiagArray (void) : DiagArray<T> () { }
-  MDiagArray (int n) : DiagArray<T> (n) { }
-//  MDiagArray (int n, const T& val) : DiagArray<T> (n, val) { }
-  MDiagArray (int r, int c) : DiagArray<T> (r, c) { }
-  MDiagArray (int r, int c, const T& val) : DiagArray<T> (r, c, val) { }
-  MDiagArray (const DiagArray<T>& a) : DiagArray<T> (a) { }
-  MDiagArray (const MDiagArray<T>& a) : DiagArray<T> (a) { }
-  MDiagArray (const MArray<T>& a) : DiagArray<T> (a) { }
-
-  ~MDiagArray (void) { }
-
-  MDiagArray<T>& operator = (const MDiagArray<T>& a)
-    {
-      DiagArray<T>::operator = (a);
-      return *this;
-    }
-
-  // element by element MDiagArray by MDiagArray ops
-
-  friend MDiagArray<T>& operator += (MDiagArray<T>& a, const MDiagArray<T>& b);
-  friend MDiagArray<T>& operator -= (MDiagArray<T>& a, const MDiagArray<T>& b);
-
-  // element by element MDiagArray by scalar ops
-
-  friend MDiagArray<T> operator * (const MDiagArray<T>& a, const T& s);
-  friend MDiagArray<T> operator / (const MDiagArray<T>& a, const T& s);
-
-  // element by element scalar by MDiagArray ops
-
-  friend MDiagArray<T> operator * (const T& s, const MDiagArray<T>& a);
-
-  // element by element MDiagArray by MDiagArray ops
-
-  friend MDiagArray<T> operator + (const MDiagArray<T>& a,
-				   const MDiagArray<T>& b); 
-
-  friend MDiagArray<T> operator - (const MDiagArray<T>& a,
-				   const MDiagArray<T>& b);
-
-  friend MDiagArray<T> product (const MDiagArray<T>& a,
-				const MDiagArray<T>& b);
-
-  friend MDiagArray<T> operator - (const MDiagArray<T>& a);
-};
-#endif
+#define INSTANTIATE_MARRAY_FRIENDS(T) \
+  template MArray<T> operator + (const MArray<T>& a, const T& s); \
+  template MArray<T> operator - (const MArray<T>& a, const T& s); \
+  template MArray<T> operator * (const MArray<T>& a, const T& s); \
+  template MArray<T> operator / (const MArray<T>& a, const T& s); \
+  template MArray<T> operator + (const T& s, const MArray<T>& a); \
+  template MArray<T> operator - (const T& s, const MArray<T>& a); \
+  template MArray<T> operator * (const T& s, const MArray<T>& a); \
+  template MArray<T> operator / (const T& s, const MArray<T>& a); \
+  template MArray<T> operator + (const MArray<T>& a, const MArray<T>& b); \
+  template MArray<T> operator - (const MArray<T>& a, const MArray<T>& b); \
+  template MArray<T> product (const MArray<T>& a, const MArray<T>& b); \
+  template MArray<T> quotient (const MArray<T>& a, const MArray<T>& b); \
+  template MArray<T> operator - (const MArray<T>& a);
 
 #endif
 
--- a/liboctave/chMatrix.h
+++ b/liboctave/chMatrix.h
@@ -33,7 +33,7 @@
 
 #include <string>
 
-#include "MArray.h"
+#include "MArray2.h"
 
 #include "mx-defs.h"
 
--- a/liboctave/dDiagMatrix.h
+++ b/liboctave/dDiagMatrix.h
@@ -28,34 +28,31 @@
 #pragma interface
 #endif
 
-#include "MArray.h"
+#include "MDiagArray2.h"
 
 #include "dRowVector.h"
 #include "dColVector.h"
 
 #include "mx-defs.h"
 
-class DiagMatrix : public MDiagArray<double>
+class DiagMatrix : public MDiagArray2<double>
 {
 friend class SVD;
 friend class ComplexSVD;
 
 public:
 
-  DiagMatrix (void) : MDiagArray<double> () { }
-  DiagMatrix (int n) : MDiagArray<double> (n) { }
-  DiagMatrix (int n, double val) : MDiagArray<double> (n, n, val) { }
-  DiagMatrix (int r, int c) : MDiagArray<double> (r, c) { }
-  DiagMatrix (int r, int c, double val) : MDiagArray<double> (r, c, val) { }
-  DiagMatrix (const RowVector& a) : MDiagArray<double> (a) { }
-  DiagMatrix (const ColumnVector& a) : MDiagArray<double> (a) { }
-  DiagMatrix (const MDiagArray<double>& a) : MDiagArray<double> (a) { }
-  DiagMatrix (const DiagMatrix& a) : MDiagArray<double> (a) { }
-//  DiagMatrix (double a) : MDiagArray<double> (1, a) { }
+  DiagMatrix (void) : MDiagArray2<double> () { }
+  DiagMatrix (int r, int c) : MDiagArray2<double> (r, c) { }
+  DiagMatrix (int r, int c, double val) : MDiagArray2<double> (r, c, val) { }
+  DiagMatrix (const RowVector& a) : MDiagArray2<double> (a) { }
+  DiagMatrix (const ColumnVector& a) : MDiagArray2<double> (a) { }
+  DiagMatrix (const MDiagArray2<double>& a) : MDiagArray2<double> (a) { }
+  DiagMatrix (const DiagMatrix& a) : MDiagArray2<double> (a) { }
 
   DiagMatrix& operator = (const DiagMatrix& a)
     {
-      MDiagArray<double>::operator = (a);
+      MDiagArray2<double>::operator = (a);
       return *this;
     }
 
@@ -110,7 +107,7 @@
 
 private:
 
-  DiagMatrix (double *d, int nr, int nc) : MDiagArray<double> (d, nr, nc) { }
+  DiagMatrix (double *d, int nr, int nc) : MDiagArray2<double> (d, nr, nc) { }
 };
 
 #endif
--- a/liboctave/dMatrix.h
+++ b/liboctave/dMatrix.h
@@ -31,7 +31,8 @@
 // For FILE...
 #include <cstdio>
 
-#include "MArray.h"
+#include "MArray2.h"
+#include "MDiagArray2.h"
 
 #include "mx-defs.h"
 
@@ -55,7 +56,7 @@
   Matrix (int r, int c, double val) : MArray2<double> (r, c, val) { }
   Matrix (const MArray2<double>& a) : MArray2<double> (a) { }
   Matrix (const Matrix& a) : MArray2<double> (a) { }
-  Matrix (const MDiagArray<double>& a) : MArray2<double> (a) { }
+  //  Matrix (const MDiagArray2<double>& a) : MArray2<double> (a) { }
   Matrix (const DiagMatrix& a);
 
   Matrix (const charMatrix& a);