changeset 10350:12884915a8e4

merge MArray classes & improve Array interface
author Jaroslav Hajek <highegg@gmail.com>
date Sat, 23 Jan 2010 21:41:03 +0100
parents d4d13389c957
children 5150ceb4dbb4
files liboctave/Array-util.cc liboctave/Array.cc liboctave/Array.h liboctave/Array2.h liboctave/Array3.h liboctave/CColVector.cc liboctave/CColVector.h liboctave/CMatrix.cc liboctave/CMatrix.h liboctave/CNDArray.cc liboctave/CNDArray.h liboctave/CRowVector.cc liboctave/CRowVector.h liboctave/CSparse.cc liboctave/ChangeLog liboctave/CmplxCHOL.cc liboctave/CmplxHESS.cc liboctave/CmplxLU.cc liboctave/CmplxQRP.cc liboctave/CmplxSCHUR.cc liboctave/CmplxSVD.cc liboctave/CollocWt.cc liboctave/DASPK-opts.in liboctave/DASPK.cc liboctave/DASRT-opts.in liboctave/DASRT.cc liboctave/DASSL-opts.in liboctave/DASSL.cc liboctave/DiagArray2.cc liboctave/DiagArray2.h liboctave/EIG.cc liboctave/LSODE-opts.in liboctave/LSODE.cc liboctave/MArray-C.cc liboctave/MArray-d.cc liboctave/MArray-defs.h liboctave/MArray-f.cc liboctave/MArray-fC.cc liboctave/MArray-i.cc liboctave/MArray-s.cc liboctave/MArray.cc liboctave/MArray.h liboctave/MArray2.cc liboctave/MArray2.h liboctave/MArrayN.cc liboctave/MArrayN.h liboctave/MDiagArray2.h liboctave/MSparse-defs.h liboctave/MSparse.cc liboctave/MSparse.h liboctave/Makefile.am liboctave/MatrixType.cc liboctave/PermMatrix.cc liboctave/Quad.cc liboctave/SparseCmplxLU.cc liboctave/SparseCmplxQR.cc liboctave/SparseCmplxQR.h liboctave/SparseQR.cc liboctave/SparseQR.h liboctave/SparsedbleLU.cc liboctave/base-lu.cc liboctave/dColVector.h liboctave/dMatrix.cc liboctave/dMatrix.h liboctave/dNDArray.cc liboctave/dNDArray.h liboctave/dRowVector.h liboctave/dSparse.cc liboctave/dbleCHOL.cc liboctave/dbleHESS.cc liboctave/dbleLU.cc liboctave/dbleQRP.cc liboctave/dbleSCHUR.cc liboctave/dbleSVD.cc liboctave/dim-vector.h liboctave/eigs-base.cc liboctave/fCColVector.cc liboctave/fCColVector.h liboctave/fCMatrix.cc liboctave/fCMatrix.h liboctave/fCNDArray.cc liboctave/fCNDArray.h liboctave/fCRowVector.cc liboctave/fCRowVector.h liboctave/fCmplxCHOL.cc liboctave/fCmplxHESS.cc liboctave/fCmplxLU.cc liboctave/fCmplxQRP.cc liboctave/fCmplxSCHUR.cc liboctave/fCmplxSVD.cc liboctave/fColVector.h liboctave/fEIG.cc liboctave/fMatrix.cc liboctave/fMatrix.h liboctave/fNDArray.cc liboctave/fNDArray.h liboctave/fRowVector.h liboctave/floatCHOL.cc liboctave/floatHESS.cc liboctave/floatLU.cc liboctave/floatQRP.cc liboctave/floatSCHUR.cc liboctave/floatSVD.cc liboctave/glob-match.h liboctave/int16NDArray.h liboctave/int32NDArray.h liboctave/int64NDArray.h liboctave/int8NDArray.h liboctave/intNDArray.cc liboctave/intNDArray.h liboctave/oct-fftw.cc liboctave/oct-norm.cc liboctave/oct-rand.cc liboctave/regex-match.cc liboctave/sparse-dmsolve.cc liboctave/str-vec.cc liboctave/str-vec.h liboctave/uint16NDArray.h liboctave/uint32NDArray.h liboctave/uint64NDArray.h liboctave/uint8NDArray.h src/Cell.cc src/ChangeLog src/DLD-FUNCTIONS/__convn__.cc src/DLD-FUNCTIONS/__glpk__.cc src/DLD-FUNCTIONS/__magick_read__.cc src/DLD-FUNCTIONS/bsxfun.cc src/DLD-FUNCTIONS/cellfun.cc src/DLD-FUNCTIONS/conv2.cc src/DLD-FUNCTIONS/dlmread.cc src/DLD-FUNCTIONS/filter.cc src/DLD-FUNCTIONS/kron.cc src/DLD-FUNCTIONS/qz.cc src/DLD-FUNCTIONS/regexp.cc src/DLD-FUNCTIONS/sub2ind.cc src/data.cc src/file-io.cc src/gl-render.cc src/ls-mat5.cc src/oct-map.cc src/oct-obj.h src/oct-parse.yy src/oct-stream.cc src/ov-base-mat.cc src/ov-base-sparse.cc src/ov-perm.cc src/ov-struct.cc src/ov-typeinfo.cc src/ov-typeinfo.h src/ov.cc src/pr-output.cc src/pt-mat.cc src/strfns.cc src/txt-eng-ft.cc src/variables.cc
diffstat 155 files changed, 1482 insertions(+), 1955 deletions(-) [+]
line wrap: on
line diff
--- a/liboctave/Array-util.cc
+++ b/liboctave/Array-util.cc
@@ -202,7 +202,7 @@
 Array<octave_idx_type>
 conv_to_int_array (const Array<idx_vector>& a)
 {
-  Array<octave_idx_type> retval (a.length ());
+  Array<octave_idx_type> retval (a.dims ());
 
   for (octave_idx_type i = 0; i < a.length (); i++)
     retval (i) = a(i).elem (0);
@@ -213,7 +213,7 @@
 Array<idx_vector>
 conv_to_array (const idx_vector *tmp, const octave_idx_type len)
 {
-  Array<idx_vector> retval (len);
+  Array<idx_vector> retval (len, 1);
 
   for (octave_idx_type i = 0; i < len; i++)
       retval (i) = tmp[i];
@@ -347,7 +347,7 @@
 {
   octave_idx_type n = ra_idx.length ();
 
-  Array<octave_idx_type> retval (n);
+  Array<octave_idx_type> retval (n, 1);
 
   for (octave_idx_type i = 0; i < n; i++)
     retval(i) = ra_idx(i).elem (result_idx(i));
@@ -362,7 +362,7 @@
 
   int n_dims = dims.length ();
 
-  retval.resize (n_dims);
+  retval.resize (n_dims, 1);
 
   for (int i = 0; i < n_dims; i++)
     retval(i) = 0;
@@ -564,7 +564,7 @@
 Array<idx_vector> ind2sub (const dim_vector& dv, const idx_vector& idx)
 {
   octave_idx_type len = idx.length (0), n = dv.length ();
-  Array<idx_vector> retval(n);
+  Array<idx_vector> retval(n, 1);
   octave_idx_type numel = dv.numel ();
 
   if (idx.extent (numel) > numel)
--- a/liboctave/Array.cc
+++ b/liboctave/Array.cc
@@ -876,9 +876,10 @@
 // The default fill value.  Override if you want a different one.
 
 template <class T>
-T Array<T>::resize_fill_value ()
+const T& Array<T>::resize_fill_value ()
 {
-  return T ();
+  static T zero = T ();
+  return zero;
 }
 
 // Yes, we could do resize using index & assign.  However, that would
@@ -886,7 +887,7 @@
 
 template <class T>
 void
-Array<T>::resize_fill (octave_idx_type n, const T& rfv)
+Array<T>::resize1 (octave_idx_type n, const T& rfv)
 {
   if (n >= 0 && ndims () == 2)
     {
@@ -931,7 +932,7 @@
                 {
                   static const octave_idx_type max_stack_chunk = 1024;
                   octave_idx_type nn = n + std::min (nx, max_stack_chunk);
-                  Array<T> tmp (Array<T> (nn), dv, 0, n);
+                  Array<T> tmp (Array<T> (nn, 1), dv, 0, n);
                   T *dest = tmp.fortran_vec ();
 
                   copy_or_memcpy (nx, data (), dest);
@@ -959,7 +960,7 @@
 
 template <class T>
 void
-Array<T>::resize_fill (octave_idx_type r, octave_idx_type c, const T& rfv)
+Array<T>::resize (octave_idx_type r, octave_idx_type c, const T& rfv)
 {
   if (r >= 0 && c >= 0 && ndims () == 2)
     {
@@ -1001,7 +1002,7 @@
 
 template<class T>
 void
-Array<T>::resize_fill (const dim_vector& dv, const T& rfv)
+Array<T>::resize (const dim_vector& dv, const T& rfv)
 {
   int dvl = dv.length ();
   if (dvl == 2)
@@ -1034,9 +1035,9 @@
       if (n != nx)
         {
           if (i.is_scalar ())
-            return Array<T> (1, rfv);
+            return Array<T> (1, 1, rfv);
           else
-            tmp.resize_fill (nx, rfv);
+            tmp.resize1 (nx, rfv);
         }
 
       if (tmp.numel () != nx)
@@ -1060,9 +1061,9 @@
       if (r != rx || c != cx)
         {
           if (i.is_scalar () && j.is_scalar ())
-            return Array<T> (1, rfv);
+            return Array<T> (1, 1, rfv);
           else
-            tmp.resize_fill (rx, cx, rfv);
+            tmp.resize (rx, cx, rfv);
         }
 
       if (tmp.rows () != rx || tmp.columns () != cx)
@@ -1090,9 +1091,9 @@
           for (int i = 0; i < ial; i++) 
             all_scalars = all_scalars && ia(i).is_scalar ();
           if (all_scalars)
-            return Array<T> (1, rfv);
+            return Array<T> (1, 1, rfv);
           else
-            tmp.resize_fill (dvx, rfv);
+            tmp.resize (dvx, rfv);
         }
 
       if (tmp.dimensions != dvx)
@@ -1140,7 +1141,7 @@
               return;
             }
 
-          resize_fill (nx, rfv);      
+          resize1 (nx, rfv);      
           n = numel ();
         }
 
@@ -1325,7 +1326,7 @@
                   return;
                 }
 
-              resize_fill (rdv, rfv);
+              resize (rdv, rfv);
               dv = rdv;
             }
 
@@ -1376,7 +1377,7 @@
       if (i.is_scalar () && i(0) == n-1)
         {
           // Stack "pop" operation.
-          resize (n-1);
+          resize1 (n-1);
         }
       else if (i.is_cont_range (n, l, u))
         {
@@ -1449,7 +1450,7 @@
       else
         {
           // Use index.
-          Array<idx_vector> ia (ndims (), idx_vector::colon);
+          Array<idx_vector> ia (ndims (), 1, idx_vector::colon);
           ia (dim) = i.complement (n);
           *this = index (ia);
         }
@@ -1504,7 +1505,7 @@
     assign (i, j, a);
   else
     {
-      Array<idx_vector> idx (a.ndims ());
+      Array<idx_vector> idx (a.ndims (), 1);
       idx(0) = i;
       idx(1) = j;
       for (int k = 0; k < a.ndims (); k++)
@@ -1520,7 +1521,7 @@
 Array<T>::insert (const Array<T>& a, const Array<octave_idx_type>& ra_idx)
 {
   octave_idx_type n = ra_idx.length ();
-  Array<idx_vector> idx (n);
+  Array<idx_vector> idx (n, 1);
   const dim_vector dva = a.dims ().redim (n);
   for (octave_idx_type k = 0; k < n; k++)
     idx(k) = idx_vector (ra_idx (k), ra_idx (k) + dva(k));
@@ -2042,7 +2043,7 @@
 
   octave_idx_type r = rows (), c = cols ();
 
-  idx = Array<octave_idx_type> (r);
+  idx = Array<octave_idx_type> (r, 1);
 
   lsort.sort_rows (data (), idx.fortran_vec (), r, c);
 
@@ -2202,7 +2203,7 @@
       for (octave_idx_type i = 0; i < nel; i++)
         cnt += src[i] != zero;
 
-      retval = Array<octave_idx_type> (cnt);
+      retval.clear (cnt, 1);
       octave_idx_type *dest = retval.fortran_vec ();
       for (octave_idx_type i = 0; i < nel; i++)
         if (src[i] != zero) *dest++ = i;
@@ -2212,7 +2213,7 @@
       // We want a fixed max number of elements, usually small. So be
       // optimistic, alloc the array in advance, and then resize if
       // needed.
-      retval = Array<octave_idx_type> (n);
+      retval.clear (n, 1);
       if (backward)
         {
           // Do the search as a series of successive single-element searches.
@@ -2226,7 +2227,7 @@
                 break;
             }
           if (k < n)
-            retval.resize (k);
+            retval.resize (k, 1);
           octave_idx_type *rdata = retval.fortran_vec ();
           std::reverse (rdata, rdata + k);
         }
@@ -2243,7 +2244,7 @@
                 break;
             }
           if (k < n)
-            retval.resize (k);
+            retval.resize (k, 1);
         }
     }
 
@@ -2599,7 +2600,7 @@
     {
       os << "data:";
 
-      Array<octave_idx_type> ra_idx (n_dims, 0);
+      Array<octave_idx_type> ra_idx (n_dims, 1, 0);
 
       // Number of times the first 2d-array is to be displayed.
 
--- a/liboctave/Array.h
+++ b/liboctave/Array.h
@@ -132,8 +132,8 @@
   T* slice_data;
   octave_idx_type slice_len;
 
-  Array (T *d, octave_idx_type n)
-    : rep (new typename Array<T>::ArrayRep (d, n)), dimensions (n) 
+  Array (T *d, octave_idx_type m, octave_idx_type n)
+    : rep (new typename Array<T>::ArrayRep (d, m*n)), dimensions (m, n) 
     { 
       slice_data = rep->data;
       slice_len = rep->len;
@@ -183,6 +183,8 @@
 
 public:
 
+  // Empty ctor (0x0).
+
   Array (void)
     : rep (nil_rep ()), dimensions () 
     { 
@@ -191,21 +193,57 @@
       slice_len = rep->len;
     }
 
-  explicit Array (octave_idx_type n)
-    : rep (new typename Array<T>::ArrayRep (n)), dimensions (n) 
+  // Obsolete 1D ctor (there are no 1D arrays).
+  explicit Array (octave_idx_type n) GCC_ATTR_DEPRECATED
+    : rep (new typename Array<T>::ArrayRep (n)), dimensions (n, 1) 
     { 
       slice_data = rep->data;
       slice_len = rep->len;
     }
 
-  explicit Array (octave_idx_type n, const T& val)
-    : rep (new typename Array<T>::ArrayRep (n)), dimensions (n)
+  // 2D uninitialized ctor.
+  explicit Array (octave_idx_type m, octave_idx_type n)
+    : rep (), dimensions (m, n) 
+    { 
+      rep = new typename Array<T>::ArrayRep (dimensions.safe_numel ());
+      slice_data = rep->data;
+      slice_len = rep->len;
+    }
+
+  // 2D initialized ctor.
+  explicit Array (octave_idx_type m, octave_idx_type n, const T& val)
+    : rep (), dimensions (m, n) 
+    { 
+      rep = new typename Array<T>::ArrayRep (dimensions.safe_numel ());
+      slice_data = rep->data;
+      slice_len = rep->len;
+      fill (val);
+    }
+
+  // nD uninitialized ctor.
+  explicit Array (const dim_vector& dv)
+    : rep (new typename Array<T>::ArrayRep (dv.safe_numel ())),
+      dimensions (dv) 
+    { 
+      slice_data = rep->data;
+      slice_len = rep->len;
+      dimensions.chop_trailing_singletons ();
+    }
+
+  // nD initialized ctor.
+  explicit Array (const dim_vector& dv, const T& val)
+    : rep (new typename Array<T>::ArrayRep (dv.safe_numel ())),
+      dimensions (dv)
     {
       slice_data = rep->data;
       slice_len = rep->len;
       fill (val);
+      dimensions.chop_trailing_singletons ();
     }
 
+  // Reshape constructor.
+  Array (const Array<T>& a, const dim_vector& dv);
+
   // Type conversion case.
   template <class U>
   Array (const Array<U>& a)
@@ -227,28 +265,6 @@
 
 public:
 
-  Array (const dim_vector& dv)
-    : rep (new typename Array<T>::ArrayRep (dv.safe_numel ())),
-      dimensions (dv) 
-    { 
-      slice_data = rep->data;
-      slice_len = rep->len;
-      dimensions.chop_trailing_singletons ();
-    }
-
-  Array (const dim_vector& dv, const T& val)
-    : rep (new typename Array<T>::ArrayRep (dv.safe_numel ())),
-      dimensions (dv)
-    {
-      slice_data = rep->data;
-      slice_len = rep->len;
-      fill (val);
-      dimensions.chop_trailing_singletons ();
-    }
-
-  // Reshape constructor.
-  Array (const Array<T>& a, const dim_vector& dv);
-
   ~Array (void)
     {
       if (--rep->count <= 0)
@@ -277,8 +293,6 @@
 
   void clear (void);
   void clear (const dim_vector& dv);
-  void clear (octave_idx_type n)
-    { clear (dim_vector (n)); }
 
   void clear (octave_idx_type r, octave_idx_type c)
     { clear (dim_vector (r, c)); }
@@ -292,6 +306,36 @@
   octave_idx_type dim2 (void) const { return dimensions(1); }
   octave_idx_type dim3 (void) const { return dimensions(2); }
 
+  // Return the array as a column vector.
+  Array<T> as_column (void) const
+    {
+      Array<T> retval (*this);
+      if (dimensions.length () != 2 || dimensions(1) != 1)
+        retval.dimensions = dim_vector (numel (), 1);
+
+      return retval;
+    }
+
+  // Return the array as a row vector.
+  Array<T> as_row (void) const
+    {
+      Array<T> retval (*this);
+      if (dimensions.length () != 2 || dimensions(0) != 1)
+        retval.dimensions = dim_vector (1, numel ());
+
+      return retval;
+    }
+
+  // Return the array as a matrix.
+  Array<T> as_matrix (void) const
+    {
+      Array<T> retval (*this);
+      if (dimensions.length () != 2)
+        retval.dimensions = dimensions.redim (2);
+
+      return retval;
+    }
+
   octave_idx_type rows (void) const { return dim1 (); }
   octave_idx_type cols (void) const { return dim2 (); }
   octave_idx_type columns (void) const { return dim2 (); }
@@ -505,50 +549,19 @@
 
   Array<T> index (const Array<idx_vector>& ia) const;
 
-  static T resize_fill_value (); 
+  static const T& resize_fill_value (); 
 
   // Resizing (with fill).
 
-  void resize_fill (octave_idx_type n, const T& rfv);
-
-  void resize_fill (octave_idx_type nr, octave_idx_type nc, const T& rfv);
-
-  void resize_fill (const dim_vector& dv, const T& rfv);
+  void resize1 (octave_idx_type n, const T& rfv = resize_fill_value ());
 
-  // Resizing with default fill.
-  // Rationale: 
-  // These use the default fill value rather than leaving memory uninitialized.
-  // Resizing without fill leaves the resulting array in a rather weird state,
-  // where part of the data is initialized an part isn't.
-
-  void resize (octave_idx_type n)
-    { resize_fill (n, resize_fill_value ()); }
+  void resize (octave_idx_type n) GCC_ATTR_DEPRECATED
+    { resize1 (n); }
 
-  // FIXME -- this method cannot be defined here because it would
-  // clash with
-  //
-  //   void resize (octave_idx_type, const T&)
-  //
-  // (these become indistinguishable when T = octave_idx_type).
-  // In the future, I think the resize (.., const T& rfv) overloads
-  // should go away in favor of using resize_fill.
-
-  // void resize (octave_idx_type nr, octave_idx_type nc)
-  //  { resize_fill (nr, nc, resize_fill_value ()); }
+  void resize (octave_idx_type nr, octave_idx_type nc, 
+               const T& rfv = resize_fill_value ());
 
-  void resize (dim_vector dv)
-    { resize_fill (dv, resize_fill_value ()); }
-
-  // FIXME -- these are here for backward compatibility. They should
-  // go away in favor of using resize_fill directly.
-  void resize (octave_idx_type n, const T& rfv)
-    { resize_fill (n, static_cast<T> (rfv)); }
-
-  void resize (octave_idx_type nr, octave_idx_type nc, const T& rfv)
-    { resize_fill (nr, nc, rfv); }
-
-  void resize (dim_vector dv, const T& rfv)
-    { resize_fill (dv, rfv); }
+  void resize (const dim_vector& dv, const T& rfv = resize_fill_value ());
 
   // Indexing with possible resizing and fill
   // FIXME -- this is really a corner case, that should better be
--- a/liboctave/Array2.h
+++ b/liboctave/Array2.h
@@ -91,10 +91,10 @@
     }
 
   void resize (octave_idx_type r, octave_idx_type c)
-    { Array<T>::resize_fill (r, c, Array<T>::resize_fill_value ()); }
+    { Array<T>::resize (r, c, Array<T>::resize_fill_value ()); }
 
   void resize (octave_idx_type r, octave_idx_type c, const T& val)
-    { Array<T>::resize_fill (r, c, val); }
+    { Array<T>::resize (r, c, val); }
 
   Array2<T>& insert (const Array2<T>& a, octave_idx_type r, octave_idx_type c)
     {
--- a/liboctave/Array3.h
+++ b/liboctave/Array3.h
@@ -72,7 +72,7 @@
     { Array<T>::resize (dim_vector (r, c, p)); }
 
   void resize (octave_idx_type r, octave_idx_type c, octave_idx_type p, const T& val)
-    { Array<T>::resize_fill (dim_vector (r, c, p), val); }
+    { Array<T>::resize (dim_vector (r, c, p), val); }
 
   Array3<T> sort (octave_idx_type dim = 0, sortmode mode = ASCENDING) const
     {
--- a/liboctave/CColVector.cc
+++ b/liboctave/CColVector.cc
@@ -51,10 +51,8 @@
 // Complex Column Vector class
 
 ComplexColumnVector::ComplexColumnVector (const ColumnVector& a)
-   : MArray<Complex> (a.length ())
+   : MArray<Complex> (a)
 {
-  for (octave_idx_type i = 0; i < length (); i++)
-    elem (i) = a.elem (i);
 }
 
 bool
--- a/liboctave/CColVector.h
+++ b/liboctave/CColVector.h
@@ -37,18 +37,20 @@
 
 public:
 
-  ComplexColumnVector (void) : MArray<Complex> () { }
+  ComplexColumnVector (void) : MArray<Complex> (0, 1) { }
 
-  explicit ComplexColumnVector (octave_idx_type n) : MArray<Complex> (n) { }
+  explicit ComplexColumnVector (octave_idx_type n) : MArray<Complex> (n, 1) { }
 
-  explicit ComplexColumnVector (const dim_vector& dv) : MArray<Complex> (dv) { }
+  explicit ComplexColumnVector (const dim_vector& dv) 
+    : MArray<Complex> (dv.as_column ()) { }
 
   ComplexColumnVector (octave_idx_type n, const Complex& val)
-    : MArray<Complex> (n, val) { }
+    : MArray<Complex> (n, 1, val) { }
 
   ComplexColumnVector (const ComplexColumnVector& a) : MArray<Complex> (a) { }
 
-  ComplexColumnVector (const MArray<Complex>& a) : MArray<Complex> (a) { }
+  ComplexColumnVector (const MArray<Complex>& a) : MArray<Complex> (a.as_column ()) { }
+  ComplexColumnVector (const Array<Complex>& a) : MArray<Complex> (a.as_column ()) { }
 
   explicit ComplexColumnVector (const ColumnVector& a);
 
@@ -124,9 +126,15 @@
   friend OCTAVE_API std::ostream& operator << (std::ostream& os, const ComplexColumnVector& a);
   friend OCTAVE_API std::istream& operator >> (std::istream& is, ComplexColumnVector& a);
 
+  void resize (octave_idx_type n, const Complex& rfv = Array<Complex>::resize_fill_value ())
+    { Array<Complex>::resize (n, 1, rfv); }
+
+  void clear (octave_idx_type n)
+    { Array<Complex>::clear (n, 1); }
+
 private:
 
-  ComplexColumnVector (Complex *d, octave_idx_type l) : MArray<Complex> (d, l) { }
+  ComplexColumnVector (Complex *d, octave_idx_type l) : MArray<Complex> (d, l, 1) { }
 };
 
 MARRAY_FORWARD_DEFS (MArray, ComplexColumnVector, Complex)
--- a/liboctave/CMatrix.cc
+++ b/liboctave/CMatrix.cc
@@ -233,46 +233,39 @@
 // Complex Matrix class
 
 ComplexMatrix::ComplexMatrix (const Matrix& a)
-  : MArray2<Complex> (a.rows (), a.cols ())
+  : MArray<Complex> (a)
 {
-  for (octave_idx_type j = 0; j < cols (); j++)
-    for (octave_idx_type i = 0; i < rows (); i++)
-      elem (i, j) = a.elem (i, j);
 }
 
 ComplexMatrix::ComplexMatrix (const RowVector& rv)
-  : MArray2<Complex> (1, rv.length (), 0.0)
+  : MArray<Complex> (rv)
 {
-  for (octave_idx_type i = 0; i < rv.length (); i++)
-    elem (0, i) = rv.elem (i);
 }
 
 ComplexMatrix::ComplexMatrix (const ColumnVector& cv)
-  : MArray2<Complex> (cv.length (), 1, 0.0)
+  : MArray<Complex> (cv)
 {
-  for (octave_idx_type i = 0; i < cv.length (); i++)
-    elem (i, 0) = cv.elem (i);
 }
 
 ComplexMatrix::ComplexMatrix (const DiagMatrix& a)
-  : MArray2<Complex> (a.rows (), a.cols (), 0.0)
+  : MArray<Complex> (a.rows (), a.cols (), 0.0)
 {
   for (octave_idx_type i = 0; i < a.length (); i++)
     elem (i, i) = a.elem (i, i);
 }
 
 ComplexMatrix::ComplexMatrix (const ComplexRowVector& rv)
-  : MArray2<Complex> (Array2<Complex> (rv, 1, rv.length ()))
+  : MArray<Complex> (rv)
 {
 }
 
 ComplexMatrix::ComplexMatrix (const ComplexColumnVector& cv)
-  : MArray2<Complex> (Array2<Complex> (cv, cv.length (), 1))
+  : MArray<Complex> (cv)
 {
 }
 
 ComplexMatrix::ComplexMatrix (const ComplexDiagMatrix& a)
-  : MArray2<Complex> (a.rows (), a.cols (), 0.0)
+  : MArray<Complex> (a.rows (), a.cols (), 0.0)
 {
   for (octave_idx_type i = 0; i < a.length (); i++)
     elem (i, i) = a.elem (i, i);
@@ -282,15 +275,12 @@
 // here?
 
 ComplexMatrix::ComplexMatrix (const boolMatrix& a)
-  : MArray2<Complex> (a.rows (), a.cols (), 0.0)
+  : MArray<Complex> (a)
 {
-  for (octave_idx_type i = 0; i < a.rows (); i++)
-    for (octave_idx_type j = 0; j < a.cols (); j++)
-      elem (i, j) = a.elem (i, j);
 }
 
 ComplexMatrix::ComplexMatrix (const charMatrix& a)
-  : MArray2<Complex> (a.rows (), a.cols (), 0.0)
+  : MArray<Complex> (a.rows (), a.cols (), 0.0)
 {
   for (octave_idx_type i = 0; i < a.rows (); i++)
     for (octave_idx_type j = 0; j < a.cols (); j++)
@@ -298,7 +288,7 @@
 }
 
 ComplexMatrix::ComplexMatrix (const Matrix& re, const Matrix& im)
-  : MArray2<Complex> (re.rows (), re.cols ())
+  : MArray<Complex> (re.rows (), re.cols ())
 {
   if (im.rows () != rows () || im.cols () != cols ())
     (*current_liboctave_error_handler) ("complex: internal error");
@@ -442,7 +432,7 @@
 ComplexMatrix&
 ComplexMatrix::insert (const ComplexMatrix& a, octave_idx_type r, octave_idx_type c)
 {
-  Array2<Complex>::insert (a, r, c);
+  Array<Complex>::insert (a, r, c);
   return *this;
 }
 
@@ -943,13 +933,13 @@
 ComplexRowVector
 ComplexMatrix::row (octave_idx_type i) const
 {
-  return MArray<Complex> (index (idx_vector (i), idx_vector::colon));
+  return index (idx_vector (i), idx_vector::colon);
 }
 
 ComplexColumnVector
 ComplexMatrix::column (octave_idx_type i) const
 {
-  return MArray<Complex> (index (idx_vector::colon, idx_vector (i)));
+  return index (idx_vector::colon, idx_vector (i));
 }
 
 ComplexMatrix
@@ -1062,13 +1052,13 @@
     (*current_liboctave_error_handler) ("inverse requires square matrix");
   else
     {
-      Array<octave_idx_type> ipvt (nr);
+      Array<octave_idx_type> ipvt (nr, 1);
       octave_idx_type *pipvt = ipvt.fortran_vec ();
 
       retval = *this;
       Complex *tmp_data = retval.fortran_vec ();
 
-      Array<Complex> z(1);
+      Array<Complex> z(1, 1);
       octave_idx_type lwork = -1;
 
       // Query the optimum work array size.
@@ -1078,7 +1068,7 @@
 
       lwork = static_cast<octave_idx_type> (std::real(z(0)));
       lwork = (lwork <  2 *nc ? 2*nc : lwork);
-      z.resize (lwork);
+      z.resize (lwork, 1);
       Complex *pz = z.fortran_vec ();
 
       info = 0;
@@ -1099,7 +1089,7 @@
           // Now calculate the condition number for non-singular matrix.
           octave_idx_type zgecon_info = 0;
           char job = '1';
-          Array<double> rz (2 * nc);
+          Array<double> rz (2 * nc, 1);
           double *prz = rz.fortran_vec ();
           F77_XFCN (zgecon, ZGECON, (F77_CONST_CHAR_ARG2 (&job, 1),
                                      nc, tmp_data, nr, anorm, 
@@ -1340,7 +1330,7 @@
 
   octave_idx_type nn = 4*npts+15;
 
-  Array<Complex> wsave (nn);
+  Array<Complex> wsave (nn, 1);
   Complex *pwsave = wsave.fortran_vec ();
 
   retval = *this;
@@ -1381,7 +1371,7 @@
 
   octave_idx_type nn = 4*npts+15;
 
-  Array<Complex> wsave (nn);
+  Array<Complex> wsave (nn, 1);
   Complex *pwsave = wsave.fortran_vec ();
 
   retval = *this;
@@ -1425,7 +1415,7 @@
 
   octave_idx_type nn = 4*npts+15;
 
-  Array<Complex> wsave (nn);
+  Array<Complex> wsave (nn, 1);
   Complex *pwsave = wsave.fortran_vec ();
 
   retval = *this;
@@ -1444,10 +1434,10 @@
   nsamples = nr;
   nn = 4*npts+15;
 
-  wsave.resize (nn);
+  wsave.resize (nn, 1);
   pwsave = wsave.fortran_vec ();
 
-  Array<Complex> tmp (npts);
+  Array<Complex> tmp (npts, 1);
   Complex *prow = tmp.fortran_vec ();
 
   F77_FUNC (zffti, ZFFTI) (npts, pwsave);
@@ -1491,7 +1481,7 @@
 
   octave_idx_type nn = 4*npts+15;
 
-  Array<Complex> wsave (nn);
+  Array<Complex> wsave (nn, 1);
   Complex *pwsave = wsave.fortran_vec ();
 
   retval = *this;
@@ -1513,10 +1503,10 @@
   nsamples = nr;
   nn = 4*npts+15;
 
-  wsave.resize (nn);
+  wsave.resize (nn, 1);
   pwsave = wsave.fortran_vec ();
 
-  Array<Complex> tmp (npts);
+  Array<Complex> tmp (npts, 1);
   Complex *prow = tmp.fortran_vec ();
 
   F77_FUNC (zffti, ZFFTI) (npts, pwsave);
@@ -1614,9 +1604,9 @@
             }
           else 
             {
-              Array<Complex> z (2 * nc);
+              Array<Complex> z (2 * nc, 1);
               Complex *pz = z.fortran_vec ();
-              Array<double> rz (nc);
+              Array<double> rz (nc, 1);
               double *prz = rz.fortran_vec ();
 
               F77_XFCN (zpocon, ZPOCON, (F77_CONST_CHAR_ARG2 (&job, 1),
@@ -1638,7 +1628,7 @@
 
       if (typ == MatrixType::Full)
         {
-          Array<octave_idx_type> ipvt (nr);
+          Array<octave_idx_type> ipvt (nr, 1);
           octave_idx_type *pipvt = ipvt.fortran_vec ();
 
           ComplexMatrix atmp = *this;
@@ -1665,9 +1655,9 @@
                 {
                   // Now calc the condition number for non-singular matrix.
                   char job = '1';
-                  Array<Complex> z (2 * nc);
+                  Array<Complex> z (2 * nc, 1);
                   Complex *pz = z.fortran_vec ();
-                  Array<double> rz (2 * nc);
+                  Array<double> rz (2 * nc, 1);
                   double *prz = rz.fortran_vec ();
 
                   F77_XFCN (zgecon, ZGECON, (F77_CONST_CHAR_ARG2 (&job, 1),
@@ -1730,9 +1720,9 @@
           char uplo = 'U';
           char dia = 'N';
 
-          Array<Complex> z (2 * nc);
+          Array<Complex> z (2 * nc, 1);
           Complex *pz = z.fortran_vec ();
-          Array<double> rz (nc);
+          Array<double> rz (nc, 1);
           double *prz = rz.fortran_vec ();
 
           F77_XFCN (ztrcon, ZTRCON, (F77_CONST_CHAR_ARG2 (&norm, 1), 
@@ -1758,9 +1748,9 @@
           char uplo = 'L';
           char dia = 'N';
 
-          Array<Complex> z (2 * nc);
+          Array<Complex> z (2 * nc, 1);
           Complex *pz = z.fortran_vec ();
-          Array<double> rz (nc);
+          Array<double> rz (nc, 1);
           double *prz = rz.fortran_vec ();
 
           F77_XFCN (ztrcon, ZTRCON, (F77_CONST_CHAR_ARG2 (&norm, 1), 
@@ -1804,9 +1794,9 @@
                 }
               else 
                 {
-                  Array<Complex> z (2 * nc);
+                  Array<Complex> z (2 * nc, 1);
                   Complex *pz = z.fortran_vec ();
-                  Array<double> rz (nc);
+                  Array<double> rz (nc, 1);
                   double *prz = rz.fortran_vec ();
 
                   F77_XFCN (zpocon, ZPOCON, (F77_CONST_CHAR_ARG2 (&job, 1),
@@ -1824,16 +1814,16 @@
             {
               octave_idx_type info = 0;
 
-              Array<octave_idx_type> ipvt (nr);
+              Array<octave_idx_type> ipvt (nr, 1);
               octave_idx_type *pipvt = ipvt.fortran_vec ();
 
               if(anorm < 0.)
                 anorm = atmp.abs().sum().
                   row(static_cast<octave_idx_type>(0)).max();
 
-              Array<Complex> z (2 * nc);
+              Array<Complex> z (2 * nc, 1);
               Complex *pz = z.fortran_vec ();
-              Array<double> rz (2 * nc);
+              Array<double> rz (2 * nc, 1);
               double *prz = rz.fortran_vec ();
 
               F77_XFCN (zgetrf, ZGETRF, (nr, nr, tmp_data, nr, pipvt, info));
@@ -1905,9 +1895,9 @@
                   char uplo = 'U';
                   char dia = 'N';
 
-                  Array<Complex> z (2 * nc);
+                  Array<Complex> z (2 * nc, 1);
                   Complex *pz = z.fortran_vec ();
-                  Array<double> rz (nc);
+                  Array<double> rz (nc, 1);
                   double *prz = rz.fortran_vec ();
 
                   F77_XFCN (ztrcon, ZTRCON, (F77_CONST_CHAR_ARG2 (&norm, 1), 
@@ -2006,9 +1996,9 @@
                   char uplo = 'L';
                   char dia = 'N';
 
-                  Array<Complex> z (2 * nc);
+                  Array<Complex> z (2 * nc, 1);
                   Complex *pz = z.fortran_vec ();
-                  Array<double> rz (nc);
+                  Array<double> rz (nc, 1);
                   double *prz = rz.fortran_vec ();
 
                   F77_XFCN (ztrcon, ZTRCON, (F77_CONST_CHAR_ARG2 (&norm, 1), 
@@ -2114,9 +2104,9 @@
             {
               if (calc_cond)
                 {
-                  Array<Complex> z (2 * nc);
+                  Array<Complex> z (2 * nc, 1);
                   Complex *pz = z.fortran_vec ();
-                  Array<double> rz (nc);
+                  Array<double> rz (nc, 1);
                   double *prz = rz.fortran_vec ();
 
                   F77_XFCN (zpocon, ZPOCON, (F77_CONST_CHAR_ARG2 (&job, 1),
@@ -2166,15 +2156,15 @@
         {
           info = 0;
 
-          Array<octave_idx_type> ipvt (nr);
+          Array<octave_idx_type> ipvt (nr, 1);
           octave_idx_type *pipvt = ipvt.fortran_vec ();
 
           ComplexMatrix atmp = *this;
           Complex *tmp_data = atmp.fortran_vec ();
 
-          Array<Complex> z (2 * nc);
+          Array<Complex> z (2 * nc, 1);
           Complex *pz = z.fortran_vec ();
-          Array<double> rz (2 * nc);
+          Array<double> rz (2 * nc, 1);
           double *prz = rz.fortran_vec ();
 
           // Calculate the norm of the matrix, for later use.
@@ -2620,13 +2610,13 @@
       Complex *tmp_data = atmp.fortran_vec ();
 
       Complex *pretval = retval.fortran_vec ();
-      Array<double> s (minmn);
+      Array<double> s (minmn, 1);
       double *ps = s.fortran_vec ();
 
       // Ask ZGELSD what the dimension of WORK should be.
       octave_idx_type lwork = -1;
 
-      Array<Complex> work (1);
+      Array<Complex> work (1, 1);
 
       octave_idx_type smlsiz;
       F77_FUNC (xilaenv, XILAENV) (9, F77_CONST_CHAR_ARG2 ("ZGELSD", 6),
@@ -2660,13 +2650,13 @@
         + 3*smlsiz*nrhs + (smlsiz+1)*(smlsiz+1);
       if (lrwork < 1)
         lrwork = 1;
-      Array<double> rwork (lrwork);
+      Array<double> rwork (lrwork, 1);
       double *prwork = rwork.fortran_vec ();
 
       octave_idx_type liwork = 3 * minmn * nlvl + 11 * minmn;
       if (liwork < 1)
         liwork = 1;
-      Array<octave_idx_type> iwork (liwork);
+      Array<octave_idx_type> iwork (liwork, 1);
       octave_idx_type* piwork = iwork.fortran_vec ();
 
       F77_XFCN (zgelsd, ZGELSD, (m, n, nrhs, tmp_data, m, pretval, maxmn,
@@ -2704,7 +2694,7 @@
         }
 
       lwork = static_cast<octave_idx_type> (std::real (work(0)));
-      work.resize (lwork);
+      work.resize (lwork, 1);
 
       F77_XFCN (zgelsd, ZGELSD, (m, n, nrhs, tmp_data, m, pretval,
                                  maxmn, ps, rcon, rank,
@@ -2821,13 +2811,13 @@
       Complex *tmp_data = atmp.fortran_vec ();
 
       Complex *pretval = retval.fortran_vec ();
-      Array<double> s (minmn);
+      Array<double> s (minmn, 1);
       double *ps = s.fortran_vec ();
 
       // Ask ZGELSD what the dimension of WORK should be.
       octave_idx_type lwork = -1;
 
-      Array<Complex> work (1);
+      Array<Complex> work (1, 1);
 
       octave_idx_type smlsiz;
       F77_FUNC (xilaenv, XILAENV) (9, F77_CONST_CHAR_ARG2 ("ZGELSD", 6),
@@ -2854,13 +2844,13 @@
         + 3*smlsiz*nrhs + (smlsiz+1)*(smlsiz+1);
       if (lrwork < 1)
         lrwork = 1;
-      Array<double> rwork (lrwork);
+      Array<double> rwork (lrwork, 1);
       double *prwork = rwork.fortran_vec ();
 
       octave_idx_type liwork = 3 * minmn * nlvl + 11 * minmn;
       if (liwork < 1)
         liwork = 1;
-      Array<octave_idx_type> iwork (liwork);
+      Array<octave_idx_type> iwork (liwork, 1);
       octave_idx_type* piwork = iwork.fortran_vec ();
 
       F77_XFCN (zgelsd, ZGELSD, (m, n, nrhs, tmp_data, m, pretval, maxmn,
@@ -2868,9 +2858,9 @@
                                  lwork, prwork, piwork, info));
 
       lwork = static_cast<octave_idx_type> (std::real (work(0)));
-      work.resize (lwork);
-      rwork.resize (static_cast<octave_idx_type> (rwork(0)));
-      iwork.resize (iwork(0));
+      work.resize (lwork, 1);
+      rwork.resize (static_cast<octave_idx_type> (rwork(0)), 1);
+      iwork.resize (iwork(0), 1);
 
       F77_XFCN (zgelsd, ZGELSD, (m, n, nrhs, tmp_data, m, pretval,
                                  maxmn, ps, rcon, rank,
@@ -3259,7 +3249,7 @@
 ComplexMatrix
 ComplexMatrix::diag (octave_idx_type k) const
 {
-  return MArray2<Complex>::diag (k);
+  return MArray<Complex>::diag (k);
 }
 
 bool
@@ -3318,7 +3308,7 @@
   if (nr > 0 && nc > 0)
     {
       result.resize (nr);
-      idx_arg.resize (nr);
+      idx_arg.resize (nr, 1);
 
       for (octave_idx_type i = 0; i < nr; i++)
         {
@@ -3392,7 +3382,7 @@
   if (nr > 0 && nc > 0)
     {
       result.resize (nr);
-      idx_arg.resize (nr);
+      idx_arg.resize (nr, 1);
 
       for (octave_idx_type i = 0; i < nr; i++)
         {
@@ -3466,7 +3456,7 @@
   if (nr > 0 && nc > 0)
     {
       result.resize (nc);
-      idx_arg.resize (nc);
+      idx_arg.resize (1, nc);
 
       for (octave_idx_type j = 0; j < nc; j++)
         {
@@ -3540,7 +3530,7 @@
   if (nr > 0 && nc > 0)
     {
       result.resize (nc);
-      idx_arg.resize (nc);
+      idx_arg.resize (1, nc);
 
       for (octave_idx_type j = 0; j < nc; j++)
         {
--- a/liboctave/CMatrix.h
+++ b/liboctave/CMatrix.h
@@ -24,7 +24,8 @@
 #if !defined (octave_ComplexMatrix_h)
 #define octave_ComplexMatrix_h 1
 
-#include "MArray2.h"
+#include "Array2.h"
+#include "MArray.h"
 #include "MDiagArray2.h"
 #include "MatrixType.h"
 
@@ -35,7 +36,7 @@
 
 class
 OCTAVE_API
-ComplexMatrix : public MArray2<Complex>
+ComplexMatrix : public MArray<Complex>
 {
 public:
  
@@ -44,28 +45,28 @@
 
   typedef void (*solve_singularity_handler) (double rcon);
 
-  ComplexMatrix (void) : MArray2<Complex> () { }
+  ComplexMatrix (void) : MArray<Complex> () { }
 
-  ComplexMatrix (octave_idx_type r, octave_idx_type c) : MArray2<Complex> (r, c) { }
+  ComplexMatrix (octave_idx_type r, octave_idx_type c) : MArray<Complex> (r, c) { }
 
   ComplexMatrix (octave_idx_type r, octave_idx_type c, const Complex& val)
-    : MArray2<Complex> (r, c, val) { }
+    : MArray<Complex> (r, c, val) { }
 
-  ComplexMatrix (const dim_vector& dv) : MArray2<Complex> (dv) { }
+  ComplexMatrix (const dim_vector& dv) : MArray<Complex> (dv.redim (2)) { }
 
   ComplexMatrix (const dim_vector& dv, const Complex& val) 
-    : MArray2<Complex> (dv, val) { }
+    : MArray<Complex> (dv.redim (2), val) { }
 
-  ComplexMatrix (const ComplexMatrix& a) : MArray2<Complex> (a) { }
+  ComplexMatrix (const ComplexMatrix& a) : MArray<Complex> (a) { }
 
   template <class U>
-  ComplexMatrix (const MArray2<U>& a) : MArray2<Complex> (a) { }
+  ComplexMatrix (const MArray<U>& a) : MArray<Complex> (a.as_matrix ()) { }
 
   template <class U>
-  ComplexMatrix (const Array2<U>& a) : MArray2<Complex> (a) { }
+  ComplexMatrix (const Array2<U>& a) : MArray<Complex> (a) { }
 
   template <class U>
-  ComplexMatrix (const Array<U>& a) : MArray2<Complex> (a) { }
+  ComplexMatrix (const Array<U>& a) : MArray<Complex> (a.as_matrix ()) { }
 
   ComplexMatrix (const Matrix& re, const Matrix& im);
 
@@ -89,7 +90,7 @@
 
   ComplexMatrix& operator = (const ComplexMatrix& a)
     {
-      MArray2<Complex>::operator = (a);
+      MArray<Complex>::operator = (a);
       return *this;
     }
 
@@ -136,9 +137,9 @@
   ComplexMatrix stack (const ComplexDiagMatrix& a) const;
 
   ComplexMatrix hermitian (void) const
-    { return MArray2<Complex>::hermitian (std::conj); }
+    { return MArray<Complex>::hermitian (std::conj); }
   ComplexMatrix transpose (void) const
-    { return MArray2<Complex>::transpose (); }
+    { return MArray<Complex>::transpose (); }
 
   friend OCTAVE_API ComplexMatrix conj (const ComplexMatrix& a);
 
@@ -378,7 +379,7 @@
 
 private:
 
-  ComplexMatrix (Complex *d, octave_idx_type r, octave_idx_type c) : MArray2<Complex> (d, r, c) { }
+  ComplexMatrix (Complex *d, octave_idx_type r, octave_idx_type c) : MArray<Complex> (d, r, c) { }
 };
 
 extern OCTAVE_API ComplexMatrix conj (const ComplexMatrix& a);
@@ -431,6 +432,6 @@
 MM_CMP_OP_DECLS (ComplexMatrix, ComplexMatrix, OCTAVE_API)
 MM_BOOL_OP_DECLS (ComplexMatrix, ComplexMatrix, OCTAVE_API)
 
-MARRAY_FORWARD_DEFS (MArray2, ComplexMatrix, Complex)
+MARRAY_FORWARD_DEFS (MArray, ComplexMatrix, Complex)
 
 #endif
--- a/liboctave/CNDArray.cc
+++ b/liboctave/CNDArray.cc
@@ -46,7 +46,7 @@
 #include "bsxfun-defs.cc"
 
 ComplexNDArray::ComplexNDArray (const charNDArray& a)
-  : MArrayN<Complex> (a.dims ())
+  : MArray<Complex> (a.dims ())
 {
   octave_idx_type n = a.numel ();
   for (octave_idx_type i = 0; i < n; i++)
@@ -217,7 +217,7 @@
   ComplexNDArray retval (dv);
   octave_idx_type npts = dv(dim);
   octave_idx_type nn = 4*npts+15;
-  Array<Complex> wsave (nn);
+  Array<Complex> wsave (nn, 1);
   Complex *pwsave = wsave.fortran_vec ();
 
   OCTAVE_LOCAL_BUFFER (Complex, tmp, npts);
@@ -264,7 +264,7 @@
   ComplexNDArray retval (dv);
   octave_idx_type npts = dv(dim);
   octave_idx_type nn = 4*npts+15;
-  Array<Complex> wsave (nn);
+  Array<Complex> wsave (nn, 1);
   Complex *pwsave = wsave.fortran_vec ();
 
   OCTAVE_LOCAL_BUFFER (Complex, tmp, npts);
@@ -314,9 +314,9 @@
     {
       octave_idx_type npts = dv2(i);
       octave_idx_type nn = 4*npts+15;
-      Array<Complex> wsave (nn);
+      Array<Complex> wsave (nn, 1);
       Complex *pwsave = wsave.fortran_vec ();
-      Array<Complex> row (npts);
+      Array<Complex> row (npts, 1);
       Complex *prow = row.fortran_vec ();
 
       octave_idx_type howmany = numel () / npts;
@@ -362,9 +362,9 @@
     {
       octave_idx_type npts = dv2(i);
       octave_idx_type nn = 4*npts+15;
-      Array<Complex> wsave (nn);
+      Array<Complex> wsave (nn, 1);
       Complex *pwsave = wsave.fortran_vec ();
-      Array<Complex> row (npts);
+      Array<Complex> row (npts, 1);
       Complex *prow = row.fortran_vec ();
 
       octave_idx_type howmany = numel () / npts;
@@ -410,9 +410,9 @@
     {
       octave_idx_type npts = dv(i);
       octave_idx_type nn = 4*npts+15;
-      Array<Complex> wsave (nn);
+      Array<Complex> wsave (nn, 1);
       Complex *pwsave = wsave.fortran_vec ();
-      Array<Complex> row (npts);
+      Array<Complex> row (npts, 1);
       Complex *prow = row.fortran_vec ();
 
       octave_idx_type howmany = numel () / npts;
@@ -457,9 +457,9 @@
     {
       octave_idx_type npts = dv(i);
       octave_idx_type nn = 4*npts+15;
-      Array<Complex> wsave (nn);
+      Array<Complex> wsave (nn, 1);
       Complex *pwsave = wsave.fortran_vec ();
-      Array<Complex> row (npts);
+      Array<Complex> row (npts, 1);
       Complex *prow = row.fortran_vec ();
 
       octave_idx_type howmany = numel () / npts;
@@ -786,7 +786,7 @@
   
   if (n == dimensions.length ())
     {
-      Array<octave_idx_type> a_ra_idx (a_dv.length (), 0);
+      Array<octave_idx_type> a_ra_idx (a_dv.length (), 1, 0);
       
       a_ra_idx.elem (0) = r;
       a_ra_idx.elem (1) = c;
@@ -873,7 +873,7 @@
 ComplexNDArray
 ComplexNDArray::diag (octave_idx_type k) const
 {
-  return MArrayN<Complex>::diag (k);
+  return MArray<Complex>::diag (k);
 }
 
 // This contains no information on the array structure !!!
--- a/liboctave/CNDArray.h
+++ b/liboctave/CNDArray.h
@@ -23,7 +23,7 @@
 #if !defined (octave_ComplexNDArray_h)
 #define octave_ComplexNDArray_h 1
 
-#include "MArrayN.h"
+#include "MArray.h"
 #include "CMatrix.h"
 
 #include "mx-defs.h"
@@ -32,34 +32,34 @@
 
 class
 OCTAVE_API
-ComplexNDArray : public MArrayN<Complex>
+ComplexNDArray : public MArray<Complex>
 {
 public:
 
   typedef ComplexMatrix matrix_type;
 
-  ComplexNDArray (void) : MArrayN<Complex> () { }
+  ComplexNDArray (void) : MArray<Complex> () { }
 
-  ComplexNDArray (const dim_vector& dv) : MArrayN<Complex> (dv) { }
+  ComplexNDArray (const dim_vector& dv) : MArray<Complex> (dv) { }
 
   ComplexNDArray (const dim_vector& dv, const Complex& val)
-    : MArrayN<Complex> (dv, val) { }
+    : MArray<Complex> (dv, val) { }
   
-  ComplexNDArray (const ComplexNDArray& a) : MArrayN<Complex> (a) { }
+  ComplexNDArray (const ComplexNDArray& a) : MArray<Complex> (a) { }
 
-  ComplexNDArray (const ComplexMatrix& a) : MArrayN<Complex> (a) { }
+  ComplexNDArray (const ComplexMatrix& a) : MArray<Complex> (a) { }
 
   template <class U>
-  ComplexNDArray (const MArrayN<U>& a) : MArrayN<Complex> (a) { }
+  ComplexNDArray (const MArray<U>& a) : MArray<Complex> (a) { }
 
   template <class U>
-  ComplexNDArray (const Array<U>& a) : MArrayN<Complex> (a) { }
+  ComplexNDArray (const Array<U>& a) : MArray<Complex> (a) { }
 
   ComplexNDArray (const charNDArray&); 
 
   ComplexNDArray& operator = (const ComplexNDArray& a)
     {
-      MArrayN<Complex>::operator = (a);
+      MArray<Complex>::operator = (a);
       return *this;
     }
 
@@ -121,7 +121,7 @@
 
   ComplexMatrix matrix_value (void) const;
 
-  ComplexNDArray squeeze (void) const { return MArrayN<Complex>::squeeze (); }
+  ComplexNDArray squeeze (void) const { return MArray<Complex>::squeeze (); }
 
   static void increment_index (Array<octave_idx_type>& ra_idx,
                                const dim_vector& dimensions,
@@ -144,14 +144,14 @@
 
   ComplexNDArray& changesign (void) 
     { 
-      MArrayN<Complex>::changesign (); 
+      MArray<Complex>::changesign (); 
       return *this; 
     }
 
 private:
 
   ComplexNDArray (Complex *d, const dim_vector& dv)
-    : MArrayN<Complex> (d, dv) { }
+    : MArray<Complex> (d, dv) { }
 };
 
 extern OCTAVE_API ComplexNDArray conj (const ComplexNDArray& a);
@@ -167,7 +167,7 @@
 NDND_CMP_OP_DECLS (ComplexNDArray, ComplexNDArray, OCTAVE_API)
 NDND_BOOL_OP_DECLS (ComplexNDArray, ComplexNDArray, OCTAVE_API)
 
-MARRAY_FORWARD_DEFS (MArrayN, ComplexNDArray, Complex)
+MARRAY_FORWARD_DEFS (MArray, ComplexNDArray, Complex)
 
 extern OCTAVE_API ComplexNDArray& operator *= (ComplexNDArray& a, double s);
 extern OCTAVE_API ComplexNDArray& operator /= (ComplexNDArray& a, double s);
--- a/liboctave/CRowVector.cc
+++ b/liboctave/CRowVector.cc
@@ -54,13 +54,6 @@
 
 // Complex Row Vector class
 
-ComplexRowVector::ComplexRowVector (const RowVector& a)
-  : MArray<Complex> (a.length ())
-{
-  for (octave_idx_type i = 0; i < length (); i++)
-    elem (i) = a.elem (i);
-}
-
 bool
 ComplexRowVector::operator == (const ComplexRowVector& a) const
 {
--- a/liboctave/CRowVector.h
+++ b/liboctave/CRowVector.h
@@ -25,6 +25,7 @@
 #define octave_ComplexRowVector_h 1
 
 #include "MArray.h"
+#include "dRowVector.h"
 
 #include "mx-defs.h"
 
@@ -36,19 +37,20 @@
 
 public:
 
-  ComplexRowVector (void) : MArray<Complex> () { }
+  ComplexRowVector (void) : MArray<Complex> (1, 0) { }
 
-  explicit ComplexRowVector (octave_idx_type n) : MArray<Complex> (n) { }
+  explicit ComplexRowVector (octave_idx_type n) : MArray<Complex> (1, n) { }
 
   explicit ComplexRowVector (const dim_vector& dv) : MArray<Complex> (dv) { }
 
-  ComplexRowVector (octave_idx_type n, const Complex& val) : MArray<Complex> (n, val) { }
+  ComplexRowVector (octave_idx_type n, const Complex& val) : MArray<Complex> (1, n, val) { }
 
   ComplexRowVector (const ComplexRowVector& a) : MArray<Complex> (a) { }
 
-  ComplexRowVector (const MArray<Complex>& a) : MArray<Complex> (a) { }
+  ComplexRowVector (const MArray<Complex>& a) : MArray<Complex> (a.as_row ()) { }
+  ComplexRowVector (const Array<Complex>& a) : MArray<Complex> (a.as_row ()) { }
 
-  explicit ComplexRowVector (const RowVector& a);
+  explicit ComplexRowVector (const RowVector& a) : MArray<Complex> (a) { }
 
   ComplexRowVector& operator = (const ComplexRowVector& a)
     {
@@ -106,9 +108,15 @@
   friend std::ostream& operator << (std::ostream& os, const ComplexRowVector& a);
   friend std::istream& operator >> (std::istream& is, ComplexRowVector& a);
 
+  void resize (octave_idx_type n, const Complex& rfv = Array<Complex>::resize_fill_value ())
+    { Array<Complex>::resize (1, n, rfv); }
+
+  void clear (octave_idx_type n)
+    { Array<Complex>::clear (1, n); }
+
 private:
 
-  ComplexRowVector (Complex *d, octave_idx_type l) : MArray<Complex> (d, l) { }
+  ComplexRowVector (Complex *d, octave_idx_type l) : MArray<Complex> (d, 1, l) { }
 };
 
 // row vector by column vector -> scalar
--- a/liboctave/CSparse.cc
+++ b/liboctave/CSparse.cc
@@ -325,7 +325,7 @@
     }
   else
     {
-      idx_arg.resize_fill (nr, 1, 0);
+      idx_arg.resize (nr, 1, 0);
 
       for (octave_idx_type i = cidx(0); i < cidx(1); i++)
         idx_arg.elem(ridx(i)) = -1;
@@ -480,7 +480,7 @@
     }
   else
     {
-      idx_arg.resize_fill (nr, 1, 0);
+      idx_arg.resize (nr, 1, 0);
 
       for (octave_idx_type i = cidx(0); i < cidx(1); i++)
         idx_arg.elem(ridx(i)) = -1;
@@ -3922,7 +3922,7 @@
           OCTAVE_LOCAL_BUFFER (Complex, DU, nr - 1);
           OCTAVE_LOCAL_BUFFER (Complex, D, nr);
           OCTAVE_LOCAL_BUFFER (Complex, DL, nr - 1);
-          Array<octave_idx_type> ipvt (nr);
+          Array<octave_idx_type> ipvt (nr, 1);
           octave_idx_type *pipvt = ipvt.fortran_vec ();
 
           if (mattype.is_dense ())
@@ -4222,7 +4222,7 @@
           OCTAVE_LOCAL_BUFFER (Complex, DU, nr - 1);
           OCTAVE_LOCAL_BUFFER (Complex, D, nr);
           OCTAVE_LOCAL_BUFFER (Complex, DL, nr - 1);
-          Array<octave_idx_type> ipvt (nr);
+          Array<octave_idx_type> ipvt (nr, 1);
           octave_idx_type *pipvt = ipvt.fortran_vec ();
 
           if (mattype.is_dense ())
@@ -4416,9 +4416,9 @@
             {
               if (calc_cond)
                 {
-                  Array<Complex> z (2 * nr);
+                  Array<Complex> z (2 * nr, 1);
                   Complex *pz = z.fortran_vec ();
-                  Array<double> iz (nr);
+                  Array<double> iz (nr, 1);
                   double *piz = iz.fortran_vec ();
 
                   F77_XFCN (zpbcon, ZPBCON, 
@@ -4510,7 +4510,7 @@
                 }
             }
 
-          Array<octave_idx_type> ipvt (nr);
+          Array<octave_idx_type> ipvt (nr, 1);
           octave_idx_type *pipvt = ipvt.fortran_vec ();
 
           F77_XFCN (zgbtrf, ZGBTRF, (nr, nc, n_lower, n_upper, tmp_data, 
@@ -4537,9 +4537,9 @@
               if (calc_cond)
                 {
                   char job = '1';
-                  Array<Complex> z (2 * nr);
+                  Array<Complex> z (2 * nr, 1);
                   Complex *pz = z.fortran_vec ();
-                  Array<double> iz (nr);
+                  Array<double> iz (nr, 1);
                   double *piz = iz.fortran_vec ();
 
                   F77_XFCN (zgbcon, ZGBCON, 
@@ -4663,9 +4663,9 @@
             {
               if (calc_cond)
                 {
-                  Array<Complex> z (2 * nr);
+                  Array<Complex> z (2 * nr, 1);
                   Complex *pz = z.fortran_vec ();
-                  Array<double> iz (nr);
+                  Array<double> iz (nr, 1);
                   double *piz = iz.fortran_vec ();
 
                   F77_XFCN (zpbcon, ZPBCON, 
@@ -4792,7 +4792,7 @@
                 }
             }
 
-          Array<octave_idx_type> ipvt (nr);
+          Array<octave_idx_type> ipvt (nr, 1);
           octave_idx_type *pipvt = ipvt.fortran_vec ();
 
           F77_XFCN (zgbtrf, ZGBTRF, (nr, nr, n_lower, n_upper, tmp_data, 
@@ -4818,9 +4818,9 @@
               if (calc_cond)
                 {
                   char job = '1';
-                  Array<Complex> z (2 * nr);
+                  Array<Complex> z (2 * nr, 1);
                   Complex *pz = z.fortran_vec ();
-                  Array<double> iz (nr);
+                  Array<double> iz (nr, 1);
                   double *piz = iz.fortran_vec ();
 
                   F77_XFCN (zgbcon, ZGBCON, 
@@ -4983,9 +4983,9 @@
             {
               if (calc_cond)
                 {
-                  Array<Complex> z (2 * nr);
+                  Array<Complex> z (2 * nr, 1);
                   Complex *pz = z.fortran_vec ();
-                  Array<double> iz (nr);
+                  Array<double> iz (nr, 1);
                   double *piz = iz.fortran_vec ();
 
                   F77_XFCN (zpbcon, ZPBCON, 
@@ -5077,7 +5077,7 @@
                 }
             }
 
-          Array<octave_idx_type> ipvt (nr);
+          Array<octave_idx_type> ipvt (nr, 1);
           octave_idx_type *pipvt = ipvt.fortran_vec ();
 
           F77_XFCN (zgbtrf, ZGBTRF, (nr, nr, n_lower, n_upper, tmp_data, 
@@ -5102,9 +5102,9 @@
               if (calc_cond)
                 {
                   char job = '1';
-                  Array<Complex> z (2 * nr);
+                  Array<Complex> z (2 * nr, 1);
                   Complex *pz = z.fortran_vec ();
-                  Array<double> iz (nr);
+                  Array<double> iz (nr, 1);
                   double *piz = iz.fortran_vec ();
 
                   F77_XFCN (zgbcon, ZGBCON, 
@@ -5230,9 +5230,9 @@
             {
               if (calc_cond)
                 {
-                  Array<Complex> z (2 * nr);
+                  Array<Complex> z (2 * nr, 1);
                   Complex *pz = z.fortran_vec ();
-                  Array<double> iz (nr);
+                  Array<double> iz (nr, 1);
                   double *piz = iz.fortran_vec ();
 
                   F77_XFCN (zpbcon, ZPBCON, 
@@ -5364,7 +5364,7 @@
                 }
             }
 
-          Array<octave_idx_type> ipvt (nr);
+          Array<octave_idx_type> ipvt (nr, 1);
           octave_idx_type *pipvt = ipvt.fortran_vec ();
 
           F77_XFCN (zgbtrf, ZGBTRF, (nr, nr, n_lower, n_upper, tmp_data, 
@@ -5390,9 +5390,9 @@
               if (calc_cond)
                 {
                   char job = '1';
-                  Array<Complex> z (2 * nr);
+                  Array<Complex> z (2 * nr, 1);
                   Complex *pz = z.fortran_vec ();
-                  Array<double> iz (nr);
+                  Array<double> iz (nr, 1);
                   double *piz = iz.fortran_vec ();
 
                   F77_XFCN (zgbcon, ZGBCON, 
--- a/liboctave/ChangeLog
+++ b/liboctave/ChangeLog
@@ -1,3 +1,133 @@
+2010-02-23  Jaroslav Hajek  <highegg@gmail.com>
+
+	* Array.h (Array): Define 2D constructors. Remove conflicting 1D
+	initialized constructor. Deprecate 1D constructor. Deprecate 1D resize. 
+	Add 2D resize, resize1. Remove resize_fill. Make resize_fill_value
+	return a reference. Remove 1D clear.
+	
+	* MArray.h (MArray): Merge with MArrayN. Define 2D constructors, sync
+	with Array changes.
+
+	* MArrayN.h, MArray2.h: Deprecate headers, use compatibility #defines.
+	* MArrayN.cc, MArray2.cc: Remove sources.
+	* Makefile.am: Update.
+
+	* fCMatrix.h (FloatComplexMatrix): Rebase on MArray.
+	* fMatrix.h (FloatMatrix): Ditto.
+	* dMatrix.h (Matrix): Ditto.
+	* CMatrix.h (ComplexMatrix): Ditto.
+	* fCNDArray.h (FloatComplexNDArray): Rebase on MArray.
+	* fNDArray.h (FloatNDArray): Ditto.
+	* dNDArray.h (NDArray): Ditto.
+	* CNDArray.h (ComplexNDArray): Ditto.
+
+	* Array-util.cc: Update.
+	* Array.cc: Ditto.
+	* Array2.h: Ditto.
+	* Array3.h: Ditto.
+	* CColVector.cc: Ditto.
+	* CColVector.h: Ditto.
+	* CMatrix.cc: Ditto.
+	* CNDArray.cc: Ditto.
+	* CRowVector.cc: Ditto.
+	* CSparse.cc: Ditto.
+	* ChangeLog: Ditto.
+	* CmplxCHOL.cc: Ditto.
+	* CmplxHESS.cc: Ditto.
+	* CmplxLU.cc: Ditto.
+	* CmplxQRP.cc: Ditto.
+	* CmplxSCHUR.cc: Ditto.
+	* CmplxSVD.cc: Ditto.
+	* CollocWt.cc: Ditto.
+	* DASPK-opts.in: Ditto.
+	* DASPK.cc: Ditto.
+	* DASRT-opts.in: Ditto.
+	* DASRT.cc: Ditto.
+	* DASSL-opts.in: Ditto.
+	* DASSL.cc: Ditto.
+	* DiagArray2.cc: Ditto.
+	* DiagArray2.h: Ditto.
+	* EIG.cc: Ditto.
+	* LSODE-opts.in: Ditto.
+	* LSODE.cc: Ditto.
+	* MArray-C.cc: Ditto.
+	* MArray-d.cc: Ditto.
+	* MArray-defs.h: Ditto.
+	* MArray-f.cc: Ditto.
+	* MArray-fC.cc: Ditto.
+	* MArray-i.cc: Ditto.
+	* MArray-s.cc: Ditto.
+	* MArray.cc: Ditto.
+	* MDiagArray2.h: Ditto.
+	* MSparse-defs.h: Ditto.
+	* MSparse.cc: Ditto.
+	* MSparse.h: Ditto.
+	* Makefile.am: Ditto.
+	* MatrixType.cc: Ditto.
+	* PermMatrix.cc: Ditto.
+	* Quad.cc: Ditto.
+	* SparseCmplxLU.cc: Ditto.
+	* SparseCmplxQR.cc: Ditto.
+	* SparseCmplxQR.h: Ditto.
+	* SparseQR.cc: Ditto.
+	* SparseQR.h: Ditto.
+	* SparsedbleLU.cc: Ditto.
+	* base-lu.cc: Ditto.
+	* dColVector.h: Ditto.
+	* dMatrix.cc: Ditto.
+	* dNDArray.cc: Ditto.
+	* dRowVector.h: Ditto.
+	* dSparse.cc: Ditto.
+	* dbleCHOL.cc: Ditto.
+	* dbleHESS.cc: Ditto.
+	* dbleLU.cc: Ditto.
+	* dbleQRP.cc: Ditto.
+	* dbleSCHUR.cc: Ditto.
+	* dbleSVD.cc: Ditto.
+	* dim-vector.h: Ditto.
+	* eigs-base.cc: Ditto.
+	* fCColVector.cc: Ditto.
+	* fCColVector.h: Ditto.
+	* fCMatrix.cc: Ditto.
+	* fCNDArray.cc: Ditto.
+	* fCRowVector.cc: Ditto.
+	* fCRowVector.h: Ditto.
+	* fCmplxCHOL.cc: Ditto.
+	* fCmplxHESS.cc: Ditto.
+	* fCmplxLU.cc: Ditto.
+	* fCmplxQRP.cc: Ditto.
+	* fCmplxSCHUR.cc: Ditto.
+	* fCmplxSVD.cc: Ditto.
+	* fColVector.h: Ditto.
+	* fEIG.cc: Ditto.
+	* fMatrix.cc: Ditto.
+	* fNDArray.cc: Ditto.
+	* fRowVector.h: Ditto.
+	* floatCHOL.cc: Ditto.
+	* floatHESS.cc: Ditto.
+	* floatLU.cc: Ditto.
+	* floatQRP.cc: Ditto.
+	* floatSCHUR.cc: Ditto.
+	* floatSVD.cc: Ditto.
+	* glob-match.h: Ditto.
+	* int16NDArray.h: Ditto.
+	* int32NDArray.h: Ditto.
+	* int64NDArray.h: Ditto.
+	* int8NDArray.h: Ditto.
+	* intNDArray.cc: Ditto.
+	* intNDArray.h: Ditto.
+	* oct-fftw.cc: Ditto.
+	* oct-norm.cc: Ditto.
+	* oct-rand.cc: Ditto.
+	* regex-match.cc: Ditto.
+	* sparse-dmsolve.cc: Ditto.
+	* str-vec.cc: Ditto.
+	* str-vec.h: Ditto.
+	* uint16NDArray.h: Ditto.
+	* uint32NDArray.h: Ditto.
+	* uint64NDArray.h: Ditto.
+	* uint8NDArray.h: Ditto.
+
 2010-02-22  John W. Eaton  <jwe@octave.org>
 
 	* data-conv.cc, data-conv.h (read_floats, read_doubles,
--- a/liboctave/CmplxCHOL.cc
+++ b/liboctave/CmplxCHOL.cc
@@ -123,9 +123,9 @@
       octave_idx_type zpocon_info = 0;
 
       // Now calculate the condition number for non-singular matrix.
-      Array<Complex> z (2*n);
+      Array<Complex> z (2*n, 1);
       Complex *pz = z.fortran_vec ();
-      Array<double> rz (n);
+      Array<double> rz (n, 1);
       double *prz = rz.fortran_vec ();
       F77_XFCN (zpocon, ZPOCON, (F77_CONST_CHAR_ARG2 ("U", 1), n, h,
                                  n, anorm, xrcond, pz, prz, zpocon_info
@@ -415,7 +415,7 @@
   else
     {
       ComplexMatrix a = chol_mat.hermitian () * chol_mat;
-      Array<octave_idx_type> p (n);
+      Array<octave_idx_type> p (n, 1);
       for (octave_idx_type k = 0; k < n; k++) p(k) = k;
       if (i < j)
         {
--- a/liboctave/CmplxHESS.cc
+++ b/liboctave/CmplxHESS.cc
@@ -81,17 +81,17 @@
   hess_mat = a;
   Complex *h = hess_mat.fortran_vec ();
 
-  Array<double> scale (n);
+  Array<double> scale (n, 1);
   double *pscale = scale.fortran_vec ();
 
   F77_XFCN (zgebal, ZGEBAL, (F77_CONST_CHAR_ARG2 (&job, 1),
                              n, h, n, ilo, ihi, pscale, info
                              F77_CHAR_ARG_LEN (1)));
 
-  Array<Complex> tau (n-1);
+  Array<Complex> tau (n-1, 1);
   Complex *ptau = tau.fortran_vec ();
 
-  Array<Complex> work (lwork);
+  Array<Complex> work (lwork, 1);
   Complex *pwork = work.fortran_vec ();
 
   F77_XFCN (zgehrd, ZGEHRD, (n, ilo, ihi, h, n, ptau, pwork, lwork, info));
--- a/liboctave/CmplxLU.cc
+++ b/liboctave/CmplxLU.cc
@@ -69,7 +69,7 @@
   octave_idx_type a_nc = a.cols ();
   octave_idx_type mn = (a_nr < a_nc ? a_nr : a_nc);
 
-  ipvt.resize (mn);
+  ipvt.resize (mn, 1);
   octave_idx_type *pipvt = ipvt.fortran_vec ();
 
   a_fact = a;
--- a/liboctave/CmplxQRP.cc
+++ b/liboctave/CmplxQRP.cc
@@ -65,7 +65,7 @@
   if (m > n && qr_type == qr_type_std)
     afact.resize (m, m);
 
-  MArray<octave_idx_type> jpvt (n, 0);
+  MArray<octave_idx_type> jpvt (n, 1, 0);
 
   if (m > 0)
     {
--- a/liboctave/CmplxSCHUR.cc
+++ b/liboctave/CmplxSCHUR.cc
@@ -109,17 +109,17 @@
   Complex *s = schur_mat.fortran_vec ();
   Complex *q = unitary_mat.fortran_vec ();
 
-  Array<double> rwork (n);
+  Array<double> rwork (n, 1);
   double *prwork = rwork.fortran_vec ();
 
-  Array<Complex> w (n);
+  Array<Complex> w (n, 1);
   Complex *pw = w.fortran_vec ();
 
-  Array<Complex> work (lwork);
+  Array<Complex> work (lwork, 1);
   Complex *pwork = work.fortran_vec ();
 
   // BWORK is not referenced for non-ordered Schur.
-  Array<octave_idx_type> bwork ((ord_char == 'N' || ord_char == 'n') ? 0 : n);
+  Array<octave_idx_type> bwork ((ord_char == 'N' || ord_char == 'n') ? 0 : n, 1);
   octave_idx_type *pbwork = bwork.fortran_vec ();
 
   F77_XFCN (zgeesx, ZGEESX, (F77_CONST_CHAR_ARG2 (&jobvs, 1),
--- a/liboctave/CmplxSVD.cc
+++ b/liboctave/CmplxSVD.cc
@@ -133,13 +133,13 @@
 
   octave_idx_type lrwork = 5*max_mn;
 
-  Array<double> rwork (lrwork);
+  Array<double> rwork (lrwork, 1);
 
   // Ask ZGESVD what the dimension of WORK should be.
 
   octave_idx_type lwork = -1;
 
-  Array<Complex> work (1);
+  Array<Complex> work (1, 1);
 
   octave_idx_type one = 1;
   octave_idx_type m1 = std::max (m, one), nrow_vt1 = std::max (nrow_vt, one);
@@ -153,7 +153,7 @@
                              F77_CHAR_ARG_LEN (1)));
 
   lwork = static_cast<octave_idx_type> (work(0).real ());
-  work.resize (lwork);
+  work.resize (lwork, 1);
 
   F77_XFCN (zgesvd, ZGESVD, (F77_CONST_CHAR_ARG2 (&jobu, 1),
                              F77_CONST_CHAR_ARG2 (&jobv, 1),
--- a/liboctave/CollocWt.cc
+++ b/liboctave/CollocWt.cc
@@ -102,20 +102,20 @@
   else if (nt == 0)
     return;
 
-  Array<double> dif1 (nt);
+  Array<double> dif1 (nt, 1);
   double *pdif1 = dif1.fortran_vec ();
 
-  Array<double> dif2 (nt);
+  Array<double> dif2 (nt, 1);
   double *pdif2 = dif2.fortran_vec ();
 
-  Array<double> dif3 (nt);
+  Array<double> dif3 (nt, 1);
   double *pdif3 = dif3.fortran_vec ();
 
-  Array<double> vect (nt);
+  Array<double> vect (nt, 1);
   double *pvect = vect.fortran_vec ();
 
-  r.resize (nt);
-  q.resize (nt);
+  r.resize (nt, 1);
+  q.resize (nt, 1);
   A.resize (nt, nt);
   B.resize (nt, nt);
 
--- a/liboctave/DASPK-opts.in
+++ b/liboctave/DASPK-opts.in
@@ -30,13 +30,13 @@
   TYPE = "Array<double>"
   SET_ARG_TYPE = "const $TYPE&"
   INIT_BODY
-    $OPTVAR.resize (1);
+    $OPTVAR.resize (1, 1);
     $OPTVAR(0) = ::sqrt (DBL_EPSILON);
   END_INIT_BODY
   SET_CODE
     void set_$OPT (double val)
       {
-        $OPTVAR.resize (1);
+        $OPTVAR.resize (1, 1);
         $OPTVAR(0) = (val > 0.0) ? val : ::sqrt (DBL_EPSILON);
         reset = true;
       }
@@ -65,13 +65,13 @@
   TYPE = "Array<double>"
   SET_ARG_TYPE = "const $TYPE&"
   INIT_BODY
-    $OPTVAR.resize (1);
+    $OPTVAR.resize (1, 1);
     $OPTVAR(0) = ::sqrt (DBL_EPSILON);
   END_INIT_BODY
   SET_CODE
     void set_$OPT (double val)
       {
-        $OPTVAR.resize (1);
+        $OPTVAR.resize (1, 1);
         $OPTVAR(0) = (val > 0.0) ? val : ::sqrt (DBL_EPSILON);
         reset = true;
       }
@@ -156,7 +156,7 @@
   TYPE = "Array<double>"
   SET_ARG_TYPE = "const $TYPE&"
   INIT_BODY
-    $OPTVAR.resize (6);
+    $OPTVAR.resize (6, 1);
     $OPTVAR(0) = 5.0;
     $OPTVAR(1) = 6.0;
     $OPTVAR(2) = 5.0;
@@ -205,13 +205,13 @@
   TYPE = "Array<octave_idx_type>"
   SET_ARG_TYPE = const $TYPE&
   INIT_BODY
-    $OPTVAR.resize (1);
+    $OPTVAR.resize (1, 1);
     $OPTVAR(0) = 0;
   END_INIT_BODY
   SET_CODE
     void set_$OPT (int val)
       {
-        $OPTVAR.resize (1);
+        $OPTVAR.resize (1, 1);
         $OPTVAR(0) = val;
         reset = true;
       }
@@ -266,13 +266,13 @@
   TYPE = "Array<octave_idx_type>"
   SET_ARG_TYPE = const $TYPE&
   INIT_BODY
-    $OPTVAR.resize (1);
+    $OPTVAR.resize (1, 1);
     $OPTVAR(0) = 0;
   END_INIT_BODY
   SET_CODE
     void set_$OPT (octave_idx_type val)
       {
-        $OPTVAR.resize (1);
+        $OPTVAR.resize (1, 1);
         $OPTVAR(0) = val;
         reset = true;
       }
--- a/liboctave/DASPK.cc
+++ b/liboctave/DASPK.cc
@@ -160,7 +160,7 @@
 
       initialized = true;
 
-      info.resize (20);
+      info.resize (20, 1);
 
       for (octave_idx_type i = 0; i < 20; i++)
         info(i) = 0;
@@ -231,8 +231,8 @@
       if (eavfet == 1)
         lrw += n;
 
-      iwork.resize (liw);
-      rwork.resize (lrw);
+      iwork.resize (liw, 1);
+      rwork.resize (lrw, 1);
 
       piwork = iwork.fortran_vec ();
       prwork = rwork.fortran_vec ();
--- a/liboctave/DASRT-opts.in
+++ b/liboctave/DASRT-opts.in
@@ -30,13 +30,13 @@
   TYPE = "Array<double>"
   SET_ARG_TYPE = "const $TYPE&"
   INIT_BODY
-    $OPTVAR.resize (1);
+    $OPTVAR.resize (1, 1);
     $OPTVAR(0) = ::sqrt (DBL_EPSILON);
   END_INIT_BODY
   SET_CODE
     void set_$OPT (double val)
       {
-        $OPTVAR.resize (1);
+        $OPTVAR.resize (1, 1);
         $OPTVAR(0) = (val > 0.0) ? val : ::sqrt (DBL_EPSILON);
         reset = true;
       }
@@ -64,13 +64,13 @@
   TYPE = "Array<double>"
   SET_ARG_TYPE = "const $TYPE&"
   INIT_BODY
-    $OPTVAR.resize (1);
+    $OPTVAR.resize (1, 1);
     $OPTVAR(0) = ::sqrt (DBL_EPSILON);
   END_INIT_BODY
   SET_CODE
     void set_$OPT (double val)
       {
-        $OPTVAR.resize (1);
+        $OPTVAR.resize (1, 1);
         $OPTVAR(0) = (val > 0.0) ? val : ::sqrt (DBL_EPSILON);
         reset = true;
       }
--- a/liboctave/DASRT.cc
+++ b/liboctave/DASRT.cc
@@ -156,7 +156,7 @@
 
       initialized = true;
 
-      info.resize (15);
+      info.resize (15, 1);
 
       for (octave_idx_type i = 0; i < 15; i++)
         info(i) = 0;
@@ -199,8 +199,8 @@
       liw = 21 + n;
       lrw = 50 + 9*n + n*n + 3*ng;
 
-      iwork.resize (liw);
-      rwork.resize (lrw);
+      iwork.resize (liw, 1);
+      rwork.resize (lrw, 1);
 
       info(0) = 0;
 
@@ -253,7 +253,7 @@
 
       DAEFunc::reset = false;
 
-      jroot.resize (ng, 1);
+      jroot.resize (ng, 1, 1);
 
       pjroot = jroot.fortran_vec ();
 
--- a/liboctave/DASSL-opts.in
+++ b/liboctave/DASSL-opts.in
@@ -30,13 +30,13 @@
   TYPE = "Array<double>"
   SET_ARG_TYPE = "const $TYPE&"
   INIT_BODY
-    $OPTVAR.resize (1);
+    $OPTVAR.resize (1, 1);
     $OPTVAR(0) = ::sqrt (DBL_EPSILON);
   END_INIT_BODY
   SET_CODE
     void set_$OPT (double val)
       {
-        $OPTVAR.resize (1);
+        $OPTVAR.resize (1, 1);
         $OPTVAR(0) = (val > 0.0) ? val : ::sqrt (DBL_EPSILON);
         reset = true;
       }
@@ -65,13 +65,13 @@
   TYPE = "Array<double>"
   SET_ARG_TYPE = "const $TYPE&"
   INIT_BODY
-    $OPTVAR.resize (1);
+    $OPTVAR.resize (1, 1);
     $OPTVAR(0) = ::sqrt (DBL_EPSILON);
   END_INIT_BODY
   SET_CODE
     void set_$OPT (double val)
       {
-        $OPTVAR.resize (1);
+        $OPTVAR.resize (1, 1);
         $OPTVAR(0) = (val > 0.0) ? val : ::sqrt (DBL_EPSILON);
         reset = true;
       }
--- a/liboctave/DASSL.cc
+++ b/liboctave/DASSL.cc
@@ -132,7 +132,7 @@
 
       initialized = true;
 
-      info.resize (15);
+      info.resize (15, 1);
 
       for (octave_idx_type i = 0; i < 15; i++)
         info(i) = 0;
@@ -146,8 +146,8 @@
 
       nn = n;
 
-      iwork.resize (liw);
-      rwork.resize (lrw);
+      iwork.resize (liw, 1);
+      rwork.resize (lrw, 1);
 
       info(0) = 0;
 
--- a/liboctave/DiagArray2.cc
+++ b/liboctave/DiagArray2.cc
@@ -74,9 +74,9 @@
     // The main diagonal is shallow-copied.
     d = *this;
   else if (k > 0 && k < cols ())
-    d = Array<T> (std::min (cols () - k, rows ()), T ());
+    d = Array<T> (std::min (cols () - k, rows ()), 1, T ());
   else if (k < 0 && -k < rows ())
-    d = Array<T> (std::min (rows () + k, cols ()), T ());
+    d = Array<T> (std::min (rows () + k, cols ()), 1, T ());
   else
     (*current_liboctave_error_handler)
       ("diag: requested diagonal out of range");
@@ -135,7 +135,8 @@
 
 template <class T>
 void
-DiagArray2<T>::resize (octave_idx_type r, octave_idx_type c)
+DiagArray2<T>::resize (octave_idx_type r, octave_idx_type c,
+                       const T& rfv)
 {
   if (r < 0 || c < 0)
     {
@@ -145,24 +146,7 @@
 
   if (r != dim1 () || c != dim2 ())
     {
-      Array<T>::resize (std::min (r, c));
-      d1 = r; d2 = c;
-    }
-}
-
-template <class T>
-void
-DiagArray2<T>::resize_fill (octave_idx_type r, octave_idx_type 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 ())
-    {
-      Array<T>::resize_fill (std::min (r, c), val);
+      Array<T>::resize (std::min (r, c), 1, rfv);
       d1 = r; d2 = c;
     }
 }
--- a/liboctave/DiagArray2.h
+++ b/liboctave/DiagArray2.h
@@ -90,7 +90,7 @@
   octave_idx_type d1, d2;
 
   DiagArray2 (T *d, octave_idx_type r, octave_idx_type c) 
-    : Array<T> (d, std::min (r, c)), d1 (r), d2 (c) { }
+    : Array<T> (d, std::min (r, c), 1), d1 (r), d2 (c) { }
 
 public:
 
@@ -100,20 +100,20 @@
     : Array<T> (), d1 (0), d2 (0) { }
 
   DiagArray2 (octave_idx_type r, octave_idx_type c) 
-    : Array<T> (std::min (r, c)), d1 (r), d2 (c) { }
+    : Array<T> (std::min (r, c), 1), d1 (r), d2 (c) { }
 
   DiagArray2 (octave_idx_type r, octave_idx_type c, const T& val) 
-    : Array<T> (std::min (r, c), val), d1 (r), d2 (c) { }
+    : Array<T> (std::min (r, c), 1, val), d1 (r), d2 (c) { }
 
   DiagArray2 (const dim_vector& dv)
-    : Array<T> (std::min (dv(0), dv(1))), d1 (dv(0)), d2 (dv(0))
+    : Array<T> (std::min (dv(0), dv(1)), 1), d1 (dv(0)), d2 (dv(0))
     {
       if (dv.length () != 2)
         (*current_liboctave_error_handler) ("too many dimensions");
     }
 
   DiagArray2 (const Array<T>& a) 
-    : Array<T> (a), d1 (a.numel ()), d2 (a.numel ()) { }
+    : Array<T> (a.as_column ()), d1 (a.numel ()), d2 (a.numel ()) { }
 
   DiagArray2 (const DiagArray2<T>& a) 
     : Array<T> (a), d1 (a.d1), d2 (a.d2) { }
@@ -213,8 +213,8 @@
   T dgxelem (octave_idx_type i) const
     { return Array<T>::xelem (i); }
 
-  void resize (octave_idx_type n, octave_idx_type m);
-  void resize_fill (octave_idx_type n, octave_idx_type m, const T& val);
+  void resize (octave_idx_type n, octave_idx_type m, 
+               const T& rfv = Array<T>::resize_fill_value ());
 
   DiagArray2<T> transpose (void) const;
   DiagArray2<T> hermitian (T (*fcn) (const T&) = 0) const;
--- a/liboctave/EIG.cc
+++ b/liboctave/EIG.cc
@@ -155,10 +155,10 @@
   Matrix atmp = a;
   double *tmp_data = atmp.fortran_vec ();
 
-  Array<double> wr (n);
+  Array<double> wr (n, 1);
   double *pwr = wr.fortran_vec ();
 
-  Array<double> wi (n);
+  Array<double> wi (n, 1);
   double *pwi = wi.fortran_vec ();
 
   octave_idx_type tnvr = calc_ev ? n : 0;
@@ -181,7 +181,7 @@
   if (info == 0)
     {
       lwork = static_cast<octave_idx_type> (dummy_work);
-      Array<double> work (lwork);
+      Array<double> work (lwork, 1);
       double *pwork = work.fortran_vec ();
 
       F77_XFCN (dgeev, DGEEV, (F77_CONST_CHAR_ARG2 ("N", 1),
@@ -274,7 +274,7 @@
   if (info == 0)
     {
       lwork = static_cast<octave_idx_type> (dummy_work);
-      Array<double> work (lwork);
+      Array<double> work (lwork, 1);
       double *pwork = work.fortran_vec ();
 
       F77_XFCN (dsyev, DSYEV, (F77_CONST_CHAR_ARG2 (calc_ev ? "V" : "N", 1),
@@ -341,7 +341,7 @@
   Complex dummy_work;
 
   octave_idx_type lrwork = 2*n;
-  Array<double> rwork (lrwork);
+  Array<double> rwork (lrwork, 1);
   double *prwork = rwork.fortran_vec ();
 
   Complex *dummy = 0;
@@ -357,7 +357,7 @@
   if (info == 0)
     {
       lwork = static_cast<octave_idx_type> (dummy_work.real ());
-      Array<Complex> work (lwork);
+      Array<Complex> work (lwork, 1);
       Complex *pwork = work.fortran_vec ();
 
       F77_XFCN (zgeev, ZGEEV, (F77_CONST_CHAR_ARG2 ("N", 1),
@@ -411,7 +411,7 @@
   Complex dummy_work;
 
   octave_idx_type lrwork = 3*n;
-  Array<double> rwork (lrwork);
+  Array<double> rwork (lrwork, 1);
   double *prwork = rwork.fortran_vec ();
 
   F77_XFCN (zheev, ZHEEV, (F77_CONST_CHAR_ARG2 (calc_ev ? "V" : "N", 1),
@@ -424,7 +424,7 @@
   if (info == 0)
     {
       lwork = static_cast<octave_idx_type> (dummy_work.real ());
-      Array<Complex> work (lwork);
+      Array<Complex> work (lwork, 1);
       Complex *pwork = work.fortran_vec ();
 
       F77_XFCN (zheev, ZHEEV, (F77_CONST_CHAR_ARG2 (calc_ev ? "V" : "N", 1),
@@ -499,13 +499,13 @@
   Matrix btmp = b;
   double *btmp_data = btmp.fortran_vec ();
 
-  Array<double> ar (n);
+  Array<double> ar (n, 1);
   double *par = ar.fortran_vec ();
 
-  Array<double> ai (n);
+  Array<double> ai (n, 1);
   double *pai = ai.fortran_vec ();
 
-  Array<double> beta (n);
+  Array<double> beta (n, 1);
   double *pbeta = beta.fortran_vec ();
 
   octave_idx_type tnvr = calc_ev ? n : 0;
@@ -530,7 +530,7 @@
   if (info == 0)
     {
       lwork = static_cast<octave_idx_type> (dummy_work);
-      Array<double> work (lwork);
+      Array<double> work (lwork, 1);
       double *pwork = work.fortran_vec ();
 
       F77_XFCN (dggev, DGGEV, (F77_CONST_CHAR_ARG2 ("N", 1),
@@ -639,7 +639,7 @@
   if (info == 0)
     {
       lwork = static_cast<octave_idx_type> (dummy_work);
-      Array<double> work (lwork);
+      Array<double> work (lwork, 1);
       double *pwork = work.fortran_vec ();
 
       F77_XFCN (dsygv, DSYGV, (1, F77_CONST_CHAR_ARG2 (calc_ev ? "V" : "N", 1),
@@ -730,7 +730,7 @@
   Complex dummy_work;
 
   octave_idx_type lrwork = 8*n;
-  Array<double> rwork (lrwork);
+  Array<double> rwork (lrwork, 1);
   double *prwork = rwork.fortran_vec ();
 
   Complex *dummy = 0;
@@ -747,7 +747,7 @@
   if (info == 0)
     {
       lwork = static_cast<octave_idx_type> (dummy_work.real ());
-      Array<Complex> work (lwork);
+      Array<Complex> work (lwork, 1);
       Complex *pwork = work.fortran_vec ();
 
       F77_XFCN (zggev, ZGGEV, (F77_CONST_CHAR_ARG2 ("N", 1),
@@ -816,7 +816,7 @@
   Complex dummy_work;
 
   octave_idx_type lrwork = 3*n;
-  Array<double> rwork (lrwork);
+  Array<double> rwork (lrwork, 1);
   double *prwork = rwork.fortran_vec ();
 
   F77_XFCN (zhegv, ZHEGV, (1, F77_CONST_CHAR_ARG2 (calc_ev ? "V" : "N", 1),
@@ -831,7 +831,7 @@
   if (info == 0)
     {
       lwork = static_cast<octave_idx_type> (dummy_work.real ());
-      Array<Complex> work (lwork);
+      Array<Complex> work (lwork, 1);
       Complex *pwork = work.fortran_vec ();
 
       F77_XFCN (zhegv, ZHEGV, (1, F77_CONST_CHAR_ARG2 (calc_ev ? "V" : "N", 1),
--- a/liboctave/LSODE-opts.in
+++ b/liboctave/LSODE-opts.in
@@ -29,13 +29,13 @@
   TYPE = "Array<double>"
   SET_ARG_TYPE = "const $TYPE&"
   INIT_BODY
-    $OPTVAR.resize (1);
+    $OPTVAR.resize (1, 1);
     $OPTVAR(0) = ::sqrt (DBL_EPSILON);
   END_INIT_BODY
   SET_CODE
     void set_$OPT (double val)
       {
-        $OPTVAR.resize (1);
+        $OPTVAR.resize (1, 1);
         $OPTVAR(0) = (val > 0.0) ? val : ::sqrt (DBL_EPSILON);
         reset = true;
       }
--- a/liboctave/LSODE.cc
+++ b/liboctave/LSODE.cc
@@ -150,12 +150,12 @@
 
       maxord = maximum_order ();
 
-      iwork.resize (liw);
+      iwork.resize (liw, 1);
 
       for (octave_idx_type i = 4; i < 9; i++)
         iwork(i) = 0;
 
-      rwork.resize (lrw);
+      rwork.resize (lrw, 1);
 
       for (octave_idx_type i = 4; i < 9; i++)
         rwork(i) = 0;
--- a/liboctave/MArray-C.cc
+++ b/liboctave/MArray-C.cc
@@ -31,35 +31,11 @@
 
 #include "MArray.h"
 #include "MArray.cc"
-template <> OCTAVE_API double MArray<Complex>::norm (double p) const;
-#include "CColVector.h"
-#include "oct-norm.h"
-
-template <>
-OCTAVE_API double
-MArray<Complex>::norm (double p) const
-{
-  return xnorm (ComplexColumnVector (*this), p);
-}
 
 template class OCTAVE_API MArray<Complex>;
 
 INSTANTIATE_MARRAY_FRIENDS (Complex, OCTAVE_API)
 
-#include "MArray2.h"
-#include "MArray2.cc"
-
-template class OCTAVE_API MArray2<Complex>;
-
-INSTANTIATE_MARRAY2_FRIENDS (Complex, OCTAVE_API)
-
-#include "MArrayN.h"
-#include "MArrayN.cc"
-
-template class OCTAVE_API MArrayN<Complex>;
-
-INSTANTIATE_MARRAYN_FRIENDS (Complex, OCTAVE_API)
-
 #include "MDiagArray2.h"
 #include "MDiagArray2.cc"
 
--- a/liboctave/MArray-d.cc
+++ b/liboctave/MArray-d.cc
@@ -28,35 +28,11 @@
 
 #include "MArray.h"
 #include "MArray.cc"
-template <> OCTAVE_API double MArray<double>::norm (double p) const;
-#include "dColVector.h"
-#include "oct-norm.h"
-
-template <>
-OCTAVE_API double
-MArray<double>::norm (double p) const
-{
-  return xnorm (ColumnVector (*this), p);
-}
 
 template class OCTAVE_API MArray<double>;
 
 INSTANTIATE_MARRAY_FRIENDS (double, OCTAVE_API)
 
-#include "MArray2.h"
-#include "MArray2.cc"
-
-template class OCTAVE_API MArray2<double>;
-
-INSTANTIATE_MARRAY2_FRIENDS (double, OCTAVE_API)
-
-#include "MArrayN.h"
-#include "MArrayN.cc"
-
-template class OCTAVE_API MArrayN<double>;
-
-INSTANTIATE_MARRAYN_FRIENDS (double, OCTAVE_API)
-
 #include "MDiagArray2.h"
 #include "MDiagArray2.cc"
 
--- a/liboctave/MArray-defs.h
+++ b/liboctave/MArray-defs.h
@@ -58,20 +58,6 @@
   MARRAY_UNOP_DEFS (MArray, T, API) \
   MARRAY_BINOP_DEFS (MArray, T, API)
 
-// Instantiate all the MArray2 friends for MArray2 element type T.
-#define INSTANTIATE_MARRAY2_FRIENDS(T, API) \
-  MARRAY_OP_ASSIGN_DEFS1 (MArray2, T, T, API) \
-  MARRAY_OP_ASSIGN_DEFS (MArray2, T, MArray2<T>, API) \
-  MARRAY_UNOP_DEFS (MArray2, T, API) \
-  MARRAY_BINOP_DEFS (MArray2, T, API)
-
-// Instantiate all the MArrayN friends for MArrayN element type T.
-#define INSTANTIATE_MARRAYN_FRIENDS(T, API) \
-  MARRAY_OP_ASSIGN_DEFS1 (MArrayN, T, T, API) \
-  MARRAY_OP_ASSIGN_DEFS (MArrayN, T, MArrayN<T>, API) \
-  MARRAY_UNOP_DEFS (MArrayN, T, API) \
-  MARRAY_BINOP_DEFS (MArrayN, T, API)
-
 // Instantiate all the MDiagArray2 friends for MDiagArray2 element type T.
 #define INSTANTIATE_MDIAGARRAY2_FRIENDS(T, API) \
   MARRAY_UNOP_DEFS (MDiagArray2, T, API) \
--- a/liboctave/MArray-f.cc
+++ b/liboctave/MArray-f.cc
@@ -29,35 +29,11 @@
 
 #include "MArray.h"
 #include "MArray.cc"
-template <> OCTAVE_API float MArray<float>::norm (float p) const;
-#include "fColVector.h"
-#include "oct-norm.h"
-
-template <>
-OCTAVE_API float
-MArray<float>::norm (float p) const
-{
-  return xnorm (FloatColumnVector (*this), p);
-}
 
 template class OCTAVE_API MArray<float>;
 
 INSTANTIATE_MARRAY_FRIENDS (float, OCTAVE_API)
 
-#include "MArray2.h"
-#include "MArray2.cc"
-
-template class OCTAVE_API MArray2<float>;
-
-INSTANTIATE_MARRAY2_FRIENDS (float, OCTAVE_API)
-
-#include "MArrayN.h"
-#include "MArrayN.cc"
-
-template class OCTAVE_API MArrayN<float>;
-
-INSTANTIATE_MARRAYN_FRIENDS (float, OCTAVE_API)
-
 #include "MDiagArray2.h"
 #include "MDiagArray2.cc"
 
--- a/liboctave/MArray-fC.cc
+++ b/liboctave/MArray-fC.cc
@@ -31,35 +31,11 @@
 
 #include "MArray.h"
 #include "MArray.cc"
-template <> OCTAVE_API float MArray<FloatComplex>::norm (float p) const;
-#include "fCColVector.h"
-#include "oct-norm.h"
-
-template <>
-OCTAVE_API float
-MArray<FloatComplex>::norm (float p) const
-{
-  return xnorm (FloatComplexColumnVector (*this), p);
-}
 
 template class OCTAVE_API MArray<FloatComplex>;
 
 INSTANTIATE_MARRAY_FRIENDS (FloatComplex, OCTAVE_API)
 
-#include "MArray2.h"
-#include "MArray2.cc"
-
-template class OCTAVE_API MArray2<FloatComplex>;
-
-INSTANTIATE_MARRAY2_FRIENDS (FloatComplex, OCTAVE_API)
-
-#include "MArrayN.h"
-#include "MArrayN.cc"
-
-template class OCTAVE_API MArrayN<FloatComplex>;
-
-INSTANTIATE_MARRAYN_FRIENDS (FloatComplex, OCTAVE_API)
-
 #include "MDiagArray2.h"
 #include "MDiagArray2.cc"
 
--- a/liboctave/MArray-i.cc
+++ b/liboctave/MArray-i.cc
@@ -57,40 +57,6 @@
 INSTANTIATE_MARRAY_FRIENDS (octave_uint32, OCTAVE_API)
 INSTANTIATE_MARRAY_FRIENDS (octave_uint64, OCTAVE_API)
 
-#include "MArray2.h"
-#include "MArray2.cc"
-
-template class OCTAVE_API MArray2<int>;
-
-INSTANTIATE_MARRAY2_FRIENDS (int, OCTAVE_API)
-
-#include "MArrayN.h"
-#include "MArrayN.cc"
-
-template class OCTAVE_API MArrayN<int>;
-
-INSTANTIATE_MARRAYN_FRIENDS (int, OCTAVE_API)
-
-template class OCTAVE_API MArrayN<octave_int8>;
-template class OCTAVE_API MArrayN<octave_int16>;
-template class OCTAVE_API MArrayN<octave_int32>;
-template class OCTAVE_API MArrayN<octave_int64>;
-
-INSTANTIATE_MARRAYN_FRIENDS (octave_int8, OCTAVE_API)
-INSTANTIATE_MARRAYN_FRIENDS (octave_int16, OCTAVE_API)
-INSTANTIATE_MARRAYN_FRIENDS (octave_int32, OCTAVE_API)
-INSTANTIATE_MARRAYN_FRIENDS (octave_int64, OCTAVE_API)
-
-template class OCTAVE_API MArrayN<octave_uint8>;
-template class OCTAVE_API MArrayN<octave_uint16>;
-template class OCTAVE_API MArrayN<octave_uint32>;
-template class OCTAVE_API MArrayN<octave_uint64>;
-
-INSTANTIATE_MARRAYN_FRIENDS (octave_uint8, OCTAVE_API)
-INSTANTIATE_MARRAYN_FRIENDS (octave_uint16, OCTAVE_API)
-INSTANTIATE_MARRAYN_FRIENDS (octave_uint32, OCTAVE_API)
-INSTANTIATE_MARRAYN_FRIENDS (octave_uint64, OCTAVE_API)
-
 #include "MDiagArray2.h"
 #include "MDiagArray2.cc"
 
--- a/liboctave/MArray-s.cc
+++ b/liboctave/MArray-s.cc
@@ -33,13 +33,6 @@
 
 INSTANTIATE_MARRAY_FRIENDS (short, OCTAVE_API)
 
-#include "MArray2.h"
-#include "MArray2.cc"
-
-template class OCTAVE_API MArray2<short>;
-
-INSTANTIATE_MARRAY2_FRIENDS (short, OCTAVE_API)
-
 #include "MDiagArray2.h"
 #include "MDiagArray2.cc"
 
--- a/liboctave/MArray.cc
+++ b/liboctave/MArray.cc
@@ -31,27 +31,119 @@
 #include "lo-error.h"
 
 #include "MArray-defs.h"
+#include "mx-inlines.cc"
 
-// One dimensional array with math ops.
+template <class T>
+struct _idxadds_helper
+{
+  T *array;
+  T val;
+  _idxadds_helper (T *a, T v) : array (a), val (v) { }
+  void operator () (octave_idx_type i)
+    { array[i] += val; }
+};
 
 template <class T>
-double
-MArray<T>::norm (double) const
+struct _idxadda_helper
+{
+  T *array;
+  const T *vals;
+  _idxadda_helper (T *a, const T *v) : array (a), vals (v) { }
+  void operator () (octave_idx_type i)
+    { array[i] += *vals++; }
+};
+
+template <class T>
+void
+MArray<T>::idx_add (const idx_vector& idx, T val)
 {
-  (*current_liboctave_error_handler)
-    ("norm: only implemented for double and complex values");
+  octave_idx_type n = this->length ();
+  octave_idx_type ext = idx.extent (n);
+  if (ext > n)
+    {
+      this->resize1 (ext);
+      n = ext;
+    }
 
-  return 0;
+  octave_quit ();
+
+  octave_idx_type len = idx.length (n);
+  idx.loop (len, _idxadds_helper<T> (this->fortran_vec (), val));
 }
 
 template <class T>
-float
-MArray<T>::norm (float) const
+void
+MArray<T>::idx_add (const idx_vector& idx, const MArray<T>& vals)
+{
+  octave_idx_type n = this->length ();
+  octave_idx_type ext = idx.extent (n);
+  if (ext > n)
+    {
+      this->resize1 (ext);
+      n = ext;
+    }
+
+  octave_quit ();
+
+  octave_idx_type len = std::min (idx.length (n), vals.length ());
+  idx.loop (len, _idxadda_helper<T> (this->fortran_vec (), vals.data ()));
+}
+
+template <class T, T op (typename ref_param<T>::type, typename ref_param<T>::type)>
+struct _idxbinop_helper
+{
+  T *array;
+  const T *vals;
+  _idxbinop_helper (T *a, const T *v) : array (a), vals (v) { }
+  void operator () (octave_idx_type i)
+    { array[i] = op (array[i], *vals++); }
+};
+
+template <class T>
+void
+MArray<T>::idx_min (const idx_vector& idx, const MArray<T>& vals)
 {
-  (*current_liboctave_error_handler)
-    ("norm: only implemented for double and complex values");
+  octave_idx_type n = this->length ();
+  octave_idx_type ext = idx.extent (n);
+  if (ext > n)
+    {
+      this->resize1 (ext);
+      n = ext;
+    }
+
+  octave_quit ();
+
+  octave_idx_type len = std::min (idx.length (n), vals.length ());
+  idx.loop (len, _idxbinop_helper<T, xmin> (this->fortran_vec (), vals.data ()));
+}
 
-  return 0;
+template <class T>
+void
+MArray<T>::idx_max (const idx_vector& idx, const MArray<T>& vals)
+{
+  octave_idx_type n = this->length ();
+  octave_idx_type ext = idx.extent (n);
+  if (ext > n)
+    {
+      this->resize1 (ext);
+      n = ext;
+    }
+
+  octave_quit ();
+
+  octave_idx_type len = std::min (idx.length (n), vals.length ());
+  idx.loop (len, _idxbinop_helper<T, xmax> (this->fortran_vec (), vals.data ()));
+}
+
+// N-dimensional array with math ops.
+template <class T>
+void
+MArray<T>::changesign (void)
+{
+  if (Array<T>::is_shared ())
+    *this = - *this;
+  else
+    do_mx_inplace_op<MArray<T> > (*this, mx_inline_uminus2);
 }
 
 // Element by element MArray by scalar ops.
@@ -124,6 +216,7 @@
   return a;
 }
 
+
 template <class T>
 MArray<T>&
 product_eq (MArray<T>& a, const MArray<T>& b)
@@ -148,7 +241,7 @@
 
 // Element by element MArray by scalar ops.
 
-#define MARRAY_AS_OP(OP, FN) \
+#define MARRAY_NDS_OP(OP, FN) \
   template <class T> \
   MArray<T> \
   operator OP (const MArray<T>& a, const T& s) \
@@ -156,14 +249,14 @@
     return do_ms_binary_op<MArray<T>, MArray<T>, T> (a, s, FN); \
   }
 
-MARRAY_AS_OP (+, mx_inline_add)
-MARRAY_AS_OP (-, mx_inline_sub)
-MARRAY_AS_OP (*, mx_inline_mul)
-MARRAY_AS_OP (/, mx_inline_div)
+MARRAY_NDS_OP (+, mx_inline_add)
+MARRAY_NDS_OP (-, mx_inline_sub)
+MARRAY_NDS_OP (*, mx_inline_mul)
+MARRAY_NDS_OP (/, mx_inline_div)
 
 // Element by element scalar by MArray ops.
 
-#define MARRAY_SA_OP(OP, FN) \
+#define MARRAY_SND_OP(OP, FN) \
   template <class T> \
   MArray<T> \
   operator OP (const T& s, const MArray<T>& a) \
@@ -171,14 +264,14 @@
     return do_sm_binary_op<MArray<T>, T, MArray<T> > (s, a, FN); \
   }
 
-MARRAY_SA_OP(+, mx_inline_add)
-MARRAY_SA_OP(-, mx_inline_sub)
-MARRAY_SA_OP(*, mx_inline_mul)
-MARRAY_SA_OP(/, mx_inline_div)
+MARRAY_SND_OP (+, mx_inline_add)
+MARRAY_SND_OP (-, mx_inline_sub)
+MARRAY_SND_OP (*, mx_inline_mul)
+MARRAY_SND_OP (/, mx_inline_div)
 
 // Element by element MArray by MArray ops.
 
-#define MARRAY_AA_OP(FCN, OP, FN) \
+#define MARRAY_NDND_OP(FCN, OP, FN) \
   template <class T> \
   MArray<T> \
   FCN (const MArray<T>& a, const MArray<T>& b) \
@@ -186,12 +279,10 @@
     return do_mm_binary_op<MArray<T>, MArray<T>, MArray<T> > (a, b, FN, #FCN); \
   }
 
-MARRAY_AA_OP (operator +, +, mx_inline_add)
-MARRAY_AA_OP (operator -, -, mx_inline_sub)
-MARRAY_AA_OP (product,    *, mx_inline_mul)
-MARRAY_AA_OP (quotient,   /, mx_inline_div)
-
-// Unary MArray ops.
+MARRAY_NDND_OP (operator +, +, mx_inline_add)
+MARRAY_NDND_OP (operator -, -, mx_inline_sub)
+MARRAY_NDND_OP (product,    *, mx_inline_mul)
+MARRAY_NDND_OP (quotient,   /, mx_inline_div)
 
 template <class T>
 MArray<T>
--- a/liboctave/MArray.h
+++ b/liboctave/MArray.h
@@ -27,7 +27,7 @@
 
 #include "Array.h"
 
-// One dimensional array with math ops.
+// N-dimensional array with math ops.
 
 // But first, some preprocessor abuse...
 
@@ -41,22 +41,29 @@
 {
 protected:
 
-  MArray (T *d, octave_idx_type l) : Array<T> (d, l) { }
+  MArray (T *d, octave_idx_type m, octave_idx_type n) : Array<T> (d, m, n) { }
+  MArray (T *d, const dim_vector& dv) : Array<T> (d, dv) { }
 
 public:
   
-  MArray (void) : Array<T> () { }
+  MArray (void) : Array<T> () {}
+  
+  explicit MArray (octave_idx_type m, octave_idx_type n) 
+    : Array<T> (m, n) { }
 
-  explicit MArray (octave_idx_type n) : Array<T> (n) { }
+  explicit MArray (octave_idx_type m, octave_idx_type n, const T& val) 
+    : Array<T> (m, n, val) { }
 
-  MArray (octave_idx_type n, const T& val) : Array<T> (n, val) { }
+  explicit MArray (const dim_vector& dv) 
+    : Array<T> (dv) { }
+  
+  explicit MArray (const dim_vector& dv, const T& val) 
+    : Array<T> (dv, val) { }
 
   MArray (const MArray<T>& a) : Array<T> (a) { }
 
-  // FIXME: kluge.
-  MArray (const Array<T>& a) : Array<T> (a, dim_vector (a.length ())) { }
-
-  MArray (const dim_vector& dv) : Array<T> (dv) { }
+  template <class U>
+  MArray (const Array<U>& a) : Array<T> (a) { }
 
   ~MArray (void) { }
 
@@ -66,31 +73,35 @@
       return *this;
     }
 
-  // FIXME: kluge again. This design really sucks.
-  void resize (octave_idx_type n, const T& val = Array<T>::resize_fill_value ())
-    { Array<T>::resize_fill (n, 1, val); }
+  MArray<T> reshape (const dim_vector& new_dims) const
+    { return Array<T>::reshape (new_dims); }
+
+  MArray<T> permute (const Array<octave_idx_type>& vec, 
+                      bool inv = false) const
+    { return Array<T>::permute (vec, inv); }
 
-  MArray<T> transpose (void) const { return Array<T>::transpose (); }
-  MArray<T> hermitian (T (*fcn) (const T&) = 0) const { return Array<T>::hermitian (fcn); }
+  MArray<T> ipermute (const Array<octave_idx_type>& vec) const
+    { return Array<T>::ipermute (vec); }
 
-  double norm (double p) const;
-  float norm (float p) const;
+  MArray squeeze (void) const { return Array<T>::squeeze (); }
+
+  MArray<T> transpose (void) const
+    { return Array<T>::transpose (); }
 
-  // FIXME: should go away.
-  template <class U>
-  MArray<U>
-  map (U (&fcn) (T)) const
-  { return Array<T>::template map<U> (fcn); }
+  MArray<T> hermitian (T (*fcn) (const T&) = 0) const
+    { return Array<T>::hermitian (fcn); }
+
+  // Performs indexed accumulative addition.
+
+  void idx_add (const idx_vector& idx, T val);
 
-  template <class U>
-  MArray<U>
-  map (U (&fcn) (const T&)) const
-  { return Array<T>::template map<U> (fcn); }
+  void idx_add (const idx_vector& idx, const MArray<T>& vals);
+
+  void idx_min (const idx_vector& idx, const MArray<T>& vals);
 
-  // Currently, the OPS functions don't need to be friends, but that
-  // may change.
+  void idx_max (const idx_vector& idx, const MArray<T>& vals);
 
-  // MARRAY_OPS_FRIEND_DECLS (MArray)
+  void changesign (void);
 };
 
 #endif
deleted file mode 100644
--- a/liboctave/MArray2.cc
+++ /dev/null
@@ -1,188 +0,0 @@
-/*
-
-Copyright (C) 1996, 1997, 1998, 2000, 2002, 2003, 2004, 2005, 2007
-              John W. Eaton
-
-This file is part of Octave.
-
-Octave is free software; you can redistribute it and/or modify it
-under the terms of the GNU General Public License as published by the
-Free Software Foundation; either version 3 of the License, or (at your
-option) any later version.
-
-Octave is distributed in the hope that it will be useful, but WITHOUT
-ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
-FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
-for more details.
-
-You should have received a copy of the GNU General Public License
-along with Octave; see the file COPYING.  If not, see
-<http://www.gnu.org/licenses/>.
-
-*/
-
-#ifdef HAVE_CONFIG_H
-#include <config.h>
-#endif
-
-#include "MArray2.h"
-#include "Array-util.h"
-#include "lo-error.h"
-
-#include "MArray-defs.h"
-
-// Two dimensional array with math ops.
-
-// Element by element MArray2 by scalar ops.
-
-template <class T>
-MArray2<T>&
-operator += (MArray2<T>& a, const T& s)
-{
-  if (a.is_shared ())
-    a = a + s;
-  else
-    do_ms_inplace_op<MArray2<T>, T> (a, s, mx_inline_add2);
-  return a;
-}
-
-template <class T>
-MArray2<T>&
-operator -= (MArray2<T>& a, const T& s)
-{
-  if (a.is_shared ())
-    a = a - s;
-  else
-    do_ms_inplace_op<MArray2<T>, T> (a, s, mx_inline_sub2);
-  return a;
-}
-
-template <class T>
-MArray2<T>&
-operator *= (MArray2<T>& a, const T& s)
-{
-  if (a.is_shared ())
-    a = a * s;
-  else
-    do_ms_inplace_op<MArray2<T>, T> (a, s, mx_inline_mul2);
-  return a;
-}
-
-template <class T>
-MArray2<T>&
-operator /= (MArray2<T>& a, const T& s)
-{
-  if (a.is_shared ())
-    a = a / s;
-  else
-    do_ms_inplace_op<MArray2<T>, T> (a, s, mx_inline_div2);
-  return a;
-}
-
-// Element by element MArray2 by MArray2 ops.
-
-template <class T>
-MArray2<T>&
-operator += (MArray2<T>& a, const MArray2<T>& b)
-{
-  if (a.is_shared ())
-    a = a + b;
-  else
-    do_mm_inplace_op<MArray2<T>, MArray2<T> > (a, b, mx_inline_add2, "+=");
-  return a;
-}
-
-template <class T>
-MArray2<T>&
-operator -= (MArray2<T>& a, const MArray2<T>& b)
-{
-  if (a.is_shared ())
-    a = a - b;
-  else
-    do_mm_inplace_op<MArray2<T>, MArray2<T> > (a, b, mx_inline_sub2, "-=");
-  return a;
-}
-
-
-template <class T>
-MArray2<T>&
-product_eq (MArray2<T>& a, const MArray2<T>& b)
-{
-  if (a.is_shared ())
-    return a = product (a, b);
-  else
-    do_mm_inplace_op<MArray2<T>, MArray2<T> > (a, b, mx_inline_mul2, ".*=");
-  return a;
-}
-
-template <class T>
-MArray2<T>&
-quotient_eq (MArray2<T>& a, const MArray2<T>& b)
-{
-  if (a.is_shared ())
-    return a = quotient (a, b);
-  else
-    do_mm_inplace_op<MArray2<T>, MArray2<T> > (a, b, mx_inline_div2, "./=");
-  return a;
-}
-
-// Element by element MArray2 by scalar ops.
-
-#define MARRAY_A2S_OP(OP, FN) \
-  template <class T> \
-  MArray2<T> \
-  operator OP (const MArray2<T>& a, const T& s) \
-  { \
-    return do_ms_binary_op<MArray2<T>, MArray2<T>, T> (a, s, FN); \
-  }
-
-MARRAY_A2S_OP (+, mx_inline_add)
-MARRAY_A2S_OP (-, mx_inline_sub)
-MARRAY_A2S_OP (*, mx_inline_mul)
-MARRAY_A2S_OP (/, mx_inline_div)
-
-// Element by element scalar by MArray2 ops.
-
-#define MARRAY_SA2_OP(OP, FN) \
-  template <class T> \
-  MArray2<T> \
-  operator OP (const T& s, const MArray2<T>& a) \
-  { \
-    return do_sm_binary_op<MArray2<T>, T, MArray2<T> > (s, a, FN); \
-  }
-
-MARRAY_SA2_OP (+, mx_inline_add)
-MARRAY_SA2_OP (-, mx_inline_sub)
-MARRAY_SA2_OP (*, mx_inline_mul)
-MARRAY_SA2_OP (/, mx_inline_div)
-
-// Element by element MArray2 by MArray2 ops.
-
-#define MARRAY_A2A2_OP(FCN, OP, FN) \
-  template <class T> \
-  MArray2<T> \
-  FCN (const MArray2<T>& a, const MArray2<T>& b) \
-  { \
-    return do_mm_binary_op<MArray2<T>, MArray2<T>, MArray2<T> > (a, b, FN, #FCN); \
-  }
-
-MARRAY_A2A2_OP (operator +, +, mx_inline_add)
-MARRAY_A2A2_OP (operator -, -, mx_inline_sub)
-MARRAY_A2A2_OP (product,    *, mx_inline_mul)
-MARRAY_A2A2_OP (quotient,   /, mx_inline_div)
-
-// Unary MArray2 ops.
-
-template <class T>
-MArray2<T>
-operator + (const MArray2<T>& a)
-{
-  return a;
-}
-
-template <class T>
-MArray2<T>
-operator - (const MArray2<T>& a)
-{
-  return do_mx_unary_op<MArray2<T>, MArray2<T> > (a, mx_inline_uminus); 
-}
--- a/liboctave/MArray2.h
+++ b/liboctave/MArray2.h
@@ -25,83 +25,14 @@
 #if !defined (octave_MArray2_h)
 #define octave_MArray2_h 1
 
-#include "Array2.h"
-
-// Two dimensional array with math ops.
-
-// But first, some preprocessor abuse...
-
-#include "MArray-decl.h"
-
-MARRAY_OPS_FORWARD_DECLS (MArray2, )
-
-template <class T>
-class
-MArray2 : public Array2<T>
-{
-protected:
-
-  MArray2 (T *d, octave_idx_type n, octave_idx_type m) : Array2<T> (d, n, m) { }
-
-public:
-
-  MArray2 (void) : Array2<T> () { }
-
-  MArray2 (octave_idx_type n, octave_idx_type m) : Array2<T> (n, m) { }
-
-  MArray2 (octave_idx_type n, octave_idx_type m, const T& val) : Array2<T> (n, m, val) { }
-
-  MArray2 (const dim_vector& dv) : Array2<T> (dv) { }
-
-  MArray2 (const dim_vector& dv, const T& val) : Array2<T> (dv, val) { }
-
-  MArray2 (const MArray2<T>& a) : Array2<T> (a) { }
-
-  MArray2 (const Array2<T>& a) : Array2<T> (a) { }
-
-  template <class U>
-  MArray2 (const Array2<U>& a) : Array2<T> (a) { }
+#include "MArray.h"
+#define MArray2 MArray
 
-  template <class U>
-  MArray2 (const MArray2<U>& a) : Array2<T> (a) { }
-
-  ~MArray2 (void) { }
-
-  MArray2<T>& operator = (const MArray2<T>& a)
-    {
-      Array2<T>::operator = (a);
-      return *this;
-    }
-
-  MArray2<T>& insert (const Array2<T>& a, octave_idx_type r, octave_idx_type c)
-  {
-    Array2<T>::insert (a, r, c);
-    return *this;
-  }
-
-  MArray2<T> transpose (void) const { return Array2<T>::transpose (); }
-  MArray2<T> hermitian (T (*fcn) (const T&) = 0) const { return Array2<T>::hermitian (fcn); }
+// If we're with GNU C++, issue a warning.
+#ifdef __GNUC__
+#warning Using MArray2<T> is deprecated. Use MArray<T>.
+#endif
 
-  MArray2<T> diag (octave_idx_type k) const
-  {
-    return Array2<T>::diag (k);
-  }
 
-  // FIXME: should go away.
-  template <class U>
-  MArray2<U>
-  map (U (&fcn) (T)) const
-  { return Array2<T>::template map<U> (fcn); }
-
-  template <class U>
-  MArray2<U>
-  map (U (&fcn) (const T&)) const
-  { return Array2<T>::template map<U> (fcn); }
-
-  // Currently, the OPS functions don't need to be friends, but that
-  // may change.
-
-  // MARRAY_OPS_FRIEND_DECLS (MArray2)
-};
 
 #endif
deleted file mode 100644
--- a/liboctave/MArrayN.cc
+++ /dev/null
@@ -1,297 +0,0 @@
-/*
-
-Copyright (C) 1996, 1997, 2003, 2004, 2005, 2007, 2009 John W. Eaton
-
-This file is part of Octave.
-
-Octave is free software; you can redistribute it and/or modify it
-under the terms of the GNU General Public License as published by the
-Free Software Foundation; either version 3 of the License, or (at your
-option) any later version.
-
-Octave is distributed in the hope that it will be useful, but WITHOUT
-ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
-FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
-for more details.
-
-You should have received a copy of the GNU General Public License
-along with Octave; see the file COPYING.  If not, see
-<http://www.gnu.org/licenses/>.
-
-*/
-
-#ifdef HAVE_CONFIG_H
-#include <config.h>
-#endif
-
-#include "MArrayN.h"
-#include "Array-util.h"
-#include "lo-error.h"
-
-#include "MArray-defs.h"
-#include "mx-inlines.cc"
-
-template <class T>
-struct _idxadds_helper
-{
-  T *array;
-  T val;
-  _idxadds_helper (T *a, T v) : array (a), val (v) { }
-  void operator () (octave_idx_type i)
-    { array[i] += val; }
-};
-
-template <class T>
-struct _idxadda_helper
-{
-  T *array;
-  const T *vals;
-  _idxadda_helper (T *a, const T *v) : array (a), vals (v) { }
-  void operator () (octave_idx_type i)
-    { array[i] += *vals++; }
-};
-
-template <class T>
-void
-MArrayN<T>::idx_add (const idx_vector& idx, T val)
-{
-  octave_idx_type n = this->length ();
-  octave_idx_type ext = idx.extent (n);
-  if (ext > n)
-    {
-      this->resize (ext);
-      n = ext;
-    }
-
-  octave_quit ();
-
-  octave_idx_type len = idx.length (n);
-  idx.loop (len, _idxadds_helper<T> (this->fortran_vec (), val));
-}
-
-template <class T>
-void
-MArrayN<T>::idx_add (const idx_vector& idx, const MArrayN<T>& vals)
-{
-  octave_idx_type n = this->length ();
-  octave_idx_type ext = idx.extent (n);
-  if (ext > n)
-    {
-      this->resize (ext);
-      n = ext;
-    }
-
-  octave_quit ();
-
-  octave_idx_type len = std::min (idx.length (n), vals.length ());
-  idx.loop (len, _idxadda_helper<T> (this->fortran_vec (), vals.data ()));
-}
-
-template <class T, T op (typename ref_param<T>::type, typename ref_param<T>::type)>
-struct _idxbinop_helper
-{
-  T *array;
-  const T *vals;
-  _idxbinop_helper (T *a, const T *v) : array (a), vals (v) { }
-  void operator () (octave_idx_type i)
-    { array[i] = op (array[i], *vals++); }
-};
-
-template <class T>
-void
-MArrayN<T>::idx_min (const idx_vector& idx, const MArrayN<T>& vals)
-{
-  octave_idx_type n = this->length ();
-  octave_idx_type ext = idx.extent (n);
-  if (ext > n)
-    {
-      this->resize (ext);
-      n = ext;
-    }
-
-  octave_quit ();
-
-  octave_idx_type len = std::min (idx.length (n), vals.length ());
-  idx.loop (len, _idxbinop_helper<T, xmin> (this->fortran_vec (), vals.data ()));
-}
-
-template <class T>
-void
-MArrayN<T>::idx_max (const idx_vector& idx, const MArrayN<T>& vals)
-{
-  octave_idx_type n = this->length ();
-  octave_idx_type ext = idx.extent (n);
-  if (ext > n)
-    {
-      this->resize (ext);
-      n = ext;
-    }
-
-  octave_quit ();
-
-  octave_idx_type len = std::min (idx.length (n), vals.length ());
-  idx.loop (len, _idxbinop_helper<T, xmax> (this->fortran_vec (), vals.data ()));
-}
-
-// N-dimensional array with math ops.
-template <class T>
-void
-MArrayN<T>::changesign (void)
-{
-  if (Array<T>::is_shared ())
-    *this = - *this;
-  else
-    do_mx_inplace_op<MArrayN<T> > (*this, mx_inline_uminus2);
-}
-
-// Element by element MArrayN by scalar ops.
-
-template <class T>
-MArrayN<T>&
-operator += (MArrayN<T>& a, const T& s)
-{
-  if (a.is_shared ())
-    a = a + s;
-  else
-    do_ms_inplace_op<MArrayN<T>, T> (a, s, mx_inline_add2);
-  return a;
-}
-
-template <class T>
-MArrayN<T>&
-operator -= (MArrayN<T>& a, const T& s)
-{
-  if (a.is_shared ())
-    a = a - s;
-  else
-    do_ms_inplace_op<MArrayN<T>, T> (a, s, mx_inline_sub2);
-  return a;
-}
-
-template <class T>
-MArrayN<T>&
-operator *= (MArrayN<T>& a, const T& s)
-{
-  if (a.is_shared ())
-    a = a * s;
-  else
-    do_ms_inplace_op<MArrayN<T>, T> (a, s, mx_inline_mul2);
-  return a;
-}
-
-template <class T>
-MArrayN<T>&
-operator /= (MArrayN<T>& a, const T& s)
-{
-  if (a.is_shared ())
-    a = a / s;
-  else
-    do_ms_inplace_op<MArrayN<T>, T> (a, s, mx_inline_div2);
-  return a;
-}
-
-// Element by element MArrayN by MArrayN ops.
-
-template <class T>
-MArrayN<T>&
-operator += (MArrayN<T>& a, const MArrayN<T>& b)
-{
-  if (a.is_shared ())
-    a = a + b;
-  else
-    do_mm_inplace_op<MArrayN<T>, MArrayN<T> > (a, b, mx_inline_add2, "+=");
-  return a;
-}
-
-template <class T>
-MArrayN<T>&
-operator -= (MArrayN<T>& a, const MArrayN<T>& b)
-{
-  if (a.is_shared ())
-    a = a - b;
-  else
-    do_mm_inplace_op<MArrayN<T>, MArrayN<T> > (a, b, mx_inline_sub2, "-=");
-  return a;
-}
-
-
-template <class T>
-MArrayN<T>&
-product_eq (MArrayN<T>& a, const MArrayN<T>& b)
-{
-  if (a.is_shared ())
-    return a = product (a, b);
-  else
-    do_mm_inplace_op<MArrayN<T>, MArrayN<T> > (a, b, mx_inline_mul2, ".*=");
-  return a;
-}
-
-template <class T>
-MArrayN<T>&
-quotient_eq (MArrayN<T>& a, const MArrayN<T>& b)
-{
-  if (a.is_shared ())
-    return a = quotient (a, b);
-  else
-    do_mm_inplace_op<MArrayN<T>, MArrayN<T> > (a, b, mx_inline_div2, "./=");
-  return a;
-}
-
-// Element by element MArrayN by scalar ops.
-
-#define MARRAY_NDS_OP(OP, FN) \
-  template <class T> \
-  MArrayN<T> \
-  operator OP (const MArrayN<T>& a, const T& s) \
-  { \
-    return do_ms_binary_op<MArrayN<T>, MArrayN<T>, T> (a, s, FN); \
-  }
-
-MARRAY_NDS_OP (+, mx_inline_add)
-MARRAY_NDS_OP (-, mx_inline_sub)
-MARRAY_NDS_OP (*, mx_inline_mul)
-MARRAY_NDS_OP (/, mx_inline_div)
-
-// Element by element scalar by MArrayN ops.
-
-#define MARRAY_SND_OP(OP, FN) \
-  template <class T> \
-  MArrayN<T> \
-  operator OP (const T& s, const MArrayN<T>& a) \
-  { \
-    return do_sm_binary_op<MArrayN<T>, T, MArrayN<T> > (s, a, FN); \
-  }
-
-MARRAY_SND_OP (+, mx_inline_add)
-MARRAY_SND_OP (-, mx_inline_sub)
-MARRAY_SND_OP (*, mx_inline_mul)
-MARRAY_SND_OP (/, mx_inline_div)
-
-// Element by element MArrayN by MArrayN ops.
-
-#define MARRAY_NDND_OP(FCN, OP, FN) \
-  template <class T> \
-  MArrayN<T> \
-  FCN (const MArrayN<T>& a, const MArrayN<T>& b) \
-  { \
-    return do_mm_binary_op<MArrayN<T>, MArrayN<T>, MArrayN<T> > (a, b, FN, #FCN); \
-  }
-
-MARRAY_NDND_OP (operator +, +, mx_inline_add)
-MARRAY_NDND_OP (operator -, -, mx_inline_sub)
-MARRAY_NDND_OP (product,    *, mx_inline_mul)
-MARRAY_NDND_OP (quotient,   /, mx_inline_div)
-
-template <class T>
-MArrayN<T>
-operator + (const MArrayN<T>& a)
-{
-  return a;
-}
-
-template <class T>
-MArrayN<T>
-operator - (const MArrayN<T>& a)
-{
-  return do_mx_unary_op<MArrayN<T>, MArrayN<T> > (a, mx_inline_uminus); 
-}
--- a/liboctave/MArrayN.h
+++ b/liboctave/MArrayN.h
@@ -25,79 +25,12 @@
 #if !defined (octave_MArrayN_h)
 #define octave_MArrayN_h 1
 
-#include "Array.h"
-#include "MArray2.h"
-#include "dim-vector.h"
-
-// N-dimensional array with math ops.
-
-// But first, some preprocessor abuse...
-
-#include "MArray-decl.h"
-
-MARRAY_OPS_FORWARD_DECLS (MArrayN, )
-
-template <class T>
-class
-MArrayN : public Array<T>
-{
-protected:
-
-  MArrayN (T *d, const dim_vector& dv) : Array<T> (d, dv) { }
-
-public:
-  
-  MArrayN (void) : Array<T> () {}
-  
-  MArrayN (const dim_vector& dv) : Array<T> (dv) { }
-  
-  MArrayN (const dim_vector& dv, const T& val) : Array<T> (dv, val) { }
-
-  template <class U>
-  explicit MArrayN (const Array2<U>& a) : Array<T> (a) { }
-
-  template <class U>
-  MArrayN (const Array<U>& a) : Array<T> (a) { }
-
-  template <class U>
-  MArrayN (const MArrayN<U>& a) : Array<T> (a) { }
+#include "MArray.h"
+#define MArrayN MArray
 
-  ~MArrayN (void) { }
-
-  MArrayN<T>& operator = (const MArrayN<T>& a)
-    {
-      Array<T>::operator = (a);
-      return *this;
-    }
-
-  MArrayN<T> reshape (const dim_vector& new_dims) const
-    { return Array<T>::reshape (new_dims); }
-
-  MArrayN<T> permute (const Array<octave_idx_type>& vec, 
-                      bool inv = false) const
-    { return Array<T>::permute (vec, inv); }
-
-  MArrayN<T> ipermute (const Array<octave_idx_type>& vec) const
-    { return Array<T>::ipermute (vec); }
-
-  MArrayN squeeze (void) const { return Array<T>::squeeze (); }
-
-  MArrayN<T> diag (octave_idx_type k) const
-  {
-    return Array<T>::diag (k);
-  }
-
-  // Performs indexed accumulative addition.
-
-  void idx_add (const idx_vector& idx, T val);
-
-  void idx_add (const idx_vector& idx, const MArrayN<T>& vals);
-
-  void idx_min (const idx_vector& idx, const MArrayN<T>& vals);
-
-  void idx_max (const idx_vector& idx, const MArrayN<T>& vals);
-
-  void changesign (void);
-};
+// If we're with GNU C++, issue a warning.
+#ifdef __GNUC__
+#warning Using MArrayN<T> is deprecated. Use MArray<T>.
+#endif
 
 #endif
--- a/liboctave/MDiagArray2.h
+++ b/liboctave/MDiagArray2.h
@@ -26,7 +26,6 @@
 #define octave_MDiagArray2_h 1
 
 #include "DiagArray2.h"
-#include "MArray2.h"
 #include "MArray.h"
 
 // Two dimensional diagonal array with math ops.
@@ -72,7 +71,7 @@
       return *this;
     }
 
-  operator MArray2<T> () const
+  operator MArray<T> () const
     {
       return DiagArray2<T>::operator Array2<T> ();
     }
--- a/liboctave/MSparse-defs.h
+++ b/liboctave/MSparse-defs.h
@@ -184,7 +184,7 @@
   /* SPARSE_OP_ASSIGN_DEFS (MSparse, T, T) */ \
   SPARSE_OP_ASSIGN_DEFS (MSparse, T, MSparse<T>, API) \
   SPARSE_UNOP_DEFS (MSparse, T, API) \
-  SPARSE_BINOP_DEFS (MSparse, MArray2, T, API)
+  SPARSE_BINOP_DEFS (MSparse, MArray, T, API)
 
 // Define all the MSparse forwarding functions for return type R and
 // MSparse element type T
--- a/liboctave/MSparse.cc
+++ b/liboctave/MSparse.cc
@@ -27,7 +27,7 @@
 
 #include "quit.h"
 #include "lo-error.h"
-#include "MArray2.h"
+#include "MArray.h"
 #include "Array-util.h"
 
 #include "MSparse.h"
@@ -187,13 +187,13 @@
 
 #define SPARSE_A2S_OP_1(OP) \
   template <class T> \
-  MArray2<T> \
+  MArray<T> \
   operator OP (const MSparse<T>& a, const T& s) \
   { \
     octave_idx_type nr = a.rows (); \
     octave_idx_type nc = a.cols (); \
  \
-    MArray2<T> r (nr, nc, (0.0 OP s));  \
+    MArray<T> r (nr, nc, (0.0 OP s));  \
  \
     for (octave_idx_type j = 0; j < nc; j++) \
       for (octave_idx_type i = a.cidx(j); i < a.cidx(j+1); i++) \
@@ -233,13 +233,13 @@
 
 #define SPARSE_SA2_OP_1(OP) \
   template <class T> \
-  MArray2<T> \
+  MArray<T> \
   operator OP (const T& s, const MSparse<T>& a) \
   { \
     octave_idx_type nr = a.rows (); \
     octave_idx_type nc = a.cols (); \
  \
-    MArray2<T> r (nr, nc, (s OP 0.0));  \
+    MArray<T> r (nr, nc, (s OP 0.0));  \
  \
     for (octave_idx_type j = 0; j < nc; j++) \
       for (octave_idx_type i = a.cidx(j); i < a.cidx(j+1); i++) \
--- a/liboctave/MSparse.h
+++ b/liboctave/MSparse.h
@@ -24,7 +24,7 @@
 #if !defined (octave_MSparse_h)
 #define octave_MSparse_h 1
 
-#include "MArray2.h"
+#include "MArray.h"
 
 #include "Sparse.h"
 
@@ -34,7 +34,7 @@
 
 #include "MSparse-defs.h"
 
-SPARSE_OPS_FORWARD_DECLS (MSparse, MArray2, )
+SPARSE_OPS_FORWARD_DECLS (MSparse, MArray, )
 
 template <class T>
 class
@@ -131,7 +131,7 @@
   // Currently, the OPS functions don't need to be friends, but that
   // may change.
 
-  // SPARSE_OPS_FRIEND_DECLS (MSparse, MArray2)
+  // SPARSE_OPS_FRIEND_DECLS (MSparse, MArray)
 };
 
 #endif
--- a/liboctave/Makefile.am
+++ b/liboctave/Makefile.am
@@ -271,8 +271,6 @@
   Array.cc \
   DiagArray2.cc \
   MArray.cc \
-  MArray2.cc \
-  MArrayN.cc \
   MDiagArray2.cc \
   base-lu.cc \
   base-qr.cc \
--- a/liboctave/MatrixType.cc
+++ b/liboctave/MatrixType.cc
@@ -58,7 +58,7 @@
 
 template<class T> 
 MatrixType::matrix_type 
-matrix_real_probe (const MArray2<T>& a)
+matrix_real_probe (const MArray<T>& a)
 {
   MatrixType::matrix_type typ;
   octave_idx_type nrows = a.rows ();
@@ -115,7 +115,7 @@
 
 template<class T> 
 MatrixType::matrix_type 
-matrix_complex_probe (const MArray2<T>& a)
+matrix_complex_probe (const MArray<T>& a)
 {
   MatrixType::matrix_type typ;
   octave_idx_type nrows = a.rows ();
--- a/liboctave/PermMatrix.cc
+++ b/liboctave/PermMatrix.cc
@@ -57,14 +57,14 @@
     gripe_invalid_permutation ();
   else
     {
-      Array<octave_idx_type> idxa (len);
+      Array<octave_idx_type> idxa (len, 1);
       for (octave_idx_type i = 0; i < len; i++) idxa(i) = idx(i);
       Array<octave_idx_type>::operator = (idxa);
     }
 }
 
 PermMatrix::PermMatrix (octave_idx_type n)
-  : Array<octave_idx_type> (n), _colp (false)
+  : Array<octave_idx_type> (n, 1), _colp (false)
 {
   for (octave_idx_type i = 0; i < n; i++) xelem (i) = i;
 }
@@ -145,7 +145,7 @@
     return PermMatrix (n);
 
   const octave_idx_type *p = data ();
-  Array<octave_idx_type> res_pvec (n, -1);
+  Array<octave_idx_type> res_pvec (n, 1, -1);
   octave_idx_type *q = res_pvec.fortran_vec ();
 
   for (octave_idx_type ics = 0; ics < n; ics++)
@@ -181,7 +181,7 @@
 PermMatrix
 PermMatrix::eye (octave_idx_type n)
 {
-  Array<octave_idx_type> p(n);
+  Array<octave_idx_type> p(n, 1);
   for (octave_idx_type i = 0; i < n; i++)
     p(i) = i;
 
@@ -204,7 +204,7 @@
     }
   else
     {
-      Array<octave_idx_type> ra (n);
+      Array<octave_idx_type> ra (n, 1);
       if (a._colp)
         ra.assign (idx_vector (ib), ia);
       else
--- a/liboctave/Quad.cc
+++ b/liboctave/Quad.cc
@@ -126,11 +126,11 @@
   double result = 0.0;
 
   octave_idx_type leniw = 183*npts - 122;
-  Array<octave_idx_type> iwork (leniw);
+  Array<octave_idx_type> iwork (leniw, 1);
   octave_idx_type *piwork = iwork.fortran_vec ();
 
   octave_idx_type lenw = 2*leniw - npts;
-  Array<double> work (lenw);
+  Array<double> work (lenw, 1);
   double *pwork = work.fortran_vec ();
 
   user_fcn = f;
@@ -160,11 +160,11 @@
   double result = 0.0;
 
   octave_idx_type leniw = 128;
-  Array<octave_idx_type> iwork (leniw);
+  Array<octave_idx_type> iwork (leniw, 1);
   octave_idx_type *piwork = iwork.fortran_vec ();
 
   octave_idx_type lenw = 8*leniw;
-  Array<double> work (lenw);
+  Array<double> work (lenw, 1);
   double *pwork = work.fortran_vec ();
 
   user_fcn = f;
@@ -222,11 +222,11 @@
   float result = 0.0;
 
   octave_idx_type leniw = 183*npts - 122;
-  Array<octave_idx_type> iwork (leniw);
+  Array<octave_idx_type> iwork (leniw, 1);
   octave_idx_type *piwork = iwork.fortran_vec ();
 
   octave_idx_type lenw = 2*leniw - npts;
-  Array<float> work (lenw);
+  Array<float> work (lenw, 1);
   float *pwork = work.fortran_vec ();
 
   float_user_fcn = ff;
@@ -256,11 +256,11 @@
   float result = 0.0;
 
   octave_idx_type leniw = 128;
-  Array<octave_idx_type> iwork (leniw);
+  Array<octave_idx_type> iwork (leniw, 1);
   octave_idx_type *piwork = iwork.fortran_vec ();
 
   octave_idx_type lenw = 8*leniw;
-  Array<float> work (lenw);
+  Array<float> work (lenw, 1);
   float *pwork = work.fortran_vec ();
 
   float_user_fcn = ff;
--- a/liboctave/SparseCmplxLU.cc
+++ b/liboctave/SparseCmplxLU.cc
@@ -190,10 +190,10 @@
               Rfact.xcidx (nr) = nr;
               double *Rx = Rfact.data ();
 
-              P.resize (nr);
+              P.resize (nr, 1);
               octave_idx_type *p = P.fortran_vec ();
 
-              Q.resize (nc);
+              Q.resize (nc, 1);
               octave_idx_type *q = Q.fortran_vec ();
 
               octave_idx_type do_recip;
@@ -417,10 +417,10 @@
                   Rfact.xcidx (nr) = nr;
                   double *Rx = Rfact.data ();
 
-                  P.resize (nr);
+                  P.resize (nr, 1);
                   octave_idx_type *p = P.fortran_vec ();
 
-                  Q.resize (nc);
+                  Q.resize (nc, 1);
                   octave_idx_type *q = Q.fortran_vec ();
 
                   octave_idx_type do_recip;
--- a/liboctave/SparseCmplxQR.cc
+++ b/liboctave/SparseCmplxQR.cc
@@ -882,14 +882,14 @@
 }
 
 ComplexMatrix 
-qrsolve (const SparseComplexMatrix &a, const MArray2<double> &b, 
+qrsolve (const SparseComplexMatrix &a, const MArray<double> &b, 
          octave_idx_type &info)
 {
   return qrsolve (a, Matrix (b), info);
 }
 
 ComplexMatrix 
-qrsolve (const SparseComplexMatrix &a, const MArray2<Complex> &b, 
+qrsolve (const SparseComplexMatrix &a, const MArray<Complex> &b, 
          octave_idx_type &info)
 {
   return qrsolve (a, ComplexMatrix (b), info);
--- a/liboctave/SparseCmplxQR.h
+++ b/liboctave/SparseCmplxQR.h
@@ -150,7 +150,7 @@
                               octave_idx_type &info);
 
 extern ComplexMatrix qrsolve (const SparseComplexMatrix &a, 
-                              const MArray2<double> &b, 
+                              const MArray<double> &b, 
                               octave_idx_type &info);
 
 extern SparseComplexMatrix qrsolve (const SparseComplexMatrix &a, 
@@ -162,7 +162,7 @@
                               octave_idx_type &info);
 
 extern ComplexMatrix qrsolve (const SparseComplexMatrix &a, 
-                              const MArray2<Complex> &b, 
+                              const MArray<Complex> &b, 
                               octave_idx_type &info);
 
 extern SparseComplexMatrix qrsolve (const SparseComplexMatrix &a, 
--- a/liboctave/SparseQR.cc
+++ b/liboctave/SparseQR.cc
@@ -898,14 +898,14 @@
 }
 
 Matrix 
-qrsolve(const SparseMatrix &a, const MArray2<double> &b, 
+qrsolve(const SparseMatrix &a, const MArray<double> &b, 
         octave_idx_type &info)
 { 
   return qrsolve (a, Matrix (b), info); 
 }
 
 ComplexMatrix 
-qrsolve(const SparseMatrix &a, const MArray2<Complex> &b, 
+qrsolve(const SparseMatrix &a, const MArray<Complex> &b, 
         octave_idx_type &info)
 { 
   return qrsolve (a, ComplexMatrix (b), info);
--- a/liboctave/SparseQR.h
+++ b/liboctave/SparseQR.h
@@ -145,7 +145,7 @@
 extern Matrix qrsolve (const SparseMatrix &a, const Matrix &b, 
                        octave_idx_type &info);
 
-extern Matrix qrsolve (const SparseMatrix &a, const MArray2<double> &b, 
+extern Matrix qrsolve (const SparseMatrix &a, const MArray<double> &b, 
                        octave_idx_type &info);
 
 extern SparseMatrix qrsolve (const SparseMatrix &a, const SparseMatrix &b,
@@ -154,7 +154,7 @@
 extern ComplexMatrix qrsolve (const SparseMatrix &a, const ComplexMatrix &b,
                               octave_idx_type &info);
 
-extern ComplexMatrix qrsolve (const SparseMatrix &a, const MArray2<Complex> &b, 
+extern ComplexMatrix qrsolve (const SparseMatrix &a, const MArray<Complex> &b, 
                               octave_idx_type &info);
 
 extern SparseComplexMatrix qrsolve (const SparseMatrix &a, 
--- a/liboctave/SparsedbleLU.cc
+++ b/liboctave/SparsedbleLU.cc
@@ -183,10 +183,10 @@
               Rfact.xcidx (nr) = nr;
               double *Rx = Rfact.data ();
 
-              P.resize (nr);
+              P.resize (nr, 1);
               octave_idx_type *p = P.fortran_vec ();
 
-              Q.resize (nc);
+              Q.resize (nc, 1);
               octave_idx_type *q = Q.fortran_vec ();
 
               octave_idx_type do_recip;
@@ -399,10 +399,10 @@
                   Rfact.xcidx (nr) = nr;
                   double *Rx = Rfact.data ();
 
-                  P.resize (nr);
+                  P.resize (nr, 1);
                   octave_idx_type *p = P.fortran_vec ();
 
-                  Q.resize (nc);
+                  Q.resize (nc, 1);
                   octave_idx_type *q = Q.fortran_vec ();
 
                   octave_idx_type do_recip;
--- a/liboctave/base-lu.cc
+++ b/liboctave/base-lu.cc
@@ -122,7 +122,7 @@
     {
       octave_idx_type a_nr = a_fact.rows ();
 
-      Array<octave_idx_type> pvt (a_nr);
+      Array<octave_idx_type> pvt (a_nr, 1);
 
       for (octave_idx_type i = 0; i < a_nr; i++)
         pvt.xelem (i) = i;
--- a/liboctave/dColVector.h
+++ b/liboctave/dColVector.h
@@ -34,17 +34,19 @@
 {
 public:
 
-  ColumnVector (void) : MArray<double> () { }
+  ColumnVector (void) : MArray<double> (0, 1) { }
 
-  explicit ColumnVector (octave_idx_type n) : MArray<double> (n) { }
+  explicit ColumnVector (octave_idx_type n) : MArray<double> (n, 1) { }
 
-  explicit ColumnVector (const dim_vector& dv) : MArray<double> (dv) { }
+  explicit ColumnVector (const dim_vector& dv) 
+    : MArray<double> (dv.as_column ()) { }
 
-  ColumnVector (octave_idx_type n, double val) : MArray<double> (n, val) { }
+  ColumnVector (octave_idx_type n, double val) : MArray<double> (n, 1, val) { }
 
   ColumnVector (const ColumnVector& a) : MArray<double> (a) { }
 
-  ColumnVector (const MArray<double>& a) : MArray<double> (a) { }
+  ColumnVector (const MArray<double>& a) : MArray<double> (a.as_column ()) { }
+  ColumnVector (const Array<double>& a) : MArray<double> (a.as_column ()) { }
 
   ColumnVector& operator = (const ColumnVector& a)
     {
@@ -93,9 +95,15 @@
   friend OCTAVE_API std::ostream& operator << (std::ostream& os, const ColumnVector& a);
   friend OCTAVE_API std::istream& operator >> (std::istream& is, ColumnVector& a);
 
+  void resize (octave_idx_type n, const double& rfv = Array<double>::resize_fill_value ())
+    { Array<double>::resize (n, 1, rfv); }
+
+  void clear (octave_idx_type n)
+    { Array<double>::clear (n, 1); }
+
 private:
 
-  ColumnVector (double *d, octave_idx_type l) : MArray<double> (d, l) { }
+  ColumnVector (double *d, octave_idx_type l) : MArray<double> (d, l, 1) { }
 };
 
 // Publish externally used friend functions.
--- a/liboctave/dMatrix.cc
+++ b/liboctave/dMatrix.cc
@@ -214,24 +214,24 @@
 // Matrix class.
 
 Matrix::Matrix (const RowVector& rv)
-  : MArray2<double> (Array2<double> (rv, 1, rv.length ()))
+  : MArray<double> (rv)
 {
 }
 
 Matrix::Matrix (const ColumnVector& cv)
-  : MArray2<double> (Array2<double> (cv, cv.length (), 1))
+  : MArray<double> (cv)
 {
 }
 
 Matrix::Matrix (const DiagMatrix& a)
-  : MArray2<double> (a.rows (), a.cols (), 0.0)
+  : MArray<double> (a.rows (), a.cols (), 0.0)
 {
   for (octave_idx_type i = 0; i < a.length (); i++)
     elem (i, i) = a.elem (i, i);
 }
 
 Matrix::Matrix (const PermMatrix& a)
-  : MArray2<double> (a.rows (), a.cols (), 0.0)
+  : MArray<double> (a.rows (), a.cols (), 0.0)
 {
   const Array<octave_idx_type> ia (a.pvec ());
   octave_idx_type len = a.rows ();
@@ -247,15 +247,12 @@
 // here?
 
 Matrix::Matrix (const boolMatrix& a)
-  : MArray2<double> (a.rows (), a.cols ())
+  : MArray<double> (a)
 {
-  for (octave_idx_type i = 0; i < a.rows (); i++)
-    for (octave_idx_type j = 0; j < a.cols (); j++)
-      elem (i, j) = a.elem (i, j);
 }
 
 Matrix::Matrix (const charMatrix& a)
-  : MArray2<double> (a.rows (), a.cols ())
+  : MArray<double> (a.rows (), a.cols ())
 {
   for (octave_idx_type i = 0; i < a.rows (); i++)
     for (octave_idx_type j = 0; j < a.cols (); j++)
@@ -296,7 +293,7 @@
 Matrix&
 Matrix::insert (const Matrix& a, octave_idx_type r, octave_idx_type c)
 {
-  Array2<double>::insert (a, r, c);
+  Array<double>::insert (a, r, c);
   return *this;
 }
 
@@ -614,13 +611,13 @@
 RowVector
 Matrix::row (octave_idx_type i) const
 {
-  return MArray<double> (index (idx_vector (i), idx_vector::colon));
+  return index (idx_vector (i), idx_vector::colon);
 }
 
 ColumnVector
 Matrix::column (octave_idx_type i) const
 {
-  return MArray<double> (index (idx_vector::colon, idx_vector (i)));
+  return index (idx_vector::colon, idx_vector (i));
 }
 
 Matrix
@@ -734,13 +731,13 @@
     (*current_liboctave_error_handler) ("inverse requires square matrix");
   else
     {
-      Array<octave_idx_type> ipvt (nr);
+      Array<octave_idx_type> ipvt (nr, 1);
       octave_idx_type *pipvt = ipvt.fortran_vec ();
 
       retval = *this;
       double *tmp_data = retval.fortran_vec ();
 
-      Array<double> z(1);
+      Array<double> z(1, 1);
       octave_idx_type lwork = -1;
 
       // Query the optimum work array size.
@@ -749,7 +746,7 @@
 
       lwork = static_cast<octave_idx_type> (z(0));
       lwork = (lwork < 2 *nc ? 2*nc : lwork);
-      z.resize (lwork);
+      z.resize (lwork, 1);
       double *pz = z.fortran_vec ();
 
       info = 0;
@@ -771,7 +768,7 @@
 
           // Now calculate the condition number for non-singular matrix.
           char job = '1';
-          Array<octave_idx_type> iz (nc);
+          Array<octave_idx_type> iz (nc, 1);
           octave_idx_type *piz = iz.fortran_vec ();
           F77_XFCN (dgecon, DGECON, (F77_CONST_CHAR_ARG2 (&job, 1),
                                      nc, tmp_data, nr, anorm, 
@@ -1006,7 +1003,7 @@
 
   octave_idx_type nn = 4*npts+15;
 
-  Array<Complex> wsave (nn);
+  Array<Complex> wsave (nn, 1);
   Complex *pwsave = wsave.fortran_vec ();
 
   retval = ComplexMatrix (*this);
@@ -1047,7 +1044,7 @@
 
   octave_idx_type nn = 4*npts+15;
 
-  Array<Complex> wsave (nn);
+  Array<Complex> wsave (nn, 1);
   Complex *pwsave = wsave.fortran_vec ();
 
   retval = ComplexMatrix (*this);
@@ -1091,7 +1088,7 @@
 
   octave_idx_type nn = 4*npts+15;
 
-  Array<Complex> wsave (nn);
+  Array<Complex> wsave (nn, 1);
   Complex *pwsave = wsave.fortran_vec ();
 
   retval = ComplexMatrix (*this);
@@ -1110,10 +1107,10 @@
   nsamples = nr;
   nn = 4*npts+15;
 
-  wsave.resize (nn);
+  wsave.resize (nn, 1);
   pwsave = wsave.fortran_vec ();
 
-  Array<Complex> tmp (npts);
+  Array<Complex> tmp (npts, 1);
   Complex *prow = tmp.fortran_vec ();
 
   F77_FUNC (zffti, ZFFTI) (npts, pwsave);
@@ -1157,7 +1154,7 @@
 
   octave_idx_type nn = 4*npts+15;
 
-  Array<Complex> wsave (nn);
+  Array<Complex> wsave (nn, 1);
   Complex *pwsave = wsave.fortran_vec ();
 
   retval = ComplexMatrix (*this);
@@ -1179,10 +1176,10 @@
   nsamples = nr;
   nn = 4*npts+15;
 
-  wsave.resize (nn);
+  wsave.resize (nn, 1);
   pwsave = wsave.fortran_vec ();
 
-  Array<Complex> tmp (npts);
+  Array<Complex> tmp (npts, 1);
   Complex *prow = tmp.fortran_vec ();
 
   F77_FUNC (zffti, ZFFTI) (npts, pwsave);
@@ -1279,9 +1276,9 @@
             }
           else 
             {
-              Array<double> z (3 * nc);
+              Array<double> z (3 * nc, 1);
               double *pz = z.fortran_vec ();
-              Array<octave_idx_type> iz (nc);
+              Array<octave_idx_type> iz (nc, 1);
               octave_idx_type *piz = iz.fortran_vec ();
 
               F77_XFCN (dpocon, DPOCON, (F77_CONST_CHAR_ARG2 (&job, 1),
@@ -1303,7 +1300,7 @@
 
       if (typ == MatrixType::Full)
         {
-          Array<octave_idx_type> ipvt (nr);
+          Array<octave_idx_type> ipvt (nr, 1);
           octave_idx_type *pipvt = ipvt.fortran_vec ();
 
           Matrix atmp = *this;
@@ -1330,9 +1327,9 @@
                 {
                   // Now calc the condition number for non-singular matrix.
                   char job = '1';
-                  Array<double> z (4 * nc);
+                  Array<double> z (4 * nc, 1);
                   double *pz = z.fortran_vec ();
-                  Array<octave_idx_type> iz (nc);
+                  Array<octave_idx_type> iz (nc, 1);
                   octave_idx_type *piz = iz.fortran_vec ();
 
                   F77_XFCN (dgecon, DGECON, (F77_CONST_CHAR_ARG2 (&job, 1),
@@ -1395,9 +1392,9 @@
           char uplo = 'U';
           char dia = 'N';
 
-          Array<double> z (3 * nc);
+          Array<double> z (3 * nc, 1);
           double *pz = z.fortran_vec ();
-          Array<octave_idx_type> iz (nc);
+          Array<octave_idx_type> iz (nc, 1);
           octave_idx_type *piz = iz.fortran_vec ();
 
           F77_XFCN (dtrcon, DTRCON, (F77_CONST_CHAR_ARG2 (&norm, 1), 
@@ -1423,9 +1420,9 @@
           char uplo = 'L';
           char dia = 'N';
 
-          Array<double> z (3 * nc);
+          Array<double> z (3 * nc, 1);
           double *pz = z.fortran_vec ();
-          Array<octave_idx_type> iz (nc);
+          Array<octave_idx_type> iz (nc, 1);
           octave_idx_type *piz = iz.fortran_vec ();
 
           F77_XFCN (dtrcon, DTRCON, (F77_CONST_CHAR_ARG2 (&norm, 1), 
@@ -1468,9 +1465,9 @@
                 }
               else 
                 {
-                  Array<double> z (3 * nc);
+                  Array<double> z (3 * nc, 1);
                   double *pz = z.fortran_vec ();
-                  Array<octave_idx_type> iz (nc);
+                  Array<octave_idx_type> iz (nc, 1);
                   octave_idx_type *piz = iz.fortran_vec ();
 
                   F77_XFCN (dpocon, DPOCON, (F77_CONST_CHAR_ARG2 (&job, 1),
@@ -1487,16 +1484,16 @@
             {
               octave_idx_type info = 0;
 
-              Array<octave_idx_type> ipvt (nr);
+              Array<octave_idx_type> ipvt (nr, 1);
               octave_idx_type *pipvt = ipvt.fortran_vec ();
 
               if(anorm < 0.)
                 anorm = atmp.abs().sum().
                   row(static_cast<octave_idx_type>(0)).max();
 
-              Array<double> z (4 * nc);
+              Array<double> z (4 * nc, 1);
               double *pz = z.fortran_vec ();
-              Array<octave_idx_type> iz (nc);
+              Array<octave_idx_type> iz (nc, 1);
               octave_idx_type *piz = iz.fortran_vec ();
 
               F77_XFCN (dgetrf, DGETRF, (nr, nr, tmp_data, nr, pipvt, info));
@@ -1567,9 +1564,9 @@
                   char uplo = 'U';
                   char dia = 'N';
 
-                  Array<double> z (3 * nc);
+                  Array<double> z (3 * nc, 1);
                   double *pz = z.fortran_vec ();
-                  Array<octave_idx_type> iz (nc);
+                  Array<octave_idx_type> iz (nc, 1);
                   octave_idx_type *piz = iz.fortran_vec ();
 
                   F77_XFCN (dtrcon, DTRCON, (F77_CONST_CHAR_ARG2 (&norm, 1), 
@@ -1667,9 +1664,9 @@
                   char uplo = 'L';
                   char dia = 'N';
 
-                  Array<double> z (3 * nc);
+                  Array<double> z (3 * nc, 1);
                   double *pz = z.fortran_vec ();
-                  Array<octave_idx_type> iz (nc);
+                  Array<octave_idx_type> iz (nc, 1);
                   octave_idx_type *piz = iz.fortran_vec ();
 
                   F77_XFCN (dtrcon, DTRCON, (F77_CONST_CHAR_ARG2 (&norm, 1), 
@@ -1773,9 +1770,9 @@
             {
               if (calc_cond)
                 {
-                  Array<double> z (3 * nc);
+                  Array<double> z (3 * nc, 1);
                   double *pz = z.fortran_vec ();
-                  Array<octave_idx_type> iz (nc);
+                  Array<octave_idx_type> iz (nc, 1);
                   octave_idx_type *piz = iz.fortran_vec ();
 
                   F77_XFCN (dpocon, DPOCON, (F77_CONST_CHAR_ARG2 (&job, 1),
@@ -1825,7 +1822,7 @@
         {
           info = 0;
 
-          Array<octave_idx_type> ipvt (nr);
+          Array<octave_idx_type> ipvt (nr, 1);
           octave_idx_type *pipvt = ipvt.fortran_vec ();
 
           Matrix atmp = *this;
@@ -1833,9 +1830,9 @@
           if(anorm < 0.)
             anorm = atmp.abs().sum().row(static_cast<octave_idx_type>(0)).max();
 
-          Array<double> z (4 * nc);
+          Array<double> z (4 * nc, 1);
           double *pz = z.fortran_vec ();
-          Array<octave_idx_type> iz (nc);
+          Array<octave_idx_type> iz (nc, 1);
           octave_idx_type *piz = iz.fortran_vec ();
 
           F77_XFCN (dgetrf, DGETRF, (nr, nr, tmp_data, nr, pipvt, info));
@@ -2264,13 +2261,13 @@
       double *tmp_data = atmp.fortran_vec ();
 
       double *pretval = retval.fortran_vec ();
-      Array<double> s (minmn);
+      Array<double> s (minmn, 1);
       double *ps = s.fortran_vec ();
 
       // Ask DGELSD what the dimension of WORK should be.
       octave_idx_type lwork = -1;
 
-      Array<double> work (1);
+      Array<double> work (1, 1);
 
       octave_idx_type smlsiz;
       F77_FUNC (xilaenv, XILAENV) (9, F77_CONST_CHAR_ARG2 ("DGELSD", 6),
@@ -2302,7 +2299,7 @@
       octave_idx_type liwork = 3 * minmn * nlvl + 11 * minmn;
       if (liwork < 1)
         liwork = 1;
-      Array<octave_idx_type> iwork (liwork);
+      Array<octave_idx_type> iwork (liwork, 1);
       octave_idx_type* piwork = iwork.fortran_vec ();
 
       F77_XFCN (dgelsd, DGELSD, (m, n, nrhs, tmp_data, m, pretval, maxmn,
@@ -2347,7 +2344,7 @@
         }
 
       lwork = static_cast<octave_idx_type> (work(0));
-      work.resize (lwork);
+      work.resize (lwork, 1);
 
       F77_XFCN (dgelsd, DGELSD, (m, n, nrhs, tmp_data, m, pretval,
                                  maxmn, ps, rcon, rank,
@@ -2465,13 +2462,13 @@
       double *tmp_data = atmp.fortran_vec ();
 
       double *pretval = retval.fortran_vec ();
-      Array<double> s (minmn);
+      Array<double> s (minmn, 1);
       double *ps = s.fortran_vec ();
 
       // Ask DGELSD what the dimension of WORK should be.
       octave_idx_type lwork = -1;
 
-      Array<double> work (1);
+      Array<double> work (1, 1);
 
       octave_idx_type smlsiz;
       F77_FUNC (xilaenv, XILAENV) (9, F77_CONST_CHAR_ARG2 ("DGELSD", 6),
@@ -2496,7 +2493,7 @@
       octave_idx_type liwork = 3 * minmn * nlvl + 11 * minmn;
       if (liwork < 1)
         liwork = 1;
-      Array<octave_idx_type> iwork (liwork);
+      Array<octave_idx_type> iwork (liwork, 1);
       octave_idx_type* piwork = iwork.fortran_vec ();
 
       F77_XFCN (dgelsd, DGELSD, (m, n, nrhs, tmp_data, m, pretval, maxmn,
@@ -2504,7 +2501,7 @@
                                  lwork, piwork, info));
 
       lwork = static_cast<octave_idx_type> (work(0));
-      work.resize (lwork);
+      work.resize (lwork, 1);
 
       F77_XFCN (dgelsd, DGELSD, (m, n, nrhs, tmp_data, m, pretval,
                                  maxmn, ps, rcon, rank,
@@ -2831,7 +2828,7 @@
 Matrix
 Matrix::diag (octave_idx_type k) const
 {
-  return MArray2<double>::diag (k);
+  return MArray<double>::diag (k);
 }
 
 ColumnVector
@@ -2852,7 +2849,7 @@
   if (nr > 0 && nc > 0)
     {
       result.resize (nr);
-      idx_arg.resize (nr);
+      idx_arg.resize (nr, 1);
 
       for (octave_idx_type i = 0; i < nr; i++)
         {
@@ -2907,7 +2904,7 @@
   if (nr > 0 && nc > 0)
     {
       result.resize (nr);
-      idx_arg.resize (nr);
+      idx_arg.resize (nr, 1);
 
       for (octave_idx_type i = 0; i < nr; i++)
         {
@@ -2962,7 +2959,7 @@
   if (nr > 0 && nc > 0)
     {
       result.resize (nc);
-      idx_arg.resize (nc);
+      idx_arg.resize (1, nc);
 
       for (octave_idx_type j = 0; j < nc; j++)
         {
@@ -3017,7 +3014,7 @@
   if (nr > 0 && nc > 0)
     {
       result.resize (nc);
-      idx_arg.resize (nc);
+      idx_arg.resize (1, nc);
 
       for (octave_idx_type j = 0; j < nc; j++)
         {
--- a/liboctave/dMatrix.h
+++ b/liboctave/dMatrix.h
@@ -24,7 +24,8 @@
 #if !defined (octave_Matrix_int_h)
 #define octave_Matrix_int_h 1
 
-#include "MArray2.h"
+#include "MArray.h"
+#include "Array2.h"
 #include "MDiagArray2.h"
 #include "MatrixType.h"
 
@@ -34,7 +35,7 @@
 
 class
 OCTAVE_API
-Matrix : public MArray2<double>
+Matrix : public MArray<double>
 {
 public:
 
@@ -43,26 +44,26 @@
 
   typedef void (*solve_singularity_handler) (double rcon);
 
-  Matrix (void) : MArray2<double> () { }
+  Matrix (void) : MArray<double> () { }
 
-  Matrix (octave_idx_type r, octave_idx_type c) : MArray2<double> (r, c) { }
+  Matrix (octave_idx_type r, octave_idx_type c) : MArray<double> (r, c) { }
 
-  Matrix (octave_idx_type r, octave_idx_type c, double val) : MArray2<double> (r, c, val) { }
+  Matrix (octave_idx_type r, octave_idx_type c, double val) : MArray<double> (r, c, val) { }
 
-  Matrix (const dim_vector& dv) : MArray2<double> (dv) { }
+  Matrix (const dim_vector& dv) : MArray<double> (dv.redim (2)) { }
 
-  Matrix (const dim_vector& dv, double val) : MArray2<double> (dv, val) { }
+  Matrix (const dim_vector& dv, double val) : MArray<double> (dv.redim (2), val) { }
 
-  Matrix (const Matrix& a) : MArray2<double> (a) { }
+  Matrix (const Matrix& a) : MArray<double> (a) { }
 
   template <class U>
-  Matrix (const MArray2<U>& a) : MArray2<double> (a) { }
+  Matrix (const MArray<U>& a) : MArray<double> (a.as_matrix ()) { }
 
   template <class U>
-  Matrix (const Array2<U>& a) : MArray2<double> (a) { }
+  Matrix (const Array2<U>& a) : MArray<double> (a) { }
 
   template <class U>
-  Matrix (const Array<U>& a) : MArray2<double> (a) { }
+  Matrix (const Array<U>& a) : MArray<double> (a.as_matrix ()) { }
 
   explicit Matrix (const RowVector& rv);
 
@@ -78,7 +79,7 @@
 
   Matrix& operator = (const Matrix& a)
     {
-      MArray2<double>::operator = (a);
+      MArray<double>::operator = (a);
       return *this;
     }
 
@@ -112,7 +113,7 @@
 
   friend class ComplexMatrix;
 
-  Matrix transpose (void) const { return MArray2<double>::transpose (); }
+  Matrix transpose (void) const { return MArray<double>::transpose (); }
 
   // resize is the destructive equivalent for this one
 
@@ -331,7 +332,7 @@
 
 private:
 
-  Matrix (double *d, octave_idx_type r, octave_idx_type c) : MArray2<double> (d, r, c) { }
+  Matrix (double *d, octave_idx_type r, octave_idx_type c) : MArray<double> (d, r, c) { }
 };
 
 // Publish externally used friend functions.
@@ -376,7 +377,7 @@
 MM_CMP_OP_DECLS (Matrix, Matrix, OCTAVE_API)
 MM_BOOL_OP_DECLS (Matrix, Matrix, OCTAVE_API)
 
-MARRAY_FORWARD_DEFS (MArray2, Matrix, double)
+MARRAY_FORWARD_DEFS (MArray, Matrix, double)
 
 template <class T>
 void read_int (std::istream& is, bool swap_bytes, T& val);
--- a/liboctave/dNDArray.cc
+++ b/liboctave/dNDArray.cc
@@ -88,7 +88,7 @@
 }
 
 NDArray::NDArray (const charNDArray& a)
-  : MArrayN<double> (a.dims ())
+  : MArray<double> (a.dims ())
 {
   octave_idx_type n = a.numel ();
   for (octave_idx_type i = 0; i < n; i++)
@@ -940,7 +940,7 @@
 NDArray
 NDArray::diag (octave_idx_type k) const
 {
-  return MArrayN<double>::diag (k);
+  return MArray<double>::diag (k);
 }
 
 // This contains no information on the array structure !!!
--- a/liboctave/dNDArray.h
+++ b/liboctave/dNDArray.h
@@ -24,7 +24,7 @@
 #if !defined (octave_NDArray_h)
 #define octave_NDArray_h 1
 
-#include "MArrayN.h"
+#include "MArray.h"
 #include "dMatrix.h"
 #include "intNDArray.h"
 
@@ -34,40 +34,40 @@
 
 class
 OCTAVE_API
-NDArray : public MArrayN<double>
+NDArray : public MArray<double>
 {
 public:
 
   typedef Matrix matrix_type;
 
-  NDArray (void) : MArrayN<double> () { }
+  NDArray (void) : MArray<double> () { }
 
-  NDArray (const dim_vector& dv) : MArrayN<double> (dv) { }
+  NDArray (const dim_vector& dv) : MArray<double> (dv) { }
 
   NDArray (const dim_vector& dv, double val)
-    : MArrayN<double> (dv, val) { }
+    : MArray<double> (dv, val) { }
   
-  NDArray (const NDArray& a) : MArrayN<double> (a) { }
+  NDArray (const NDArray& a) : MArray<double> (a) { }
 
-  NDArray (const Matrix& a) : MArrayN<double> (a) { }
+  NDArray (const Matrix& a) : MArray<double> (a) { }
 
   NDArray (const Array<octave_idx_type>& a, bool zero_based = false, 
            bool negative_to_nan = false);
 
   template <class U>
-  NDArray (const MArrayN<U>& a) : MArrayN<double> (a) { }
+  NDArray (const MArray<U>& a) : MArray<double> (a) { }
 
   template <class U>
-  NDArray (const Array<U>& a) : MArrayN<double> (a) { }
+  NDArray (const Array<U>& a) : MArray<double> (a) { }
 
   template <class U>
-  explicit NDArray (const intNDArray<U>& a) : MArrayN<double> (a) { }
+  explicit NDArray (const intNDArray<U>& a) : MArray<double> (a) { }
 
   NDArray (const charNDArray&); 
 
   NDArray& operator = (const NDArray& a)
     {
-      MArrayN<double>::operator = (a);
+      MArray<double>::operator = (a);
       return *this;
     }
 
@@ -136,7 +136,7 @@
 
   Matrix matrix_value (void) const;
 
-  NDArray squeeze (void) const { return MArrayN<double>::squeeze (); }
+  NDArray squeeze (void) const { return MArray<double>::squeeze (); }
 
   static void increment_index (Array<octave_idx_type>& ra_idx,
                                const dim_vector& dimensions,
@@ -156,13 +156,13 @@
 
   NDArray& changesign (void) 
     { 
-      MArrayN<double>::changesign (); 
+      MArray<double>::changesign (); 
       return *this; 
     }
 
 private:
 
-  NDArray (double *d, const dim_vector& dv) : MArrayN<double> (d, dv) { }
+  NDArray (double *d, const dim_vector& dv) : MArray<double> (d, dv) { }
 };
 
 // Publish externally used friend functions.
@@ -181,7 +181,7 @@
 NDND_CMP_OP_DECLS (NDArray, NDArray, OCTAVE_API)
 NDND_BOOL_OP_DECLS (NDArray, NDArray, OCTAVE_API)
 
-MARRAY_FORWARD_DEFS (MArrayN, NDArray, double)
+MARRAY_FORWARD_DEFS (MArray, NDArray, double)
 
 BSXFUN_STDOP_DECLS (NDArray, OCTAVE_API)
 BSXFUN_STDREL_DECLS (NDArray, OCTAVE_API)
--- a/liboctave/dRowVector.h
+++ b/liboctave/dRowVector.h
@@ -34,17 +34,18 @@
 {
 public:
 
-  RowVector (void) : MArray<double> () { }
+  RowVector (void) : MArray<double> (1, 0) { }
 
-  explicit RowVector (octave_idx_type n) : MArray<double> (n) { }
+  explicit RowVector (octave_idx_type n) : MArray<double> (1, n) { }
 
-  explicit RowVector (const dim_vector& dv) : MArray<double> (dv) { }
+  explicit RowVector (const dim_vector& dv) : MArray<double> (dv.as_row ()) { }
 
-  RowVector (octave_idx_type n, double val) : MArray<double> (n, val) { }
+  RowVector (octave_idx_type n, double val) : MArray<double> (1, n, val) { }
 
   RowVector (const RowVector& a) : MArray<double> (a) { }
 
-  RowVector (const MArray<double>& a) : MArray<double> (a) { }
+  RowVector (const MArray<double>& a) : MArray<double> (a.as_row ()) { }
+  RowVector (const Array<double>& a) : MArray<double> (a.as_row ()) { }
 
   RowVector& operator = (const RowVector& a)
     {
@@ -89,9 +90,15 @@
   friend OCTAVE_API std::ostream& operator << (std::ostream& os, const RowVector& a);
   friend OCTAVE_API std::istream& operator >> (std::istream& is, RowVector& a);
 
+  void resize (octave_idx_type n, const double& rfv = Array<double>::resize_fill_value ())
+    { Array<double>::resize (1, n, rfv); }
+
+  void clear (octave_idx_type n)
+    { Array<double>::clear (1, n); }
+
 private:
 
-  RowVector (double *d, octave_idx_type l) : MArray<double> (d, l) { }
+  RowVector (double *d, octave_idx_type l) : MArray<double> (d, 1, l) { }
 };
 
 // row vector by column vector -> scalar
--- a/liboctave/dSparse.cc
+++ b/liboctave/dSparse.cc
@@ -349,7 +349,7 @@
     }
   else
     {
-      idx_arg.resize_fill (nr, 1, 0);
+      idx_arg.resize (nr, 1, 0);
 
       for (octave_idx_type i = cidx(0); i < cidx(1); i++)
         idx_arg.elem(ridx(i)) = -1;
@@ -498,7 +498,7 @@
     }
   else
     {
-      idx_arg.resize_fill (nr, 1, 0);
+      idx_arg.resize (nr, 1, 0);
 
       for (octave_idx_type i = cidx(0); i < cidx(1); i++)
         idx_arg.elem(ridx(i)) = -1;
@@ -4019,7 +4019,7 @@
           OCTAVE_LOCAL_BUFFER (double, DU, nr - 1);
           OCTAVE_LOCAL_BUFFER (double, D, nr);
           OCTAVE_LOCAL_BUFFER (double, DL, nr - 1);
-          Array<octave_idx_type> ipvt (nr);
+          Array<octave_idx_type> ipvt (nr, 1);
           octave_idx_type *pipvt = ipvt.fortran_vec ();
 
           if (mattype.is_dense ())
@@ -4318,7 +4318,7 @@
           OCTAVE_LOCAL_BUFFER (double, DU, nr - 1);
           OCTAVE_LOCAL_BUFFER (double, D, nr);
           OCTAVE_LOCAL_BUFFER (double, DL, nr - 1);
-          Array<octave_idx_type> ipvt (nr);
+          Array<octave_idx_type> ipvt (nr, 1);
           octave_idx_type *pipvt = ipvt.fortran_vec ();
 
           if (mattype.is_dense ())
@@ -4533,9 +4533,9 @@
             {
               if (calc_cond)
                 {
-                  Array<double> z (3 * nr);
+                  Array<double> z (3 * nr, 1);
                   double *pz = z.fortran_vec ();
-                  Array<octave_idx_type> iz (nr);
+                  Array<octave_idx_type> iz (nr, 1);
                   octave_idx_type *piz = iz.fortran_vec ();
 
                   F77_XFCN (dpbcon, DPBCON, 
@@ -4627,7 +4627,7 @@
                 }
             }
 
-          Array<octave_idx_type> ipvt (nr);
+          Array<octave_idx_type> ipvt (nr, 1);
           octave_idx_type *pipvt = ipvt.fortran_vec ();
 
           F77_XFCN (dgbtrf, DGBTRF, (nr, nr, n_lower, n_upper, tmp_data, 
@@ -4655,9 +4655,9 @@
               if (calc_cond)
                 {
                   char job = '1';
-                  Array<double> z (3 * nr);
+                  Array<double> z (3 * nr, 1);
                   double *pz = z.fortran_vec ();
-                  Array<octave_idx_type> iz (nr);
+                  Array<octave_idx_type> iz (nr, 1);
                   octave_idx_type *piz = iz.fortran_vec ();
 
                   F77_XFCN (dgbcon, DGBCON, 
@@ -4781,9 +4781,9 @@
             {
               if (calc_cond)
                 {
-                  Array<double> z (3 * nr);
+                  Array<double> z (3 * nr, 1);
                   double *pz = z.fortran_vec ();
-                  Array<octave_idx_type> iz (nr);
+                  Array<octave_idx_type> iz (nr, 1);
                   octave_idx_type *piz = iz.fortran_vec ();
 
                   F77_XFCN (dpbcon, DPBCON, 
@@ -4910,7 +4910,7 @@
                 }
             }
 
-          Array<octave_idx_type> ipvt (nr);
+          Array<octave_idx_type> ipvt (nr, 1);
           octave_idx_type *pipvt = ipvt.fortran_vec ();
 
           F77_XFCN (dgbtrf, DGBTRF, (nr, nr, n_lower, n_upper, tmp_data, 
@@ -4936,9 +4936,9 @@
               if (calc_cond)
                 {
                   char job = '1';
-                  Array<double> z (3 * nr);
+                  Array<double> z (3 * nr, 1);
                   double *pz = z.fortran_vec ();
-                  Array<octave_idx_type> iz (nr);
+                  Array<octave_idx_type> iz (nr, 1);
                   octave_idx_type *piz = iz.fortran_vec ();
 
                   F77_XFCN (dgbcon, DGBCON, 
@@ -5101,9 +5101,9 @@
             {
               if (calc_cond)
                 {
-                  Array<double> z (3 * nr);
+                  Array<double> z (3 * nr, 1);
                   double *pz = z.fortran_vec ();
-                  Array<octave_idx_type> iz (nr);
+                  Array<octave_idx_type> iz (nr, 1);
                   octave_idx_type *piz = iz.fortran_vec ();
 
                   F77_XFCN (dpbcon, DPBCON, 
@@ -5226,7 +5226,7 @@
                 }
             }
 
-          Array<octave_idx_type> ipvt (nr);
+          Array<octave_idx_type> ipvt (nr, 1);
           octave_idx_type *pipvt = ipvt.fortran_vec ();
 
           F77_XFCN (dgbtrf, DGBTRF, (nr, nr, n_lower, n_upper, tmp_data, 
@@ -5252,9 +5252,9 @@
               if (calc_cond)
                 {
                   char job = '1';
-                  Array<double> z (3 * nr);
+                  Array<double> z (3 * nr, 1);
                   double *pz = z.fortran_vec ();
-                  Array<octave_idx_type> iz (nr);
+                  Array<octave_idx_type> iz (nr, 1);
                   octave_idx_type *piz = iz.fortran_vec ();
 
                   F77_XFCN (dpbcon, DPBCON, 
@@ -5401,9 +5401,9 @@
             {
               if (calc_cond)
                 {
-                  Array<double> z (3 * nr);
+                  Array<double> z (3 * nr, 1);
                   double *pz = z.fortran_vec ();
-                  Array<octave_idx_type> iz (nr);
+                  Array<octave_idx_type> iz (nr, 1);
                   octave_idx_type *piz = iz.fortran_vec ();
 
                   F77_XFCN (dpbcon, DPBCON, 
@@ -5556,7 +5556,7 @@
                 }
             }
 
-          Array<octave_idx_type> ipvt (nr);
+          Array<octave_idx_type> ipvt (nr, 1);
           octave_idx_type *pipvt = ipvt.fortran_vec ();
 
           F77_XFCN (dgbtrf, DGBTRF, (nr, nr, n_lower, n_upper, tmp_data, 
@@ -5582,9 +5582,9 @@
               if (calc_cond)
                 {
                   char job = '1';
-                  Array<double> z (3 * nr);
+                  Array<double> z (3 * nr, 1);
                   double *pz = z.fortran_vec ();
-                  Array<octave_idx_type> iz (nr);
+                  Array<octave_idx_type> iz (nr, 1);
                   octave_idx_type *piz = iz.fortran_vec ();
 
                   F77_XFCN (dgbcon, DGBCON, 
--- a/liboctave/dbleCHOL.cc
+++ b/liboctave/dbleCHOL.cc
@@ -123,9 +123,9 @@
       octave_idx_type dpocon_info = 0;
 
       // Now calculate the condition number for non-singular matrix.
-      Array<double> z (3*n);
+      Array<double> z (3*n, 1);
       double *pz = z.fortran_vec ();
-      Array<octave_idx_type> iz (n);
+      Array<octave_idx_type> iz (n, 1);
       octave_idx_type *piz = iz.fortran_vec ();
       F77_XFCN (dpocon, DPOCON, (F77_CONST_CHAR_ARG2 ("U", 1), n, h,
                                  n, anorm, xrcond, pz, piz, dpocon_info
@@ -416,7 +416,7 @@
   else
     {
       Matrix a = chol_mat.transpose () * chol_mat;
-      Array<octave_idx_type> p (n);
+      Array<octave_idx_type> p (n, 1);
       for (octave_idx_type k = 0; k < n; k++) p(k) = k;
       if (i < j)
         {
--- a/liboctave/dbleHESS.cc
+++ b/liboctave/dbleHESS.cc
@@ -80,17 +80,17 @@
   hess_mat = a;
   double *h = hess_mat.fortran_vec ();
 
-  Array<double> scale (n);
+  Array<double> scale (n, 1);
   double *pscale = scale.fortran_vec ();
 
   F77_XFCN (dgebal, DGEBAL, (F77_CONST_CHAR_ARG2 (&job, 1),
                              n, h, n, ilo, ihi, pscale, info
                              F77_CHAR_ARG_LEN (1)));
 
-  Array<double> tau (n-1);
+  Array<double> tau (n-1, 1);
   double *ptau = tau.fortran_vec ();
 
-  Array<double> work (lwork);
+  Array<double> work (lwork, 1);
   double *pwork = work.fortran_vec ();
 
   F77_XFCN (dgehrd, DGEHRD, (n, ilo, ihi, h, n, ptau, pwork,
--- a/liboctave/dbleLU.cc
+++ b/liboctave/dbleLU.cc
@@ -69,7 +69,7 @@
   octave_idx_type a_nc = a.cols ();
   octave_idx_type mn = (a_nr < a_nc ? a_nr : a_nc);
 
-  ipvt.resize (mn);
+  ipvt.resize (mn, 1);
   octave_idx_type *pipvt = ipvt.fortran_vec ();
 
   a_fact = a;
--- a/liboctave/dbleQRP.cc
+++ b/liboctave/dbleQRP.cc
@@ -65,7 +65,7 @@
   if (m > n && qr_type == qr_type_std)
     afact.resize (m, m);
 
-  MArray<octave_idx_type> jpvt (n, 0);
+  MArray<octave_idx_type> jpvt (n, 1, 0);
 
   if (m > 0)
     {
--- a/liboctave/dbleSCHUR.cc
+++ b/liboctave/dbleSCHUR.cc
@@ -111,20 +111,20 @@
   double *s = schur_mat.fortran_vec ();
   double *q = unitary_mat.fortran_vec ();
 
-  Array<double> wr (n);
+  Array<double> wr (n, 1);
   double *pwr = wr.fortran_vec ();
 
-  Array<double> wi (n);
+  Array<double> wi (n, 1);
   double *pwi = wi.fortran_vec ();
 
-  Array<double> work (lwork);
+  Array<double> work (lwork, 1);
   double *pwork = work.fortran_vec ();
 
   // BWORK is not referenced for the non-ordered Schur routine.
-  Array<octave_idx_type> bwork ((ord_char == 'N' || ord_char == 'n') ? 0 : n);
+  Array<octave_idx_type> bwork ((ord_char == 'N' || ord_char == 'n') ? 0 : n, 1);
   octave_idx_type *pbwork = bwork.fortran_vec ();
 
-  Array<octave_idx_type> iwork (liwork);
+  Array<octave_idx_type> iwork (liwork, 1);
   octave_idx_type *piwork = iwork.fortran_vec ();
 
   F77_XFCN (dgeesx, DGEESX, (F77_CONST_CHAR_ARG2 (&jobvs, 1),
--- a/liboctave/dbleSVD.cc
+++ b/liboctave/dbleSVD.cc
@@ -135,7 +135,7 @@
 
   octave_idx_type lwork = -1;
 
-  Array<double> work (1);
+  Array<double> work (1, 1);
 
   octave_idx_type one = 1;
   octave_idx_type m1 = std::max (m, one), nrow_vt1 = std::max (nrow_vt, one);
@@ -148,7 +148,7 @@
                              F77_CHAR_ARG_LEN (1)));
 
   lwork = static_cast<octave_idx_type> (work(0));
-  work.resize (lwork);
+  work.resize (lwork, 1);
 
   F77_XFCN (dgesvd, DGESVD, (F77_CONST_CHAR_ARG2 (&jobu, 1),
                              F77_CONST_CHAR_ARG2 (&jobv, 1),
--- a/liboctave/dim-vector.h
+++ b/liboctave/dim-vector.h
@@ -133,7 +133,7 @@
 
 public:
 
-  explicit dim_vector (octave_idx_type n)
+  explicit dim_vector (octave_idx_type n) GCC_ATTR_DEPRECATED
     : rep (newrep (2))
   {
     rep[0] = n;
@@ -555,6 +555,22 @@
         }
     }
 
+  dim_vector as_column (void) const
+    {
+      if (length () == 2 && elem (1) == 1)
+        return *this;
+      else
+        return dim_vector (numel (), 1);
+    }
+
+  dim_vector as_row (void) const
+    {
+      if (length () == 2 && elem (0) == 1)
+        return *this;
+      else
+        return dim_vector (1, numel ());
+    }
+
   bool is_vector (void) const
     {
       return (length () == 2 && (elem (0) == 1 || elem (1) == 1));
--- a/liboctave/eigs-base.cc
+++ b/liboctave/eigs-base.cc
@@ -828,7 +828,7 @@
         }
       else
         {
-          Array<bool> checked(n,false);
+          Array<bool> checked(n, 1, false);
           for (octave_idx_type i = 0; i < n; i++)
             {
               octave_idx_type bidx = 
@@ -886,7 +886,7 @@
         }
     }
 
-  Array<octave_idx_type> ip (11);
+  Array<octave_idx_type> ip (11, 1);
   octave_idx_type *iparam = ip.fortran_vec ();
 
   ip(0) = 1; //ishift
@@ -902,7 +902,7 @@
   ip(10) = 0;
   // ip(7) to ip(10) return values
  
-  Array<octave_idx_type> iptr (14);
+  Array<octave_idx_type> iptr (14, 1);
   octave_idx_type *ipntr = iptr.fortran_vec ();
 
   octave_idx_type ido = 0;
@@ -989,7 +989,7 @@
   // long as the HOWMNY arg is not "S", the logical array
   // is just workspace for ARPACK, so use int type to 
   // avoid problems.
-  Array<octave_idx_type> s (p);
+  Array<octave_idx_type> s (p, 1);
   octave_idx_type *sel = s.fortran_vec ();
 
   eig_vec.resize (n, k);
@@ -1151,7 +1151,7 @@
         }
       else
         {
-          Array<bool> checked(n,false);
+          Array<bool> checked (n, 1, false);
           for (octave_idx_type i = 0; i < n; i++)
             {
               octave_idx_type bidx = 
@@ -1171,7 +1171,7 @@
   if (have_b)
     bmat = 'G';
 
-  Array<octave_idx_type> ip (11);
+  Array<octave_idx_type> ip (11, 1);
   octave_idx_type *iparam = ip.fortran_vec ();
 
   ip(0) = 1; //ishift
@@ -1187,7 +1187,7 @@
   ip(10) = 0;
   // ip(7) to ip(10) return values
 
-  Array<octave_idx_type> iptr (14);
+  Array<octave_idx_type> iptr (14, 1);
   octave_idx_type *ipntr = iptr.fortran_vec ();
 
   octave_idx_type ido = 0;
@@ -1326,7 +1326,7 @@
   // long as the HOWMNY arg is not "S", the logical array
   // is just workspace for ARPACK, so use int type to 
   // avoid problems.
-  Array<octave_idx_type> s (p);
+  Array<octave_idx_type> s (p, 1);
   octave_idx_type *sel = s.fortran_vec ();
                         
   eig_vec.resize (n, k);
@@ -1480,7 +1480,7 @@
       mode = 3;
     }
 
-  Array<octave_idx_type> ip (11);
+  Array<octave_idx_type> ip (11, 1);
   octave_idx_type *iparam = ip.fortran_vec ();
 
   ip(0) = 1; //ishift
@@ -1496,7 +1496,7 @@
   ip(10) = 0;
   // ip(7) to ip(10) return values
  
-  Array<octave_idx_type> iptr (14);
+  Array<octave_idx_type> iptr (14, 1);
   octave_idx_type *ipntr = iptr.fortran_vec ();
 
   octave_idx_type ido = 0;
@@ -1584,7 +1584,7 @@
   // long as the HOWMNY arg is not "S", the logical array
   // is just workspace for ARPACK, so use int type to 
   // avoid problems.
-  Array<octave_idx_type> s (p);
+  Array<octave_idx_type> s (p, 1);
   octave_idx_type *sel = s.fortran_vec ();
                         
   eig_vec.resize (n, k);
@@ -1742,7 +1742,7 @@
         }
       else
         {
-          Array<bool> checked(n,false);
+          Array<bool> checked (n, 1, false);
           for (octave_idx_type i = 0; i < n; i++)
             {
               octave_idx_type bidx = 
@@ -1800,7 +1800,7 @@
         }
     }
 
-  Array<octave_idx_type> ip (11);
+  Array<octave_idx_type> ip (11, 1);
   octave_idx_type *iparam = ip.fortran_vec ();
 
   ip(0) = 1; //ishift
@@ -1816,7 +1816,7 @@
   ip(10) = 0;
   // ip(7) to ip(10) return values
  
-  Array<octave_idx_type> iptr (14);
+  Array<octave_idx_type> iptr (14, 1);
   octave_idx_type *ipntr = iptr.fortran_vec ();
 
   octave_idx_type ido = 0;
@@ -1903,7 +1903,7 @@
   // long as the HOWMNY arg is not "S", the logical array
   // is just workspace for ARPACK, so use int type to 
   // avoid problems.
-  Array<octave_idx_type> s (p);
+  Array<octave_idx_type> s (p, 1);
   octave_idx_type *sel = s.fortran_vec ();
 
   Matrix eig_vec2 (n, k + 1);
@@ -2107,7 +2107,7 @@
         }
       else
         {
-          Array<bool> checked(n,false);
+          Array<bool> checked (n, 1, false);
           for (octave_idx_type i = 0; i < n; i++)
             {
               octave_idx_type bidx = 
@@ -2127,7 +2127,7 @@
   if (have_b)
     bmat = 'G';
 
-  Array<octave_idx_type> ip (11);
+  Array<octave_idx_type> ip (11, 1);
   octave_idx_type *iparam = ip.fortran_vec ();
 
   ip(0) = 1; //ishift
@@ -2143,7 +2143,7 @@
   ip(10) = 0;
   // ip(7) to ip(10) return values
 
-  Array<octave_idx_type> iptr (14);
+  Array<octave_idx_type> iptr (14, 1);
   octave_idx_type *ipntr = iptr.fortran_vec ();
 
   octave_idx_type ido = 0;
@@ -2282,7 +2282,7 @@
   // long as the HOWMNY arg is not "S", the logical array
   // is just workspace for ARPACK, so use int type to 
   // avoid problems.
-  Array<octave_idx_type> s (p);
+  Array<octave_idx_type> s (p, 1);
   octave_idx_type *sel = s.fortran_vec ();
                         
   Matrix eig_vec2 (n, k + 1);
@@ -2484,7 +2484,7 @@
       mode = 3;
     }
 
-  Array<octave_idx_type> ip (11);
+  Array<octave_idx_type> ip (11, 1);
   octave_idx_type *iparam = ip.fortran_vec ();
 
   ip(0) = 1; //ishift
@@ -2500,7 +2500,7 @@
   ip(10) = 0;
   // ip(7) to ip(10) return values
  
-  Array<octave_idx_type> iptr (14);
+  Array<octave_idx_type> iptr (14, 1);
   octave_idx_type *ipntr = iptr.fortran_vec ();
 
   octave_idx_type ido = 0;
@@ -2587,7 +2587,7 @@
   // long as the HOWMNY arg is not "S", the logical array
   // is just workspace for ARPACK, so use int type to 
   // avoid problems.
-  Array<octave_idx_type> s (p);
+  Array<octave_idx_type> s (p, 1);
   octave_idx_type *sel = s.fortran_vec ();
 
   Matrix eig_vec2 (n, k + 1);
@@ -2789,7 +2789,7 @@
         }
       else
         {
-          Array<bool> checked(n,false);
+          Array<bool> checked (n, 1, false);
           for (octave_idx_type i = 0; i < n; i++)
             {
               octave_idx_type bidx = 
@@ -2847,7 +2847,7 @@
         }
     }
 
-  Array<octave_idx_type> ip (11);
+  Array<octave_idx_type> ip (11, 1);
   octave_idx_type *iparam = ip.fortran_vec ();
 
   ip(0) = 1; //ishift
@@ -2863,7 +2863,7 @@
   ip(10) = 0;
   // ip(7) to ip(10) return values
  
-  Array<octave_idx_type> iptr (14);
+  Array<octave_idx_type> iptr (14, 1);
   octave_idx_type *ipntr = iptr.fortran_vec ();
 
   octave_idx_type ido = 0;
@@ -2950,7 +2950,7 @@
   // long as the HOWMNY arg is not "S", the logical array
   // is just workspace for ARPACK, so use int type to 
   // avoid problems.
-  Array<octave_idx_type> s (p);
+  Array<octave_idx_type> s (p, 1);
   octave_idx_type *sel = s.fortran_vec ();
 
   eig_vec.resize (n, k);
@@ -3113,7 +3113,7 @@
         }
       else
         {
-          Array<bool> checked(n,false);
+          Array<bool> checked (n, 1, false);
           for (octave_idx_type i = 0; i < n; i++)
             {
               octave_idx_type bidx = 
@@ -3133,7 +3133,7 @@
   if (have_b)
     bmat = 'G';
 
-  Array<octave_idx_type> ip (11);
+  Array<octave_idx_type> ip (11, 1);
   octave_idx_type *iparam = ip.fortran_vec ();
 
   ip(0) = 1; //ishift
@@ -3149,7 +3149,7 @@
   ip(10) = 0;
   // ip(7) to ip(10) return values
 
-  Array<octave_idx_type> iptr (14);
+  Array<octave_idx_type> iptr (14, 1);
   octave_idx_type *ipntr = iptr.fortran_vec ();
 
   octave_idx_type ido = 0;
@@ -3290,7 +3290,7 @@
   // long as the HOWMNY arg is not "S", the logical array
   // is just workspace for ARPACK, so use int type to 
   // avoid problems.
-  Array<octave_idx_type> s (p);
+  Array<octave_idx_type> s (p, 1);
   octave_idx_type *sel = s.fortran_vec ();
 
   eig_vec.resize (n, k);
@@ -3450,7 +3450,7 @@
       mode = 3;
     }
 
-  Array<octave_idx_type> ip (11);
+  Array<octave_idx_type> ip (11, 1);
   octave_idx_type *iparam = ip.fortran_vec ();
 
   ip(0) = 1; //ishift
@@ -3466,7 +3466,7 @@
   ip(10) = 0;
   // ip(7) to ip(10) return values
  
-  Array<octave_idx_type> iptr (14);
+  Array<octave_idx_type> iptr (14, 1);
   octave_idx_type *ipntr = iptr.fortran_vec ();
 
   octave_idx_type ido = 0;
--- a/liboctave/fCColVector.cc
+++ b/liboctave/fCColVector.cc
@@ -51,10 +51,8 @@
 // FloatComplex Column Vector class
 
 FloatComplexColumnVector::FloatComplexColumnVector (const FloatColumnVector& a)
-   : MArray<FloatComplex> (a.length ())
+   : MArray<FloatComplex> (a)
 {
-  for (octave_idx_type i = 0; i < length (); i++)
-    elem (i) = a.elem (i);
 }
 
 bool
--- a/liboctave/fCColVector.h
+++ b/liboctave/fCColVector.h
@@ -37,18 +37,20 @@
 
 public:
 
-  FloatComplexColumnVector (void) : MArray<FloatComplex> () { }
+  FloatComplexColumnVector (void) : MArray<FloatComplex> (0, 1) { }
 
-  explicit FloatComplexColumnVector (octave_idx_type n) : MArray<FloatComplex> (n) { }
+  explicit FloatComplexColumnVector (octave_idx_type n) : MArray<FloatComplex> (n, 1) { }
 
-  explicit FloatComplexColumnVector (const dim_vector& dv) : MArray<FloatComplex> (dv) { }
+  explicit FloatComplexColumnVector (const dim_vector& dv) 
+    : MArray<FloatComplex> (dv.as_column ()) { }
 
   FloatComplexColumnVector (octave_idx_type n, const FloatComplex& val)
-    : MArray<FloatComplex> (n, val) { }
+    : MArray<FloatComplex> (n, 1, val) { }
 
   FloatComplexColumnVector (const FloatComplexColumnVector& a) : MArray<FloatComplex> (a) { }
 
-  FloatComplexColumnVector (const MArray<FloatComplex>& a) : MArray<FloatComplex> (a) { }
+  FloatComplexColumnVector (const MArray<FloatComplex>& a) : MArray<FloatComplex> (a.as_column ()) { }
+  FloatComplexColumnVector (const Array<FloatComplex>& a) : MArray<FloatComplex> (a.as_column ()) { }
 
   explicit FloatComplexColumnVector (const FloatColumnVector& a);
 
@@ -124,9 +126,15 @@
   friend OCTAVE_API std::ostream& operator << (std::ostream& os, const FloatComplexColumnVector& a);
   friend OCTAVE_API std::istream& operator >> (std::istream& is, FloatComplexColumnVector& a);
 
+  void resize (octave_idx_type n, const FloatComplex& rfv = Array<FloatComplex>::resize_fill_value ())
+    { Array<FloatComplex>::resize (n, 1, rfv); }
+
+  void clear (octave_idx_type n)
+    { Array<FloatComplex>::clear (n, 1); }
+
 private:
 
-  FloatComplexColumnVector (FloatComplex *d, octave_idx_type l) : MArray<FloatComplex> (d, l) { }
+  FloatComplexColumnVector (FloatComplex *d, octave_idx_type l) : MArray<FloatComplex> (d, l, 1) { }
 };
 
 MARRAY_FORWARD_DEFS (MArray, FloatComplexColumnVector, FloatComplex)
--- a/liboctave/fCMatrix.cc
+++ b/liboctave/fCMatrix.cc
@@ -232,46 +232,39 @@
 // FloatComplex Matrix class
 
 FloatComplexMatrix::FloatComplexMatrix (const FloatMatrix& a)
-  : MArray2<FloatComplex> (a.rows (), a.cols ())
+  : MArray<FloatComplex> (a)
 {
-  for (octave_idx_type j = 0; j < cols (); j++)
-    for (octave_idx_type i = 0; i < rows (); i++)
-      elem (i, j) = a.elem (i, j);
 }
 
 FloatComplexMatrix::FloatComplexMatrix (const FloatRowVector& rv)
-  : MArray2<FloatComplex> (1, rv.length (), 0.0)
+  : MArray<FloatComplex> (rv)
 {
-  for (octave_idx_type i = 0; i < rv.length (); i++)
-    elem (0, i) = rv.elem (i);
 }
 
 FloatComplexMatrix::FloatComplexMatrix (const FloatColumnVector& cv)
-  : MArray2<FloatComplex> (cv.length (), 1, 0.0)
+  : MArray<FloatComplex> (cv)
 {
-  for (octave_idx_type i = 0; i < cv.length (); i++)
-    elem (i, 0) = cv.elem (i);
 }
 
 FloatComplexMatrix::FloatComplexMatrix (const FloatDiagMatrix& a)
-  : MArray2<FloatComplex> (a.rows (), a.cols (), 0.0)
+  : MArray<FloatComplex> (a.rows (), a.cols (), 0.0)
 {
   for (octave_idx_type i = 0; i < a.length (); i++)
     elem (i, i) = a.elem (i, i);
 }
 
 FloatComplexMatrix::FloatComplexMatrix (const FloatComplexRowVector& rv)
-  : MArray2<FloatComplex> (Array2<FloatComplex> (rv, 1, rv.length ()))
+  : MArray<FloatComplex> (rv)
 {
 }
 
 FloatComplexMatrix::FloatComplexMatrix (const FloatComplexColumnVector& cv)
-  : MArray2<FloatComplex> (Array2<FloatComplex> (cv, cv.length (), 1))
+  : MArray<FloatComplex> (cv)
 {
 }
 
 FloatComplexMatrix::FloatComplexMatrix (const FloatComplexDiagMatrix& a)
-  : MArray2<FloatComplex> (a.rows (), a.cols (), 0.0)
+  : MArray<FloatComplex> (a.rows (), a.cols (), 0.0)
 {
   for (octave_idx_type i = 0; i < a.length (); i++)
     elem (i, i) = a.elem (i, i);
@@ -281,15 +274,12 @@
 // here?
 
 FloatComplexMatrix::FloatComplexMatrix (const boolMatrix& a)
-  : MArray2<FloatComplex> (a.rows (), a.cols (), 0.0)
+  : MArray<FloatComplex> (a)
 {
-  for (octave_idx_type i = 0; i < a.rows (); i++)
-    for (octave_idx_type j = 0; j < a.cols (); j++)
-      elem (i, j) = a.elem (i, j);
 }
 
 FloatComplexMatrix::FloatComplexMatrix (const charMatrix& a)
-  : MArray2<FloatComplex> (a.rows (), a.cols (), 0.0)
+  : MArray<FloatComplex> (a.rows (), a.cols (), 0.0)
 {
   for (octave_idx_type i = 0; i < a.rows (); i++)
     for (octave_idx_type j = 0; j < a.cols (); j++)
@@ -297,7 +287,7 @@
 }
 
 FloatComplexMatrix::FloatComplexMatrix (const FloatMatrix& re, const FloatMatrix& im)
-  : MArray2<FloatComplex> (re.rows (), re.cols ())
+  : MArray<FloatComplex> (re.rows (), re.cols ())
 {
   if (im.rows () != rows () || im.cols () != cols ())
     (*current_liboctave_error_handler) ("complex: internal error");
@@ -441,7 +431,7 @@
 FloatComplexMatrix&
 FloatComplexMatrix::insert (const FloatComplexMatrix& a, octave_idx_type r, octave_idx_type c)
 {
-  Array2<FloatComplex>::insert (a, r, c);
+  Array<FloatComplex>::insert (a, r, c);
   return *this;
 }
 
@@ -942,13 +932,13 @@
 FloatComplexRowVector
 FloatComplexMatrix::row (octave_idx_type i) const
 {
-  return MArray<FloatComplex> (index (idx_vector (i), idx_vector::colon));
+  return index (idx_vector (i), idx_vector::colon);
 }
 
 FloatComplexColumnVector
 FloatComplexMatrix::column (octave_idx_type i) const
 {
-  return MArray<FloatComplex> (index (idx_vector::colon, idx_vector (i)));
+  return index (idx_vector::colon, idx_vector (i));
 }
 
 FloatComplexMatrix
@@ -1061,13 +1051,13 @@
     (*current_liboctave_error_handler) ("inverse requires square matrix");
   else
     {
-      Array<octave_idx_type> ipvt (nr);
+      Array<octave_idx_type> ipvt (nr, 1);
       octave_idx_type *pipvt = ipvt.fortran_vec ();
 
       retval = *this;
       FloatComplex *tmp_data = retval.fortran_vec ();
 
-      Array<FloatComplex> z(1);
+      Array<FloatComplex> z(1, 1);
       octave_idx_type lwork = -1;
 
       // Query the optimum work array size.
@@ -1077,7 +1067,7 @@
 
       lwork = static_cast<octave_idx_type> (std::real(z(0)));
       lwork = (lwork <  2 *nc ? 2*nc : lwork);
-      z.resize (lwork);
+      z.resize (lwork, 1);
       FloatComplex *pz = z.fortran_vec ();
 
       info = 0;
@@ -1098,7 +1088,7 @@
           // Now calculate the condition number for non-singular matrix.
           octave_idx_type zgecon_info = 0;
           char job = '1';
-          Array<float> rz (2 * nc);
+          Array<float> rz (2 * nc, 1);
           float *prz = rz.fortran_vec ();
           F77_XFCN (cgecon, CGECON, (F77_CONST_CHAR_ARG2 (&job, 1),
                                      nc, tmp_data, nr, anorm, 
@@ -1334,7 +1324,7 @@
 
   octave_idx_type nn = 4*npts+15;
 
-  Array<FloatComplex> wsave (nn);
+  Array<FloatComplex> wsave (nn, 1);
   FloatComplex *pwsave = wsave.fortran_vec ();
 
   retval = *this;
@@ -1375,7 +1365,7 @@
 
   octave_idx_type nn = 4*npts+15;
 
-  Array<FloatComplex> wsave (nn);
+  Array<FloatComplex> wsave (nn, 1);
   FloatComplex *pwsave = wsave.fortran_vec ();
 
   retval = *this;
@@ -1419,7 +1409,7 @@
 
   octave_idx_type nn = 4*npts+15;
 
-  Array<FloatComplex> wsave (nn);
+  Array<FloatComplex> wsave (nn, 1);
   FloatComplex *pwsave = wsave.fortran_vec ();
 
   retval = *this;
@@ -1438,10 +1428,10 @@
   nsamples = nr;
   nn = 4*npts+15;
 
-  wsave.resize (nn);
+  wsave.resize (nn, 1);
   pwsave = wsave.fortran_vec ();
 
-  Array<FloatComplex> tmp (npts);
+  Array<FloatComplex> tmp (npts, 1);
   FloatComplex *prow = tmp.fortran_vec ();
 
   F77_FUNC (cffti, CFFTI) (npts, pwsave);
@@ -1485,7 +1475,7 @@
 
   octave_idx_type nn = 4*npts+15;
 
-  Array<FloatComplex> wsave (nn);
+  Array<FloatComplex> wsave (nn, 1);
   FloatComplex *pwsave = wsave.fortran_vec ();
 
   retval = *this;
@@ -1507,10 +1497,10 @@
   nsamples = nr;
   nn = 4*npts+15;
 
-  wsave.resize (nn);
+  wsave.resize (nn, 1);
   pwsave = wsave.fortran_vec ();
 
-  Array<FloatComplex> tmp (npts);
+  Array<FloatComplex> tmp (npts, 1);
   FloatComplex *prow = tmp.fortran_vec ();
 
   F77_FUNC (cffti, CFFTI) (npts, pwsave);
@@ -1607,9 +1597,9 @@
             }
           else 
             {
-              Array<FloatComplex> z (2 * nc);
+              Array<FloatComplex> z (2 * nc, 1);
               FloatComplex *pz = z.fortran_vec ();
-              Array<float> rz (nc);
+              Array<float> rz (nc, 1);
               float *prz = rz.fortran_vec ();
 
               F77_XFCN (cpocon, CPOCON, (F77_CONST_CHAR_ARG2 (&job, 1),
@@ -1631,7 +1621,7 @@
 
       if (typ == MatrixType::Full)
         {
-          Array<octave_idx_type> ipvt (nr);
+          Array<octave_idx_type> ipvt (nr, 1);
           octave_idx_type *pipvt = ipvt.fortran_vec ();
 
           FloatComplexMatrix atmp = *this;
@@ -1658,9 +1648,9 @@
                 {
                   // Now calc the condition number for non-singular matrix.
                   char job = '1';
-                  Array<FloatComplex> z (2 * nc);
+                  Array<FloatComplex> z (2 * nc, 1);
                   FloatComplex *pz = z.fortran_vec ();
-                  Array<float> rz (2 * nc);
+                  Array<float> rz (2 * nc, 1);
                   float *prz = rz.fortran_vec ();
 
                   F77_XFCN (cgecon, CGECON, (F77_CONST_CHAR_ARG2 (&job, 1),
@@ -1723,9 +1713,9 @@
           char uplo = 'U';
           char dia = 'N';
 
-          Array<FloatComplex> z (2 * nc);
+          Array<FloatComplex> z (2 * nc, 1);
           FloatComplex *pz = z.fortran_vec ();
-          Array<float> rz (nc);
+          Array<float> rz (nc, 1);
           float *prz = rz.fortran_vec ();
 
           F77_XFCN (ctrcon, CTRCON, (F77_CONST_CHAR_ARG2 (&norm, 1), 
@@ -1751,9 +1741,9 @@
           char uplo = 'L';
           char dia = 'N';
 
-          Array<FloatComplex> z (2 * nc);
+          Array<FloatComplex> z (2 * nc, 1);
           FloatComplex *pz = z.fortran_vec ();
-          Array<float> rz (nc);
+          Array<float> rz (nc, 1);
           float *prz = rz.fortran_vec ();
 
           F77_XFCN (ctrcon, CTRCON, (F77_CONST_CHAR_ARG2 (&norm, 1), 
@@ -1797,9 +1787,9 @@
                 }
               else 
                 {
-                  Array<FloatComplex> z (2 * nc);
+                  Array<FloatComplex> z (2 * nc, 1);
                   FloatComplex *pz = z.fortran_vec ();
-                  Array<float> rz (nc);
+                  Array<float> rz (nc, 1);
                   float *prz = rz.fortran_vec ();
 
                   F77_XFCN (cpocon, CPOCON, (F77_CONST_CHAR_ARG2 (&job, 1),
@@ -1817,16 +1807,16 @@
             {
               octave_idx_type info = 0;
 
-              Array<octave_idx_type> ipvt (nr);
+              Array<octave_idx_type> ipvt (nr, 1);
               octave_idx_type *pipvt = ipvt.fortran_vec ();
 
               if(anorm < 0.)
                 anorm = atmp.abs().sum().
                   row(static_cast<octave_idx_type>(0)).max();
 
-              Array<FloatComplex> z (2 * nc);
+              Array<FloatComplex> z (2 * nc, 1);
               FloatComplex *pz = z.fortran_vec ();
-              Array<float> rz (2 * nc);
+              Array<float> rz (2 * nc, 1);
               float *prz = rz.fortran_vec ();
 
               F77_XFCN (cgetrf, CGETRF, (nr, nr, tmp_data, nr, pipvt, info));
@@ -1898,9 +1888,9 @@
                   char uplo = 'U';
                   char dia = 'N';
 
-                  Array<FloatComplex> z (2 * nc);
+                  Array<FloatComplex> z (2 * nc, 1);
                   FloatComplex *pz = z.fortran_vec ();
-                  Array<float> rz (nc);
+                  Array<float> rz (nc, 1);
                   float *prz = rz.fortran_vec ();
 
                   F77_XFCN (ctrcon, CTRCON, (F77_CONST_CHAR_ARG2 (&norm, 1), 
@@ -1999,9 +1989,9 @@
                   char uplo = 'L';
                   char dia = 'N';
 
-                  Array<FloatComplex> z (2 * nc);
+                  Array<FloatComplex> z (2 * nc, 1);
                   FloatComplex *pz = z.fortran_vec ();
-                  Array<float> rz (nc);
+                  Array<float> rz (nc, 1);
                   float *prz = rz.fortran_vec ();
 
                   F77_XFCN (ctrcon, CTRCON, (F77_CONST_CHAR_ARG2 (&norm, 1), 
@@ -2107,9 +2097,9 @@
             {
               if (calc_cond)
                 {
-                  Array<FloatComplex> z (2 * nc);
+                  Array<FloatComplex> z (2 * nc, 1);
                   FloatComplex *pz = z.fortran_vec ();
-                  Array<float> rz (nc);
+                  Array<float> rz (nc, 1);
                   float *prz = rz.fortran_vec ();
 
                   F77_XFCN (cpocon, CPOCON, (F77_CONST_CHAR_ARG2 (&job, 1),
@@ -2159,15 +2149,15 @@
         {
           info = 0;
 
-          Array<octave_idx_type> ipvt (nr);
+          Array<octave_idx_type> ipvt (nr, 1);
           octave_idx_type *pipvt = ipvt.fortran_vec ();
 
           FloatComplexMatrix atmp = *this;
           FloatComplex *tmp_data = atmp.fortran_vec ();
 
-          Array<FloatComplex> z (2 * nc);
+          Array<FloatComplex> z (2 * nc, 1);
           FloatComplex *pz = z.fortran_vec ();
-          Array<float> rz (2 * nc);
+          Array<float> rz (2 * nc, 1);
           float *prz = rz.fortran_vec ();
 
           // Calculate the norm of the matrix, for later use.
@@ -2613,13 +2603,13 @@
       FloatComplex *tmp_data = atmp.fortran_vec ();
 
       FloatComplex *pretval = retval.fortran_vec ();
-      Array<float> s (minmn);
+      Array<float> s (minmn, 1);
       float *ps = s.fortran_vec ();
 
       // Ask ZGELSD what the dimension of WORK should be.
       octave_idx_type lwork = -1;
 
-      Array<FloatComplex> work (1);
+      Array<FloatComplex> work (1, 1);
 
       octave_idx_type smlsiz;
       F77_FUNC (xilaenv, XILAENV) (9, F77_CONST_CHAR_ARG2 ("CGELSD", 6),
@@ -2653,13 +2643,13 @@
         + 3*smlsiz*nrhs + (smlsiz+1)*(smlsiz+1);
       if (lrwork < 1)
         lrwork = 1;
-      Array<float> rwork (lrwork);
+      Array<float> rwork (lrwork, 1);
       float *prwork = rwork.fortran_vec ();
 
       octave_idx_type liwork = 3 * minmn * nlvl + 11 * minmn;
       if (liwork < 1)
         liwork = 1;
-      Array<octave_idx_type> iwork (liwork);
+      Array<octave_idx_type> iwork (liwork, 1);
       octave_idx_type* piwork = iwork.fortran_vec ();
 
       F77_XFCN (cgelsd, CGELSD, (m, n, nrhs, tmp_data, m, pretval, maxmn,
@@ -2697,7 +2687,7 @@
         }
 
       lwork = static_cast<octave_idx_type> (std::real (work(0)));
-      work.resize (lwork);
+      work.resize (lwork, 1);
 
       F77_XFCN (cgelsd, CGELSD, (m, n, nrhs, tmp_data, m, pretval,
                                  maxmn, ps, rcon, rank,
@@ -2814,13 +2804,13 @@
       FloatComplex *tmp_data = atmp.fortran_vec ();
 
       FloatComplex *pretval = retval.fortran_vec ();
-      Array<float> s (minmn);
+      Array<float> s (minmn, 1);
       float *ps = s.fortran_vec ();
 
       // Ask ZGELSD what the dimension of WORK should be.
       octave_idx_type lwork = -1;
 
-      Array<FloatComplex> work (1);
+      Array<FloatComplex> work (1, 1);
 
       octave_idx_type smlsiz;
       F77_FUNC (xilaenv, XILAENV) (9, F77_CONST_CHAR_ARG2 ("CGELSD", 6),
@@ -2847,13 +2837,13 @@
         + 3*smlsiz*nrhs + (smlsiz+1)*(smlsiz+1);
       if (lrwork < 1)
         lrwork = 1;
-      Array<float> rwork (lrwork);
+      Array<float> rwork (lrwork, 1);
       float *prwork = rwork.fortran_vec ();
 
       octave_idx_type liwork = 3 * minmn * nlvl + 11 * minmn;
       if (liwork < 1)
         liwork = 1;
-      Array<octave_idx_type> iwork (liwork);
+      Array<octave_idx_type> iwork (liwork, 1);
       octave_idx_type* piwork = iwork.fortran_vec ();
 
       F77_XFCN (cgelsd, CGELSD, (m, n, nrhs, tmp_data, m, pretval, maxmn,
@@ -2861,9 +2851,9 @@
                                  lwork, prwork, piwork, info));
 
       lwork = static_cast<octave_idx_type> (std::real (work(0)));
-      work.resize (lwork);
-      rwork.resize (static_cast<octave_idx_type> (rwork(0)));
-      iwork.resize (iwork(0));
+      work.resize (lwork, 1);
+      rwork.resize (static_cast<octave_idx_type> (rwork(0)), 1);
+      iwork.resize (iwork(0), 1);
 
       F77_XFCN (cgelsd, CGELSD, (m, n, nrhs, tmp_data, m, pretval,
                                  maxmn, ps, rcon, rank,
@@ -3252,7 +3242,7 @@
 FloatComplexMatrix
 FloatComplexMatrix::diag (octave_idx_type k) const
 {
-  return MArray2<FloatComplex>::diag (k);
+  return MArray<FloatComplex>::diag (k);
 }
 
 bool
@@ -3311,7 +3301,7 @@
   if (nr > 0 && nc > 0)
     {
       result.resize (nr);
-      idx_arg.resize (nr);
+      idx_arg.resize (nr, 1);
 
       for (octave_idx_type i = 0; i < nr; i++)
         {
@@ -3385,7 +3375,7 @@
   if (nr > 0 && nc > 0)
     {
       result.resize (nr);
-      idx_arg.resize (nr);
+      idx_arg.resize (nr, 1);
 
       for (octave_idx_type i = 0; i < nr; i++)
         {
@@ -3459,7 +3449,7 @@
   if (nr > 0 && nc > 0)
     {
       result.resize (nc);
-      idx_arg.resize (nc);
+      idx_arg.resize (1, nc);
 
       for (octave_idx_type j = 0; j < nc; j++)
         {
@@ -3533,7 +3523,7 @@
   if (nr > 0 && nc > 0)
     {
       result.resize (nc);
-      idx_arg.resize (nc);
+      idx_arg.resize (1, nc);
 
       for (octave_idx_type j = 0; j < nc; j++)
         {
--- a/liboctave/fCMatrix.h
+++ b/liboctave/fCMatrix.h
@@ -24,7 +24,7 @@
 #if !defined (octave_FloatComplexMatrix_h)
 #define octave_FloatComplexMatrix_h 1
 
-#include "MArray2.h"
+#include "MArray.h"
 #include "MDiagArray2.h"
 #include "MatrixType.h"
 
@@ -35,7 +35,7 @@
 
 class
 OCTAVE_API
-FloatComplexMatrix : public MArray2<FloatComplex>
+FloatComplexMatrix : public MArray<FloatComplex>
 {
 public:
  
@@ -44,28 +44,28 @@
 
   typedef void (*solve_singularity_handler) (float rcon);
 
-  FloatComplexMatrix (void) : MArray2<FloatComplex> () { }
+  FloatComplexMatrix (void) : MArray<FloatComplex> () { }
 
-  FloatComplexMatrix (octave_idx_type r, octave_idx_type c) : MArray2<FloatComplex> (r, c) { }
+  FloatComplexMatrix (octave_idx_type r, octave_idx_type c) : MArray<FloatComplex> (r, c) { }
 
   FloatComplexMatrix (octave_idx_type r, octave_idx_type c, const FloatComplex& val)
-    : MArray2<FloatComplex> (r, c, val) { }
+    : MArray<FloatComplex> (r, c, val) { }
 
-  FloatComplexMatrix (const dim_vector& dv) : MArray2<FloatComplex> (dv) { }
+  FloatComplexMatrix (const dim_vector& dv) : MArray<FloatComplex> (dv.redim (2)) { }
 
   FloatComplexMatrix (const dim_vector& dv, const FloatComplex& val) 
-    : MArray2<FloatComplex> (dv, val) { }
+    : MArray<FloatComplex> (dv.redim (2), val) { }
 
-  FloatComplexMatrix (const FloatComplexMatrix& a) : MArray2<FloatComplex> (a) { }
+  FloatComplexMatrix (const FloatComplexMatrix& a) : MArray<FloatComplex> (a) { }
 
   template <class U>
-  FloatComplexMatrix (const MArray2<U>& a) : MArray2<FloatComplex> (a) { }
+  FloatComplexMatrix (const MArray<U>& a) : MArray<FloatComplex> (a.as_matrix ()) { }
 
   template <class U>
-  FloatComplexMatrix (const Array2<U>& a) : MArray2<FloatComplex> (a) { }
+  FloatComplexMatrix (const Array2<U>& a) : MArray<FloatComplex> (a) { }
 
   template <class U>
-  FloatComplexMatrix (const Array<U>& a) : MArray2<FloatComplex> (a) { }
+  FloatComplexMatrix (const Array<U>& a) : MArray<FloatComplex> (a.as_matrix ()) { }
 
   explicit FloatComplexMatrix (const FloatMatrix& a);
 
@@ -89,7 +89,7 @@
 
   FloatComplexMatrix& operator = (const FloatComplexMatrix& a)
     {
-      MArray2<FloatComplex>::operator = (a);
+      MArray<FloatComplex>::operator = (a);
       return *this;
     }
 
@@ -136,9 +136,9 @@
   FloatComplexMatrix stack (const FloatComplexDiagMatrix& a) const;
 
   FloatComplexMatrix hermitian (void) const
-    { return MArray2<FloatComplex>::hermitian (std::conj); }
+    { return MArray<FloatComplex>::hermitian (std::conj); }
   FloatComplexMatrix transpose (void) const
-    { return MArray2<FloatComplex>::transpose (); }
+    { return MArray<FloatComplex>::transpose (); }
 
   friend OCTAVE_API FloatComplexMatrix conj (const FloatComplexMatrix& a);
 
@@ -378,7 +378,7 @@
 
 private:
 
-  FloatComplexMatrix (FloatComplex *d, octave_idx_type r, octave_idx_type c) : MArray2<FloatComplex> (d, r, c) { }
+  FloatComplexMatrix (FloatComplex *d, octave_idx_type r, octave_idx_type c) : MArray<FloatComplex> (d, r, c) { }
 };
 
 extern OCTAVE_API FloatComplexMatrix conj (const FloatComplexMatrix& a);
@@ -430,6 +430,6 @@
 MM_CMP_OP_DECLS (FloatComplexMatrix, FloatComplexMatrix, OCTAVE_API)
 MM_BOOL_OP_DECLS (FloatComplexMatrix, FloatComplexMatrix, OCTAVE_API)
 
-MARRAY_FORWARD_DEFS (MArray2, FloatComplexMatrix, FloatComplex)
+MARRAY_FORWARD_DEFS (MArray, FloatComplexMatrix, FloatComplex)
 
 #endif
--- a/liboctave/fCNDArray.cc
+++ b/liboctave/fCNDArray.cc
@@ -46,7 +46,7 @@
 #include "bsxfun-defs.cc"
 
 FloatComplexNDArray::FloatComplexNDArray (const charNDArray& a)
-  : MArrayN<FloatComplex> (a.dims ())
+  : MArray<FloatComplex> (a.dims ())
 {
   octave_idx_type n = a.numel ();
   for (octave_idx_type i = 0; i < n; i++)
@@ -212,7 +212,7 @@
   FloatComplexNDArray retval (dv);
   octave_idx_type npts = dv(dim);
   octave_idx_type nn = 4*npts+15;
-  Array<FloatComplex> wsave (nn);
+  Array<FloatComplex> wsave (nn, 1);
   FloatComplex *pwsave = wsave.fortran_vec ();
 
   OCTAVE_LOCAL_BUFFER (FloatComplex, tmp, npts);
@@ -259,7 +259,7 @@
   FloatComplexNDArray retval (dv);
   octave_idx_type npts = dv(dim);
   octave_idx_type nn = 4*npts+15;
-  Array<FloatComplex> wsave (nn);
+  Array<FloatComplex> wsave (nn, 1);
   FloatComplex *pwsave = wsave.fortran_vec ();
 
   OCTAVE_LOCAL_BUFFER (FloatComplex, tmp, npts);
@@ -309,9 +309,9 @@
     {
       octave_idx_type npts = dv2(i);
       octave_idx_type nn = 4*npts+15;
-      Array<FloatComplex> wsave (nn);
+      Array<FloatComplex> wsave (nn, 1);
       FloatComplex *pwsave = wsave.fortran_vec ();
-      Array<FloatComplex> row (npts);
+      Array<FloatComplex> row (npts, 1);
       FloatComplex *prow = row.fortran_vec ();
 
       octave_idx_type howmany = numel () / npts;
@@ -357,9 +357,9 @@
     {
       octave_idx_type npts = dv2(i);
       octave_idx_type nn = 4*npts+15;
-      Array<FloatComplex> wsave (nn);
+      Array<FloatComplex> wsave (nn, 1);
       FloatComplex *pwsave = wsave.fortran_vec ();
-      Array<FloatComplex> row (npts);
+      Array<FloatComplex> row (npts, 1);
       FloatComplex *prow = row.fortran_vec ();
 
       octave_idx_type howmany = numel () / npts;
@@ -405,9 +405,9 @@
     {
       octave_idx_type npts = dv(i);
       octave_idx_type nn = 4*npts+15;
-      Array<FloatComplex> wsave (nn);
+      Array<FloatComplex> wsave (nn, 1);
       FloatComplex *pwsave = wsave.fortran_vec ();
-      Array<FloatComplex> row (npts);
+      Array<FloatComplex> row (npts, 1);
       FloatComplex *prow = row.fortran_vec ();
 
       octave_idx_type howmany = numel () / npts;
@@ -452,9 +452,9 @@
     {
       octave_idx_type npts = dv(i);
       octave_idx_type nn = 4*npts+15;
-      Array<FloatComplex> wsave (nn);
+      Array<FloatComplex> wsave (nn, 1);
       FloatComplex *pwsave = wsave.fortran_vec ();
-      Array<FloatComplex> row (npts);
+      Array<FloatComplex> row (npts, 1);
       FloatComplex *prow = row.fortran_vec ();
 
       octave_idx_type howmany = numel () / npts;
@@ -781,7 +781,7 @@
   
   if (n == dimensions.length ())
     {
-      Array<octave_idx_type> a_ra_idx (a_dv.length (), 0);
+      Array<octave_idx_type> a_ra_idx (a_dv.length (), 1, 0);
       
       a_ra_idx.elem (0) = r;
       a_ra_idx.elem (1) = c;
@@ -868,7 +868,7 @@
 FloatComplexNDArray
 FloatComplexNDArray::diag (octave_idx_type k) const
 {
-  return MArrayN<FloatComplex>::diag (k);
+  return MArray<FloatComplex>::diag (k);
 }
 
 // This contains no information on the array structure !!!
--- a/liboctave/fCNDArray.h
+++ b/liboctave/fCNDArray.h
@@ -23,7 +23,7 @@
 #if !defined (octave_FloatComplexNDArray_h)
 #define octave_FloatComplexNDArray_h 1
 
-#include "MArrayN.h"
+#include "MArray.h"
 #include "fCMatrix.h"
 
 #include "mx-defs.h"
@@ -32,34 +32,34 @@
 
 class
 OCTAVE_API
-FloatComplexNDArray : public MArrayN<FloatComplex>
+FloatComplexNDArray : public MArray<FloatComplex>
 {
 public:
 
   typedef FloatComplexMatrix matrix_type;
 
-  FloatComplexNDArray (void) : MArrayN<FloatComplex> () { }
+  FloatComplexNDArray (void) : MArray<FloatComplex> () { }
 
-  FloatComplexNDArray (const dim_vector& dv) : MArrayN<FloatComplex> (dv) { }
+  FloatComplexNDArray (const dim_vector& dv) : MArray<FloatComplex> (dv) { }
 
   FloatComplexNDArray (const dim_vector& dv, const FloatComplex& val)
-    : MArrayN<FloatComplex> (dv, val) { }
+    : MArray<FloatComplex> (dv, val) { }
   
-  FloatComplexNDArray (const FloatComplexNDArray& a) : MArrayN<FloatComplex> (a) { }
+  FloatComplexNDArray (const FloatComplexNDArray& a) : MArray<FloatComplex> (a) { }
 
-  FloatComplexNDArray (const FloatComplexMatrix& a) : MArrayN<FloatComplex> (a) { }
+  FloatComplexNDArray (const FloatComplexMatrix& a) : MArray<FloatComplex> (a) { }
 
   template <class U>
-  FloatComplexNDArray (const MArrayN<U>& a) : MArrayN<FloatComplex> (a) { }
+  FloatComplexNDArray (const MArray<U>& a) : MArray<FloatComplex> (a) { }
 
   template <class U>
-  FloatComplexNDArray (const Array<U>& a) : MArrayN<FloatComplex> (a) { }
+  FloatComplexNDArray (const Array<U>& a) : MArray<FloatComplex> (a) { }
 
   FloatComplexNDArray (const charNDArray&); 
 
   FloatComplexNDArray& operator = (const FloatComplexNDArray& a)
     {
-      MArrayN<FloatComplex>::operator = (a);
+      MArray<FloatComplex>::operator = (a);
       return *this;
     }
 
@@ -121,7 +121,7 @@
 
   FloatComplexMatrix matrix_value (void) const;
 
-  FloatComplexNDArray squeeze (void) const { return MArrayN<FloatComplex>::squeeze (); }
+  FloatComplexNDArray squeeze (void) const { return MArray<FloatComplex>::squeeze (); }
 
   static void increment_index (Array<octave_idx_type>& ra_idx,
                                const dim_vector& dimensions,
@@ -144,14 +144,14 @@
 
   FloatComplexNDArray& changesign (void) 
     { 
-      MArrayN<FloatComplex>::changesign (); 
+      MArray<FloatComplex>::changesign (); 
       return *this; 
     }
 
 private:
 
   FloatComplexNDArray (FloatComplex *d, const dim_vector& dv)
-    : MArrayN<FloatComplex> (d, dv) { }
+    : MArray<FloatComplex> (d, dv) { }
 };
 
 extern OCTAVE_API FloatComplexNDArray conj (const FloatComplexNDArray& a);
@@ -167,7 +167,7 @@
 NDND_CMP_OP_DECLS (FloatComplexNDArray, FloatComplexNDArray, OCTAVE_API)
 NDND_BOOL_OP_DECLS (FloatComplexNDArray, FloatComplexNDArray, OCTAVE_API)
 
-MARRAY_FORWARD_DEFS (MArrayN, FloatComplexNDArray, FloatComplex)
+MARRAY_FORWARD_DEFS (MArray, FloatComplexNDArray, FloatComplex)
 
 extern OCTAVE_API FloatComplexNDArray& operator *= (FloatComplexNDArray& a, float s);
 extern OCTAVE_API FloatComplexNDArray& operator /= (FloatComplexNDArray& a, float s);
--- a/liboctave/fCRowVector.cc
+++ b/liboctave/fCRowVector.cc
@@ -54,13 +54,6 @@
 
 // FloatComplex Row Vector class
 
-FloatComplexRowVector::FloatComplexRowVector (const FloatRowVector& a)
-  : MArray<FloatComplex> (a.length ())
-{
-  for (octave_idx_type i = 0; i < length (); i++)
-    elem (i) = a.elem (i);
-}
-
 bool
 FloatComplexRowVector::operator == (const FloatComplexRowVector& a) const
 {
--- a/liboctave/fCRowVector.h
+++ b/liboctave/fCRowVector.h
@@ -25,6 +25,7 @@
 #define octave_FloatComplexRowVector_h 1
 
 #include "MArray.h"
+#include "fRowVector.h"
 
 #include "mx-defs.h"
 
@@ -36,19 +37,21 @@
 
 public:
 
-  FloatComplexRowVector (void) : MArray<FloatComplex> () { }
+  FloatComplexRowVector (void) : MArray<FloatComplex> (1, 0) { }
 
-  explicit FloatComplexRowVector (octave_idx_type n) : MArray<FloatComplex> (n) { }
+  explicit FloatComplexRowVector (octave_idx_type n) : MArray<FloatComplex> (1, n) { }
 
-  explicit FloatComplexRowVector (const dim_vector& dv) : MArray<FloatComplex> (dv) { }
+  explicit FloatComplexRowVector (const dim_vector& dv) : MArray<FloatComplex> (dv.as_row ()) { }
 
-  FloatComplexRowVector (octave_idx_type n, const FloatComplex& val) : MArray<FloatComplex> (n, val) { }
+  FloatComplexRowVector (octave_idx_type n, const FloatComplex& val) 
+    : MArray<FloatComplex> (1, n, val) { }
 
   FloatComplexRowVector (const FloatComplexRowVector& a) : MArray<FloatComplex> (a) { }
 
-  FloatComplexRowVector (const MArray<FloatComplex>& a) : MArray<FloatComplex> (a) { }
+  FloatComplexRowVector (const MArray<FloatComplex>& a) : MArray<FloatComplex> (a.as_row ()) { }
+  FloatComplexRowVector (const Array<FloatComplex>& a) : MArray<FloatComplex> (a.as_row ()) { }
 
-  explicit FloatComplexRowVector (const FloatRowVector& a);
+  explicit FloatComplexRowVector (const FloatRowVector& a) : MArray<FloatComplex> (a) { }
 
   FloatComplexRowVector& operator = (const FloatComplexRowVector& a)
     {
@@ -106,9 +109,15 @@
   friend std::ostream& operator << (std::ostream& os, const FloatComplexRowVector& a);
   friend std::istream& operator >> (std::istream& is, FloatComplexRowVector& a);
 
+  void resize (octave_idx_type n, const FloatComplex& rfv = Array<FloatComplex>::resize_fill_value ())
+    { Array<FloatComplex>::resize (1, n, rfv); }
+
+  void clear (octave_idx_type n)
+    { Array<FloatComplex>::clear (1, n); }
+
 private:
 
-  FloatComplexRowVector (FloatComplex *d, octave_idx_type l) : MArray<FloatComplex> (d, l) { }
+  FloatComplexRowVector (FloatComplex *d, octave_idx_type l) : MArray<FloatComplex> (d, 1, l) { }
 };
 
 // row vector by column vector -> scalar
--- a/liboctave/fCmplxCHOL.cc
+++ b/liboctave/fCmplxCHOL.cc
@@ -123,9 +123,9 @@
       octave_idx_type cpocon_info = 0;
 
       // Now calculate the condition number for non-singular matrix.
-      Array<FloatComplex> z (2*n);
+      Array<FloatComplex> z (2*n, 1);
       FloatComplex *pz = z.fortran_vec ();
-      Array<float> rz (n);
+      Array<float> rz (n, 1);
       float *prz = rz.fortran_vec ();
       F77_XFCN (cpocon, CPOCON, (F77_CONST_CHAR_ARG2 ("U", 1), n, h,
                                  n, anorm, xrcond, pz, prz, cpocon_info
@@ -415,7 +415,7 @@
   else
     {
       FloatComplexMatrix a = chol_mat.hermitian () * chol_mat;
-      Array<octave_idx_type> p (n);
+      Array<octave_idx_type> p (n, 1);
       for (octave_idx_type k = 0; k < n; k++) p(k) = k;
       if (i < j)
         {
--- a/liboctave/fCmplxHESS.cc
+++ b/liboctave/fCmplxHESS.cc
@@ -81,17 +81,17 @@
   hess_mat = a;
   FloatComplex *h = hess_mat.fortran_vec ();
 
-  Array<float> scale (n);
+  Array<float> scale (n, 1);
   float *pscale = scale.fortran_vec ();
 
   F77_XFCN (cgebal, CGEBAL, (F77_CONST_CHAR_ARG2 (&job, 1),
                              n, h, n, ilo, ihi, pscale, info
                              F77_CHAR_ARG_LEN (1)));
 
-  Array<FloatComplex> tau (n-1);
+  Array<FloatComplex> tau (n-1, 1);
   FloatComplex *ptau = tau.fortran_vec ();
 
-  Array<FloatComplex> work (lwork);
+  Array<FloatComplex> work (lwork, 1);
   FloatComplex *pwork = work.fortran_vec ();
 
   F77_XFCN (cgehrd, CGEHRD, (n, ilo, ihi, h, n, ptau, pwork, lwork, info));
--- a/liboctave/fCmplxLU.cc
+++ b/liboctave/fCmplxLU.cc
@@ -69,7 +69,7 @@
   octave_idx_type a_nc = a.cols ();
   octave_idx_type mn = (a_nr < a_nc ? a_nr : a_nc);
 
-  ipvt.resize (mn);
+  ipvt.resize (mn, 1);
   octave_idx_type *pipvt = ipvt.fortran_vec ();
 
   a_fact = a;
--- a/liboctave/fCmplxQRP.cc
+++ b/liboctave/fCmplxQRP.cc
@@ -65,7 +65,7 @@
   if (m > n && qr_type == qr_type_std)
     afact.resize (m, m);
 
-  MArray<octave_idx_type> jpvt (n, 0);
+  MArray<octave_idx_type> jpvt (n, 1, 0);
 
   if (m > 0)
     {
--- a/liboctave/fCmplxSCHUR.cc
+++ b/liboctave/fCmplxSCHUR.cc
@@ -109,17 +109,17 @@
   FloatComplex *s = schur_mat.fortran_vec ();
   FloatComplex *q = unitary_mat.fortran_vec ();
 
-  Array<float> rwork (n);
+  Array<float> rwork (n, 1);
   float *prwork = rwork.fortran_vec ();
 
-  Array<FloatComplex> w (n);
+  Array<FloatComplex> w (n, 1);
   FloatComplex *pw = w.fortran_vec ();
 
-  Array<FloatComplex> work (lwork);
+  Array<FloatComplex> work (lwork, 1);
   FloatComplex *pwork = work.fortran_vec ();
 
   // BWORK is not referenced for non-ordered Schur.
-  Array<octave_idx_type> bwork ((ord_char == 'N' || ord_char == 'n') ? 0 : n);
+  Array<octave_idx_type> bwork ((ord_char == 'N' || ord_char == 'n') ? 0 : n, 1);
   octave_idx_type *pbwork = bwork.fortran_vec ();
 
   F77_XFCN (cgeesx, CGEESX, (F77_CONST_CHAR_ARG2 (&jobvs, 1),
--- a/liboctave/fCmplxSVD.cc
+++ b/liboctave/fCmplxSVD.cc
@@ -133,13 +133,13 @@
 
   octave_idx_type lrwork = 5*max_mn;
 
-  Array<float> rwork (lrwork);
+  Array<float> rwork (lrwork, 1);
 
   // Ask ZGESVD what the dimension of WORK should be.
 
   octave_idx_type lwork = -1;
 
-  Array<FloatComplex> work (1);
+  Array<FloatComplex> work (1, 1);
 
   octave_idx_type one = 1;
   octave_idx_type m1 = std::max (m, one), nrow_vt1 = std::max (nrow_vt, one);
@@ -153,7 +153,7 @@
                              F77_CHAR_ARG_LEN (1)));
 
   lwork = static_cast<octave_idx_type> (work(0).real ());
-  work.resize (lwork);
+  work.resize (lwork, 1);
 
   F77_XFCN (cgesvd, CGESVD, (F77_CONST_CHAR_ARG2 (&jobu, 1),
                              F77_CONST_CHAR_ARG2 (&jobv, 1),
--- a/liboctave/fColVector.h
+++ b/liboctave/fColVector.h
@@ -34,17 +34,19 @@
 {
 public:
 
-  FloatColumnVector (void) : MArray<float> () { }
+  FloatColumnVector (void) : MArray<float> (0, 1) { }
 
-  explicit FloatColumnVector (octave_idx_type n) : MArray<float> (n) { }
+  explicit FloatColumnVector (octave_idx_type n) : MArray<float> (n, 1) { }
 
-  explicit FloatColumnVector (const dim_vector& dv) : MArray<float> (dv) { }
+  explicit FloatColumnVector (const dim_vector& dv) 
+    : MArray<float> (dv.as_column ()) { }
 
-  FloatColumnVector (octave_idx_type n, float val) : MArray<float> (n, val) { }
+  FloatColumnVector (octave_idx_type n, float val) : MArray<float> (n, 1, val) { }
 
   FloatColumnVector (const FloatColumnVector& a) : MArray<float> (a) { }
 
-  FloatColumnVector (const MArray<float>& a) : MArray<float> (a) { }
+  FloatColumnVector (const MArray<float>& a) : MArray<float> (a.as_column ()) { }
+  FloatColumnVector (const Array<float>& a) : MArray<float> (a.as_column ()) { }
 
   FloatColumnVector& operator = (const FloatColumnVector& a)
     {
@@ -93,9 +95,15 @@
   friend OCTAVE_API std::ostream& operator << (std::ostream& os, const FloatColumnVector& a);
   friend OCTAVE_API std::istream& operator >> (std::istream& is, FloatColumnVector& a);
 
+  void resize (octave_idx_type n, const float& rfv = Array<float>::resize_fill_value ())
+    { Array<float>::resize (n, 1, rfv); }
+
+  void clear (octave_idx_type n)
+    { Array<float>::clear (n, 1); }
+
 private:
 
-  FloatColumnVector (float *d, octave_idx_type l) : MArray<float> (d, l) { }
+  FloatColumnVector (float *d, octave_idx_type l) : MArray<float> (d, l, 1) { }
 };
 
 // Publish externally used friend functions.
--- a/liboctave/fEIG.cc
+++ b/liboctave/fEIG.cc
@@ -155,10 +155,10 @@
   FloatMatrix atmp = a;
   float *tmp_data = atmp.fortran_vec ();
 
-  Array<float> wr (n);
+  Array<float> wr (n, 1);
   float *pwr = wr.fortran_vec ();
 
-  Array<float> wi (n);
+  Array<float> wi (n, 1);
   float *pwi = wi.fortran_vec ();
 
   volatile octave_idx_type nvr = calc_ev ? n : 0;
@@ -181,7 +181,7 @@
   if (info == 0)
     {
       lwork = static_cast<octave_idx_type> (dummy_work);
-      Array<float> work (lwork);
+      Array<float> work (lwork, 1);
       float *pwork = work.fortran_vec ();
 
       F77_XFCN (sgeev, SGEEV, (F77_CONST_CHAR_ARG2 ("N", 1),
@@ -273,7 +273,7 @@
   if (info == 0)
     {
       lwork = static_cast<octave_idx_type> (dummy_work);
-      Array<float> work (lwork);
+      Array<float> work (lwork, 1);
       float *pwork = work.fortran_vec ();
 
       F77_XFCN (ssyev, SSYEV, (F77_CONST_CHAR_ARG2 (calc_ev ? "V" : "N", 1),
@@ -340,7 +340,7 @@
   FloatComplex dummy_work;
 
   octave_idx_type lrwork = 2*n;
-  Array<float> rwork (lrwork);
+  Array<float> rwork (lrwork, 1);
   float *prwork = rwork.fortran_vec ();
 
   FloatComplex *dummy = 0;
@@ -356,7 +356,7 @@
   if (info == 0)
     {
       lwork = static_cast<octave_idx_type> (dummy_work.real ());
-      Array<FloatComplex> work (lwork);
+      Array<FloatComplex> work (lwork, 1);
       FloatComplex *pwork = work.fortran_vec ();
 
       F77_XFCN (cgeev, CGEEV, (F77_CONST_CHAR_ARG2 ("N", 1),
@@ -410,7 +410,7 @@
   FloatComplex dummy_work;
 
   octave_idx_type lrwork = 3*n;
-  Array<float> rwork (lrwork);
+  Array<float> rwork (lrwork, 1);
   float *prwork = rwork.fortran_vec ();
 
   F77_XFCN (cheev, CHEEV, (F77_CONST_CHAR_ARG2 (calc_ev ? "V" : "N", 1),
@@ -423,7 +423,7 @@
   if (info == 0)
     {
       lwork = static_cast<octave_idx_type> (dummy_work.real ());
-      Array<FloatComplex> work (lwork);
+      Array<FloatComplex> work (lwork, 1);
       FloatComplex *pwork = work.fortran_vec ();
 
       F77_XFCN (cheev, CHEEV, (F77_CONST_CHAR_ARG2 (calc_ev ? "V" : "N", 1),
@@ -498,13 +498,13 @@
   FloatMatrix btmp = b;
   float *btmp_data = btmp.fortran_vec ();
 
-  Array<float> ar (n);
+  Array<float> ar (n, 1);
   float *par = ar.fortran_vec ();
 
-  Array<float> ai (n);
+  Array<float> ai (n, 1);
   float *pai = ai.fortran_vec ();
 
-  Array<float> beta (n);
+  Array<float> beta (n, 1);
   float *pbeta = beta.fortran_vec ();
 
   volatile octave_idx_type nvr = calc_ev ? n : 0;
@@ -529,7 +529,7 @@
   if (info == 0)
     {
       lwork = static_cast<octave_idx_type> (dummy_work);
-      Array<float> work (lwork);
+      Array<float> work (lwork, 1);
       float *pwork = work.fortran_vec ();
 
       F77_XFCN (sggev, SGGEV, (F77_CONST_CHAR_ARG2 ("N", 1),
@@ -637,7 +637,7 @@
   if (info == 0)
     {
       lwork = static_cast<octave_idx_type> (dummy_work);
-      Array<float> work (lwork);
+      Array<float> work (lwork, 1);
       float *pwork = work.fortran_vec ();
 
       F77_XFCN (ssygv, SSYGV, (1, F77_CONST_CHAR_ARG2 (calc_ev ? "V" : "N", 1),
@@ -728,7 +728,7 @@
   FloatComplex dummy_work;
 
   octave_idx_type lrwork = 8*n;
-  Array<float> rwork (lrwork);
+  Array<float> rwork (lrwork, 1);
   float *prwork = rwork.fortran_vec ();
 
   FloatComplex *dummy = 0;
@@ -745,7 +745,7 @@
   if (info == 0)
     {
       lwork = static_cast<octave_idx_type> (dummy_work.real ());
-      Array<FloatComplex> work (lwork);
+      Array<FloatComplex> work (lwork, 1);
       FloatComplex *pwork = work.fortran_vec ();
 
       F77_XFCN (cggev, CGGEV, (F77_CONST_CHAR_ARG2 ("N", 1),
@@ -814,7 +814,7 @@
   FloatComplex dummy_work;
 
   octave_idx_type lrwork = 3*n;
-  Array<float> rwork (lrwork);
+  Array<float> rwork (lrwork, 1);
   float *prwork = rwork.fortran_vec ();
 
   F77_XFCN (chegv, CHEGV, (1, F77_CONST_CHAR_ARG2 (calc_ev ? "V" : "N", 1),
@@ -829,7 +829,7 @@
   if (info == 0)
     {
       lwork = static_cast<octave_idx_type> (dummy_work.real ());
-      Array<FloatComplex> work (lwork);
+      Array<FloatComplex> work (lwork, 1);
       FloatComplex *pwork = work.fortran_vec ();
 
       F77_XFCN (chegv, CHEGV, (1, F77_CONST_CHAR_ARG2 (calc_ev ? "V" : "N", 1),
--- a/liboctave/fMatrix.cc
+++ b/liboctave/fMatrix.cc
@@ -213,24 +213,24 @@
 // Matrix class.
 
 FloatMatrix::FloatMatrix (const FloatRowVector& rv)
-  : MArray2<float> (Array2<float> (rv, 1, rv.length ()))
+  : MArray<float> (rv)
 {
 }
 
 FloatMatrix::FloatMatrix (const FloatColumnVector& cv)
-  : MArray2<float> (Array2<float> (cv, cv.length (), 1))
+  : MArray<float> (cv)
 {
 }
 
 FloatMatrix::FloatMatrix (const FloatDiagMatrix& a)
-  : MArray2<float> (a.rows (), a.cols (), 0.0)
+  : MArray<float> (a.rows (), a.cols (), 0.0)
 {
   for (octave_idx_type i = 0; i < a.length (); i++)
     elem (i, i) = a.elem (i, i);
 }
 
 FloatMatrix::FloatMatrix (const PermMatrix& a)
-  : MArray2<float> (a.rows (), a.cols (), 0.0)
+  : MArray<float> (a.rows (), a.cols (), 0.0)
 {
   const Array<octave_idx_type> ia (a.pvec ());
   octave_idx_type len = a.rows ();
@@ -246,15 +246,12 @@
 // here?
 
 FloatMatrix::FloatMatrix (const boolMatrix& a)
-  : MArray2<float> (a.rows (), a.cols ())
+  : MArray<float> (a)
 {
-  for (octave_idx_type i = 0; i < a.rows (); i++)
-    for (octave_idx_type j = 0; j < a.cols (); j++)
-      elem (i, j) = a.elem (i, j);
 }
 
 FloatMatrix::FloatMatrix (const charMatrix& a)
-  : MArray2<float> (a.rows (), a.cols ())
+  : MArray<float> (a.rows (), a.cols ())
 {
   for (octave_idx_type i = 0; i < a.rows (); i++)
     for (octave_idx_type j = 0; j < a.cols (); j++)
@@ -295,7 +292,7 @@
 FloatMatrix&
 FloatMatrix::insert (const FloatMatrix& a, octave_idx_type r, octave_idx_type c)
 {
-  Array2<float>::insert (a, r, c);
+  Array<float>::insert (a, r, c);
   return *this;
 }
 
@@ -613,13 +610,13 @@
 FloatRowVector
 FloatMatrix::row (octave_idx_type i) const
 {
-  return MArray<float> (index (idx_vector (i), idx_vector::colon));
+  return index (idx_vector (i), idx_vector::colon);
 }
 
 FloatColumnVector
 FloatMatrix::column (octave_idx_type i) const
 {
-  return MArray<float> (index (idx_vector::colon, idx_vector (i)));
+  return index (idx_vector::colon, idx_vector (i));
 }
 
 FloatMatrix
@@ -733,13 +730,13 @@
     (*current_liboctave_error_handler) ("inverse requires square matrix");
   else
     {
-      Array<octave_idx_type> ipvt (nr);
+      Array<octave_idx_type> ipvt (nr, 1);
       octave_idx_type *pipvt = ipvt.fortran_vec ();
 
       retval = *this;
       float *tmp_data = retval.fortran_vec ();
 
-      Array<float> z(1);
+      Array<float> z(1, 1);
       octave_idx_type lwork = -1;
 
       // Query the optimum work array size.
@@ -748,7 +745,7 @@
 
       lwork = static_cast<octave_idx_type> (z(0));
       lwork = (lwork < 2 *nc ? 2*nc : lwork);
-      z.resize (lwork);
+      z.resize (lwork, 1);
       float *pz = z.fortran_vec ();
 
       info = 0;
@@ -770,7 +767,7 @@
 
           // Now calculate the condition number for non-singular matrix.
           char job = '1';
-          Array<octave_idx_type> iz (nc);
+          Array<octave_idx_type> iz (nc, 1);
           octave_idx_type *piz = iz.fortran_vec ();
           F77_XFCN (sgecon, SGECON, (F77_CONST_CHAR_ARG2 (&job, 1),
                                      nc, tmp_data, nr, anorm, 
@@ -1005,7 +1002,7 @@
 
   octave_idx_type nn = 4*npts+15;
 
-  Array<FloatComplex> wsave (nn);
+  Array<FloatComplex> wsave (nn, 1);
   FloatComplex *pwsave = wsave.fortran_vec ();
 
   retval = FloatComplexMatrix (*this);
@@ -1046,7 +1043,7 @@
 
   octave_idx_type nn = 4*npts+15;
 
-  Array<FloatComplex> wsave (nn);
+  Array<FloatComplex> wsave (nn, 1);
   FloatComplex *pwsave = wsave.fortran_vec ();
 
   retval = FloatComplexMatrix (*this);
@@ -1090,7 +1087,7 @@
 
   octave_idx_type nn = 4*npts+15;
 
-  Array<FloatComplex> wsave (nn);
+  Array<FloatComplex> wsave (nn, 1);
   FloatComplex *pwsave = wsave.fortran_vec ();
 
   retval = FloatComplexMatrix (*this);
@@ -1109,10 +1106,10 @@
   nsamples = nr;
   nn = 4*npts+15;
 
-  wsave.resize (nn);
+  wsave.resize (nn, 1);
   pwsave = wsave.fortran_vec ();
 
-  Array<FloatComplex> tmp (npts);
+  Array<FloatComplex> tmp (npts, 1);
   FloatComplex *prow = tmp.fortran_vec ();
 
   F77_FUNC (cffti, CFFTI) (npts, pwsave);
@@ -1156,7 +1153,7 @@
 
   octave_idx_type nn = 4*npts+15;
 
-  Array<FloatComplex> wsave (nn);
+  Array<FloatComplex> wsave (nn, 1);
   FloatComplex *pwsave = wsave.fortran_vec ();
 
   retval = FloatComplexMatrix (*this);
@@ -1178,10 +1175,10 @@
   nsamples = nr;
   nn = 4*npts+15;
 
-  wsave.resize (nn);
+  wsave.resize (nn, 1);
   pwsave = wsave.fortran_vec ();
 
-  Array<FloatComplex> tmp (npts);
+  Array<FloatComplex> tmp (npts, 1);
   FloatComplex *prow = tmp.fortran_vec ();
 
   F77_FUNC (cffti, CFFTI) (npts, pwsave);
@@ -1278,9 +1275,9 @@
             }
           else 
             {
-              Array<float> z (3 * nc);
+              Array<float> z (3 * nc, 1);
               float *pz = z.fortran_vec ();
-              Array<octave_idx_type> iz (nc);
+              Array<octave_idx_type> iz (nc, 1);
               octave_idx_type *piz = iz.fortran_vec ();
 
               F77_XFCN (spocon, SPOCON, (F77_CONST_CHAR_ARG2 (&job, 1),
@@ -1302,7 +1299,7 @@
 
       if (typ == MatrixType::Full)
         {
-          Array<octave_idx_type> ipvt (nr);
+          Array<octave_idx_type> ipvt (nr, 1);
           octave_idx_type *pipvt = ipvt.fortran_vec ();
 
           FloatMatrix atmp = *this;
@@ -1329,9 +1326,9 @@
                 {
                   // Now calc the condition number for non-singular matrix.
                   char job = '1';
-                  Array<float> z (4 * nc);
+                  Array<float> z (4 * nc, 1);
                   float *pz = z.fortran_vec ();
-                  Array<octave_idx_type> iz (nc);
+                  Array<octave_idx_type> iz (nc, 1);
                   octave_idx_type *piz = iz.fortran_vec ();
 
                   F77_XFCN (sgecon, SGECON, (F77_CONST_CHAR_ARG2 (&job, 1),
@@ -1394,9 +1391,9 @@
           char uplo = 'U';
           char dia = 'N';
 
-          Array<float> z (3 * nc);
+          Array<float> z (3 * nc, 1);
           float *pz = z.fortran_vec ();
-          Array<octave_idx_type> iz (nc);
+          Array<octave_idx_type> iz (nc, 1);
           octave_idx_type *piz = iz.fortran_vec ();
 
           F77_XFCN (strcon, STRCON, (F77_CONST_CHAR_ARG2 (&norm, 1), 
@@ -1422,9 +1419,9 @@
           char uplo = 'L';
           char dia = 'N';
 
-          Array<float> z (3 * nc);
+          Array<float> z (3 * nc, 1);
           float *pz = z.fortran_vec ();
-          Array<octave_idx_type> iz (nc);
+          Array<octave_idx_type> iz (nc, 1);
           octave_idx_type *piz = iz.fortran_vec ();
 
           F77_XFCN (strcon, STRCON, (F77_CONST_CHAR_ARG2 (&norm, 1), 
@@ -1467,9 +1464,9 @@
                 }
               else 
                 {
-                  Array<float> z (3 * nc);
+                  Array<float> z (3 * nc, 1);
                   float *pz = z.fortran_vec ();
-                  Array<octave_idx_type> iz (nc);
+                  Array<octave_idx_type> iz (nc, 1);
                   octave_idx_type *piz = iz.fortran_vec ();
 
                   F77_XFCN (spocon, SPOCON, (F77_CONST_CHAR_ARG2 (&job, 1),
@@ -1486,16 +1483,16 @@
             {
               octave_idx_type info = 0;
 
-              Array<octave_idx_type> ipvt (nr);
+              Array<octave_idx_type> ipvt (nr, 1);
               octave_idx_type *pipvt = ipvt.fortran_vec ();
 
               if(anorm < 0.)
                 anorm = atmp.abs().sum().
                   row(static_cast<octave_idx_type>(0)).max();
 
-              Array<float> z (4 * nc);
+              Array<float> z (4 * nc, 1);
               float *pz = z.fortran_vec ();
-              Array<octave_idx_type> iz (nc);
+              Array<octave_idx_type> iz (nc, 1);
               octave_idx_type *piz = iz.fortran_vec ();
 
               F77_XFCN (sgetrf, SGETRF, (nr, nr, tmp_data, nr, pipvt, info));
@@ -1566,9 +1563,9 @@
                   char uplo = 'U';
                   char dia = 'N';
 
-                  Array<float> z (3 * nc);
+                  Array<float> z (3 * nc, 1);
                   float *pz = z.fortran_vec ();
-                  Array<octave_idx_type> iz (nc);
+                  Array<octave_idx_type> iz (nc, 1);
                   octave_idx_type *piz = iz.fortran_vec ();
 
                   F77_XFCN (strcon, STRCON, (F77_CONST_CHAR_ARG2 (&norm, 1), 
@@ -1666,9 +1663,9 @@
                   char uplo = 'L';
                   char dia = 'N';
 
-                  Array<float> z (3 * nc);
+                  Array<float> z (3 * nc, 1);
                   float *pz = z.fortran_vec ();
-                  Array<octave_idx_type> iz (nc);
+                  Array<octave_idx_type> iz (nc, 1);
                   octave_idx_type *piz = iz.fortran_vec ();
 
                   F77_XFCN (strcon, STRCON, (F77_CONST_CHAR_ARG2 (&norm, 1), 
@@ -1772,9 +1769,9 @@
             {
               if (calc_cond)
                 {
-                  Array<float> z (3 * nc);
+                  Array<float> z (3 * nc, 1);
                   float *pz = z.fortran_vec ();
-                  Array<octave_idx_type> iz (nc);
+                  Array<octave_idx_type> iz (nc, 1);
                   octave_idx_type *piz = iz.fortran_vec ();
 
                   F77_XFCN (spocon, SPOCON, (F77_CONST_CHAR_ARG2 (&job, 1),
@@ -1824,7 +1821,7 @@
         {
           info = 0;
 
-          Array<octave_idx_type> ipvt (nr);
+          Array<octave_idx_type> ipvt (nr, 1);
           octave_idx_type *pipvt = ipvt.fortran_vec ();
 
           FloatMatrix atmp = *this;
@@ -1832,9 +1829,9 @@
           if(anorm < 0.)
             anorm = atmp.abs().sum().row(static_cast<octave_idx_type>(0)).max();
 
-          Array<float> z (4 * nc);
+          Array<float> z (4 * nc, 1);
           float *pz = z.fortran_vec ();
-          Array<octave_idx_type> iz (nc);
+          Array<octave_idx_type> iz (nc, 1);
           octave_idx_type *piz = iz.fortran_vec ();
 
           F77_XFCN (sgetrf, SGETRF, (nr, nr, tmp_data, nr, pipvt, info));
@@ -2263,13 +2260,13 @@
       float *tmp_data = atmp.fortran_vec ();
 
       float *pretval = retval.fortran_vec ();
-      Array<float> s (minmn);
+      Array<float> s (minmn, 1);
       float *ps = s.fortran_vec ();
 
       // Ask DGELSD what the dimension of WORK should be.
       octave_idx_type lwork = -1;
 
-      Array<float> work (1);
+      Array<float> work (1, 1);
 
       octave_idx_type smlsiz;
       F77_FUNC (xilaenv, XILAENV) (9, F77_CONST_CHAR_ARG2 ("SGELSD", 6),
@@ -2301,7 +2298,7 @@
       octave_idx_type liwork = 3 * minmn * nlvl + 11 * minmn;
       if (liwork < 1)
         liwork = 1;
-      Array<octave_idx_type> iwork (liwork);
+      Array<octave_idx_type> iwork (liwork, 1);
       octave_idx_type* piwork = iwork.fortran_vec ();
 
       F77_XFCN (sgelsd, SGELSD, (m, n, nrhs, tmp_data, m, pretval, maxmn,
@@ -2346,7 +2343,7 @@
         }
 
       lwork = static_cast<octave_idx_type> (work(0));
-      work.resize (lwork);
+      work.resize (lwork, 1);
 
       F77_XFCN (sgelsd, SGELSD, (m, n, nrhs, tmp_data, m, pretval,
                                  maxmn, ps, rcon, rank,
@@ -2464,13 +2461,13 @@
       float *tmp_data = atmp.fortran_vec ();
 
       float *pretval = retval.fortran_vec ();
-      Array<float> s (minmn);
+      Array<float> s (minmn, 1);
       float *ps = s.fortran_vec ();
 
       // Ask DGELSD what the dimension of WORK should be.
       octave_idx_type lwork = -1;
 
-      Array<float> work (1);
+      Array<float> work (1, 1);
 
       octave_idx_type smlsiz;
       F77_FUNC (xilaenv, XILAENV) (9, F77_CONST_CHAR_ARG2 ("SGELSD", 6),
@@ -2495,7 +2492,7 @@
       octave_idx_type liwork = 3 * minmn * nlvl + 11 * minmn;
       if (liwork < 1)
         liwork = 1;
-      Array<octave_idx_type> iwork (liwork);
+      Array<octave_idx_type> iwork (liwork, 1);
       octave_idx_type* piwork = iwork.fortran_vec ();
 
       F77_XFCN (sgelsd, SGELSD, (m, n, nrhs, tmp_data, m, pretval, maxmn,
@@ -2503,7 +2500,7 @@
                                  lwork, piwork, info));
 
       lwork = static_cast<octave_idx_type> (work(0));
-      work.resize (lwork);
+      work.resize (lwork, 1);
 
       F77_XFCN (sgelsd, SGELSD, (m, n, nrhs, tmp_data, m, pretval,
                                  maxmn, ps, rcon, rank,
@@ -2830,7 +2827,7 @@
 FloatMatrix
 FloatMatrix::diag (octave_idx_type k) const
 {
-  return MArray2<float>::diag (k);
+  return MArray<float>::diag (k);
 }
 
 FloatColumnVector
@@ -2851,7 +2848,7 @@
   if (nr > 0 && nc > 0)
     {
       result.resize (nr);
-      idx_arg.resize (nr);
+      idx_arg.resize (nr, 1);
 
       for (octave_idx_type i = 0; i < nr; i++)
         {
@@ -2906,7 +2903,7 @@
   if (nr > 0 && nc > 0)
     {
       result.resize (nr);
-      idx_arg.resize (nr);
+      idx_arg.resize (nr, 1);
 
       for (octave_idx_type i = 0; i < nr; i++)
         {
@@ -2961,7 +2958,7 @@
   if (nr > 0 && nc > 0)
     {
       result.resize (nc);
-      idx_arg.resize (nc);
+      idx_arg.resize (1, nc);
 
       for (octave_idx_type j = 0; j < nc; j++)
         {
@@ -3016,7 +3013,7 @@
   if (nr > 0 && nc > 0)
     {
       result.resize (nc);
-      idx_arg.resize (nc);
+      idx_arg.resize (1, nc);
 
       for (octave_idx_type j = 0; j < nc; j++)
         {
--- a/liboctave/fMatrix.h
+++ b/liboctave/fMatrix.h
@@ -24,7 +24,8 @@
 #if !defined (octave_FloatMatrix_int_h)
 #define octave_FloatMatrix_int_h 1
 
-#include "MArray2.h"
+#include "Array2.h"
+#include "MArray.h"
 #include "MDiagArray2.h"
 #include "MatrixType.h"
 
@@ -34,7 +35,7 @@
 
 class
 OCTAVE_API
-FloatMatrix : public MArray2<float>
+FloatMatrix : public MArray<float>
 {
 public:
 
@@ -43,26 +44,26 @@
 
   typedef void (*solve_singularity_handler) (float rcon);
 
-  FloatMatrix (void) : MArray2<float> () { }
+  FloatMatrix (void) : MArray<float> () { }
 
-  FloatMatrix (octave_idx_type r, octave_idx_type c) : MArray2<float> (r, c) { }
+  FloatMatrix (octave_idx_type r, octave_idx_type c) : MArray<float> (r, c) { }
 
-  FloatMatrix (octave_idx_type r, octave_idx_type c, float val) : MArray2<float> (r, c, val) { }
+  FloatMatrix (octave_idx_type r, octave_idx_type c, float val) : MArray<float> (r, c, val) { }
 
-  FloatMatrix (const dim_vector& dv) : MArray2<float> (dv) { }
+  FloatMatrix (const dim_vector& dv) : MArray<float> (dv.redim (2)) { }
 
-  FloatMatrix (const dim_vector& dv, float val) : MArray2<float> (dv, val) { }
+  FloatMatrix (const dim_vector& dv, float val) : MArray<float> (dv.redim (2), val) { }
 
-  FloatMatrix (const FloatMatrix& a) : MArray2<float> (a) { }
+  FloatMatrix (const FloatMatrix& a) : MArray<float> (a) { }
 
   template <class U>
-  FloatMatrix (const MArray2<U>& a) : MArray2<float> (a) { }
+  FloatMatrix (const MArray<U>& a) : MArray<float> (a.as_matrix ()) { }
 
   template <class U>
-  FloatMatrix (const Array2<U>& a) : MArray2<float> (a) { }
+  FloatMatrix (const Array2<U>& a) : MArray<float> (a) { }
 
   template <class U>
-  FloatMatrix (const Array<U>& a) : MArray2<float> (a) { }
+  FloatMatrix (const Array<U>& a) : MArray<float> (a.as_matrix ()) { }
 
   explicit FloatMatrix (const FloatRowVector& rv);
 
@@ -79,7 +80,7 @@
 
   FloatMatrix& operator = (const FloatMatrix& a)
     {
-      MArray2<float>::operator = (a);
+      MArray<float>::operator = (a);
       return *this;
     }
 
@@ -113,7 +114,7 @@
 
   friend class FloatComplexMatrix;
 
-  FloatMatrix transpose (void) const { return MArray2<float>::transpose (); }
+  FloatMatrix transpose (void) const { return MArray<float>::transpose (); }
 
   // resize is the destructive equivalent for this one
 
@@ -331,7 +332,7 @@
 
 private:
 
-  FloatMatrix (float *d, octave_idx_type r, octave_idx_type c) : MArray2<float> (d, r, c) { }
+  FloatMatrix (float *d, octave_idx_type r, octave_idx_type c) : MArray<float> (d, r, c) { }
 };
 
 // Publish externally used friend functions.
@@ -377,7 +378,7 @@
 MM_CMP_OP_DECLS (FloatMatrix, FloatMatrix, OCTAVE_API)
 MM_BOOL_OP_DECLS (FloatMatrix, FloatMatrix, OCTAVE_API)
 
-MARRAY_FORWARD_DEFS (MArray2, FloatMatrix, float)
+MARRAY_FORWARD_DEFS (MArray, FloatMatrix, float)
 
 template <class T>
 void read_int (std::istream& is, bool swap_bytes, T& val);
--- a/liboctave/fNDArray.cc
+++ b/liboctave/fNDArray.cc
@@ -46,7 +46,7 @@
 #include "bsxfun-defs.cc"
 
 FloatNDArray::FloatNDArray (const charNDArray& a)
-  : MArrayN<float> (a.dims ())
+  : MArray<float> (a.dims ())
 {
   octave_idx_type n = a.numel ();
   for (octave_idx_type i = 0; i < n; i++)
@@ -898,7 +898,7 @@
 FloatNDArray
 FloatNDArray::diag (octave_idx_type k) const
 {
-  return MArrayN<float>::diag (k);
+  return MArray<float>::diag (k);
 }
 
 // This contains no information on the array structure !!!
--- a/liboctave/fNDArray.h
+++ b/liboctave/fNDArray.h
@@ -24,7 +24,7 @@
 #if !defined (octave_FloatNDArray_h)
 #define octave_FloatNDArray_h 1
 
-#include "MArrayN.h"
+#include "MArray.h"
 #include "fMatrix.h"
 #include "intNDArray.h"
 
@@ -34,37 +34,37 @@
 
 class
 OCTAVE_API
-FloatNDArray : public MArrayN<float>
+FloatNDArray : public MArray<float>
 {
 public:
 
   typedef FloatMatrix matrix_type;
 
-  FloatNDArray (void) : MArrayN<float> () { }
+  FloatNDArray (void) : MArray<float> () { }
 
-  FloatNDArray (const dim_vector& dv) : MArrayN<float> (dv) { }
+  FloatNDArray (const dim_vector& dv) : MArray<float> (dv) { }
 
   FloatNDArray (const dim_vector& dv, float val)
-    : MArrayN<float> (dv, val) { }
+    : MArray<float> (dv, val) { }
   
-  FloatNDArray (const FloatNDArray& a) : MArrayN<float> (a) { }
+  FloatNDArray (const FloatNDArray& a) : MArray<float> (a) { }
 
-  FloatNDArray (const FloatMatrix& a) : MArrayN<float> (a) { }
+  FloatNDArray (const FloatMatrix& a) : MArray<float> (a) { }
 
   template <class U>
-  FloatNDArray (const MArrayN<U>& a) : MArrayN<float> (a) { }
+  FloatNDArray (const MArray<U>& a) : MArray<float> (a) { }
 
   template <class U>
-  FloatNDArray (const Array<U>& a) : MArrayN<float> (a) { }
+  FloatNDArray (const Array<U>& a) : MArray<float> (a) { }
 
   template <class U>
-  explicit FloatNDArray (const intNDArray<U>& a) : MArrayN<float> (a) { }
+  explicit FloatNDArray (const intNDArray<U>& a) : MArray<float> (a) { }
 
   FloatNDArray (const charNDArray&); 
 
   FloatNDArray& operator = (const FloatNDArray& a)
     {
-      MArrayN<float>::operator = (a);
+      MArray<float>::operator = (a);
       return *this;
     }
 
@@ -133,7 +133,7 @@
 
   FloatMatrix matrix_value (void) const;
 
-  FloatNDArray squeeze (void) const { return MArrayN<float>::squeeze (); }
+  FloatNDArray squeeze (void) const { return MArray<float>::squeeze (); }
 
   static void increment_index (Array<octave_idx_type>& ra_idx,
                                const dim_vector& dimensions,
@@ -153,13 +153,13 @@
 
   FloatNDArray& changesign (void) 
     { 
-      MArrayN<float>::changesign (); 
+      MArray<float>::changesign (); 
       return *this; 
     }
 
 private:
 
-  FloatNDArray (float *d, const dim_vector& dv) : MArrayN<float> (d, dv) { }
+  FloatNDArray (float *d, const dim_vector& dv) : MArray<float> (d, dv) { }
 };
 
 // Publish externally used friend functions.
@@ -178,7 +178,7 @@
 NDND_CMP_OP_DECLS (FloatNDArray, FloatNDArray, OCTAVE_API)
 NDND_BOOL_OP_DECLS (FloatNDArray, FloatNDArray, OCTAVE_API)
 
-MARRAY_FORWARD_DEFS (MArrayN, FloatNDArray, float)
+MARRAY_FORWARD_DEFS (MArray, FloatNDArray, float)
 
 BSXFUN_STDOP_DECLS (FloatNDArray, OCTAVE_API)
 BSXFUN_STDREL_DECLS (FloatNDArray, OCTAVE_API)
--- a/liboctave/fRowVector.h
+++ b/liboctave/fRowVector.h
@@ -34,17 +34,18 @@
 {
 public:
 
-  FloatRowVector (void) : MArray<float> () { }
+  FloatRowVector (void) : MArray<float> (1, 0) { }
 
-  explicit FloatRowVector (octave_idx_type n) : MArray<float> (n) { }
+  explicit FloatRowVector (octave_idx_type n) : MArray<float> (1, n) { }
 
-  explicit FloatRowVector (const dim_vector& dv) : MArray<float> (dv) { }
+  explicit FloatRowVector (const dim_vector& dv) : MArray<float> (dv.as_row ()) { }
 
-  FloatRowVector (octave_idx_type n, float val) : MArray<float> (n, val) { }
+  FloatRowVector (octave_idx_type n, float val) : MArray<float> (1, n, val) { }
 
   FloatRowVector (const FloatRowVector& a) : MArray<float> (a) { }
 
-  FloatRowVector (const MArray<float>& a) : MArray<float> (a) { }
+  FloatRowVector (const MArray<float>& a) : MArray<float> (a.as_row ()) { }
+  FloatRowVector (const Array<float>& a) : MArray<float> (a.as_row ()) { }
 
   FloatRowVector& operator = (const FloatRowVector& a)
     {
@@ -89,9 +90,15 @@
   friend OCTAVE_API std::ostream& operator << (std::ostream& os, const FloatRowVector& a);
   friend OCTAVE_API std::istream& operator >> (std::istream& is, FloatRowVector& a);
 
+  void resize (octave_idx_type n, const float& rfv = Array<float>::resize_fill_value ())
+    { Array<float>::resize (1, n, rfv); }
+
+  void clear (octave_idx_type n)
+    { Array<float>::clear (1, n); }
+
 private:
 
-  FloatRowVector (float *d, octave_idx_type l) : MArray<float> (d, l) { }
+  FloatRowVector (float *d, octave_idx_type l) : MArray<float> (d, 1, l) { }
 };
 
 // row vector by column vector -> scalar
--- a/liboctave/floatCHOL.cc
+++ b/liboctave/floatCHOL.cc
@@ -123,9 +123,9 @@
       octave_idx_type spocon_info = 0;
 
       // Now calculate the condition number for non-singular matrix.
-      Array<float> z (3*n);
+      Array<float> z (3*n, 1);
       float *pz = z.fortran_vec ();
-      Array<octave_idx_type> iz (n);
+      Array<octave_idx_type> iz (n, 1);
       octave_idx_type *piz = iz.fortran_vec ();
       F77_XFCN (spocon, SPOCON, (F77_CONST_CHAR_ARG2 ("U", 1), n, h,
                                  n, anorm, xrcond, pz, piz, spocon_info
@@ -416,7 +416,7 @@
   else
     {
       FloatMatrix a = chol_mat.transpose () * chol_mat;
-      Array<octave_idx_type> p (n);
+      Array<octave_idx_type> p (n, 1);
       for (octave_idx_type k = 0; k < n; k++) p(k) = k;
       if (i < j)
         {
--- a/liboctave/floatHESS.cc
+++ b/liboctave/floatHESS.cc
@@ -80,17 +80,17 @@
   hess_mat = a;
   float *h = hess_mat.fortran_vec ();
 
-  Array<float> scale (n);
+  Array<float> scale (n, 1);
   float *pscale = scale.fortran_vec ();
 
   F77_XFCN (sgebal, SGEBAL, (F77_CONST_CHAR_ARG2 (&job, 1),
                              n, h, n, ilo, ihi, pscale, info
                              F77_CHAR_ARG_LEN (1)));
 
-  Array<float> tau (n-1);
+  Array<float> tau (n-1, 1);
   float *ptau = tau.fortran_vec ();
 
-  Array<float> work (lwork);
+  Array<float> work (lwork, 1);
   float *pwork = work.fortran_vec ();
 
   F77_XFCN (sgehrd, SGEHRD, (n, ilo, ihi, h, n, ptau, pwork,
--- a/liboctave/floatLU.cc
+++ b/liboctave/floatLU.cc
@@ -69,7 +69,7 @@
   octave_idx_type a_nc = a.cols ();
   octave_idx_type mn = (a_nr < a_nc ? a_nr : a_nc);
 
-  ipvt.resize (mn);
+  ipvt.resize (mn, 1);
   octave_idx_type *pipvt = ipvt.fortran_vec ();
 
   a_fact = a;
--- a/liboctave/floatQRP.cc
+++ b/liboctave/floatQRP.cc
@@ -65,7 +65,7 @@
   if (m > n && qr_type == qr_type_std)
     afact.resize (m, m);
 
-  MArray<octave_idx_type> jpvt (n, 0);
+  MArray<octave_idx_type> jpvt (n, 1, 0);
 
   if (m > 0)
     {
--- a/liboctave/floatSCHUR.cc
+++ b/liboctave/floatSCHUR.cc
@@ -111,20 +111,20 @@
   float *s = schur_mat.fortran_vec ();
   float *q = unitary_mat.fortran_vec ();
 
-  Array<float> wr (n);
+  Array<float> wr (n, 1);
   float *pwr = wr.fortran_vec ();
 
-  Array<float> wi (n);
+  Array<float> wi (n, 1);
   float *pwi = wi.fortran_vec ();
 
-  Array<float> work (lwork);
+  Array<float> work (lwork, 1);
   float *pwork = work.fortran_vec ();
 
   // BWORK is not referenced for the non-ordered Schur routine.
-  Array<octave_idx_type> bwork ((ord_char == 'N' || ord_char == 'n') ? 0 : n);
+  Array<octave_idx_type> bwork ((ord_char == 'N' || ord_char == 'n') ? 0 : n, 1);
   octave_idx_type *pbwork = bwork.fortran_vec ();
 
-  Array<octave_idx_type> iwork (liwork);
+  Array<octave_idx_type> iwork (liwork, 1);
   octave_idx_type *piwork = iwork.fortran_vec ();
 
   F77_XFCN (sgeesx, SGEESX, (F77_CONST_CHAR_ARG2 (&jobvs, 1),
--- a/liboctave/floatSVD.cc
+++ b/liboctave/floatSVD.cc
@@ -135,7 +135,7 @@
 
   octave_idx_type lwork = -1;
 
-  Array<float> work (1);
+  Array<float> work (1, 1);
 
   octave_idx_type one = 1;
   octave_idx_type m1 = std::max (m, one), nrow_vt1 = std::max (nrow_vt, one);
@@ -148,7 +148,7 @@
                              F77_CHAR_ARG_LEN (1)));
 
   lwork = static_cast<octave_idx_type> (work(0));
-  work.resize (lwork);
+  work.resize (lwork, 1);
 
   F77_XFCN (sgesvd, SGESVD, (F77_CONST_CHAR_ARG2 (&jobu, 1),
                              F77_CONST_CHAR_ARG2 (&jobv, 1),
--- a/liboctave/glob-match.h
+++ b/liboctave/glob-match.h
@@ -74,7 +74,7 @@
   {
     int n = str.length ();
 
-    Array<bool> retval (n);
+    Array<bool> retval (n, 1);
 
     for (int i = 0; i < n; i++)
       retval(i) = match (str[i]);
--- a/liboctave/int16NDArray.h
+++ b/liboctave/int16NDArray.h
@@ -39,7 +39,7 @@
 NDND_CMP_OP_DECLS (int16NDArray, int16NDArray, OCTAVE_API)
 NDND_BOOL_OP_DECLS (int16NDArray, int16NDArray, OCTAVE_API)
 
-MARRAY_FORWARD_DEFS (MArrayN, int16NDArray, octave_int16)
+MARRAY_FORWARD_DEFS (MArray, int16NDArray, octave_int16)
 
 MINMAX_DECLS (int16NDArray, octave_int16, OCTAVE_API)
 
--- a/liboctave/int32NDArray.h
+++ b/liboctave/int32NDArray.h
@@ -39,7 +39,7 @@
 NDND_CMP_OP_DECLS (int32NDArray, int32NDArray, OCTAVE_API)
 NDND_BOOL_OP_DECLS (int32NDArray, int32NDArray, OCTAVE_API)
 
-MARRAY_FORWARD_DEFS (MArrayN, int32NDArray, octave_int32)
+MARRAY_FORWARD_DEFS (MArray, int32NDArray, octave_int32)
 
 MINMAX_DECLS (int32NDArray, octave_int32, OCTAVE_API)
 
--- a/liboctave/int64NDArray.h
+++ b/liboctave/int64NDArray.h
@@ -39,7 +39,7 @@
 NDND_CMP_OP_DECLS (int64NDArray, int64NDArray, OCTAVE_API)
 NDND_BOOL_OP_DECLS (int64NDArray, int64NDArray, OCTAVE_API)
 
-MARRAY_FORWARD_DEFS (MArrayN, int64NDArray, octave_int64)
+MARRAY_FORWARD_DEFS (MArray, int64NDArray, octave_int64)
 
 MINMAX_DECLS (int64NDArray, octave_int64, OCTAVE_API)
 
--- a/liboctave/int8NDArray.h
+++ b/liboctave/int8NDArray.h
@@ -39,7 +39,7 @@
 NDND_CMP_OP_DECLS (int8NDArray, int8NDArray, OCTAVE_API)
 NDND_BOOL_OP_DECLS (int8NDArray, int8NDArray, OCTAVE_API)
 
-MARRAY_FORWARD_DEFS (MArrayN, int8NDArray, octave_int8)
+MARRAY_FORWARD_DEFS (MArray, int8NDArray, octave_int8)
 
 MINMAX_DECLS (int8NDArray, octave_int8, OCTAVE_API)
 
--- a/liboctave/intNDArray.cc
+++ b/liboctave/intNDArray.cc
@@ -66,7 +66,7 @@
 intNDArray<T>
 intNDArray<T>::diag (octave_idx_type k) const
 {
-  return MArrayN<T>::diag (k);
+  return MArray<T>::diag (k);
 }
 
 // FIXME -- this is not quite the right thing.
--- a/liboctave/intNDArray.h
+++ b/liboctave/intNDArray.h
@@ -23,39 +23,39 @@
 #if !defined (octave_intNDArray_h)
 #define octave_intNDArray_h 1
 
-#include "MArrayN.h"
+#include "MArray.h"
 #include "boolNDArray.h"
 class NDArray;
 
 template <class T>
 class
-intNDArray : public MArrayN<T>
+intNDArray : public MArray<T>
 {
 public:
 
-  using MArrayN<T>::element_type;
+  using MArray<T>::element_type;
   
-  intNDArray (void) : MArrayN<T> () { }
+  intNDArray (void) : MArray<T> () { }
 
-  intNDArray (T val) : MArrayN<T> (dim_vector (1, 1), val) { }
+  intNDArray (T val) : MArray<T> (dim_vector (1, 1), val) { }
 
-  intNDArray (const dim_vector& dv) : MArrayN<T> (dv) { }
+  intNDArray (const dim_vector& dv) : MArray<T> (dv) { }
   
   intNDArray (const dim_vector& dv, T val)
-    : MArrayN<T> (dv, val) { }
+    : MArray<T> (dv, val) { }
   
   template <class U>
-  explicit intNDArray (const Array<U>& a) : MArrayN<T> (a) { }
+  intNDArray (const Array<U>& a) : MArray<T> (a) { }
 
   template <class U>
-  intNDArray (const MArrayN<U>& a) : MArrayN<T> (a) { }
+  intNDArray (const MArray<U>& a) : MArray<T> (a) { }
 
   template <class U>
-  intNDArray (const intNDArray<U>& a) : MArrayN<T> (a) { }
+  intNDArray (const intNDArray<U>& a) : MArray<T> (a) { }
 
   intNDArray& operator = (const intNDArray<T>& a)
     {
-      MArrayN<T>::operator = (a);
+      MArray<T>::operator = (a);
       return *this;
     }
 
@@ -68,7 +68,7 @@
 
   intNDArray& changesign (void) 
     { 
-      MArrayN<T>::changesign (); 
+      MArray<T>::changesign (); 
       return *this; 
     }
 
@@ -97,10 +97,10 @@
   intNDArray signum (void) const;
 
   intNDArray squeeze (void) const
-    { return intNDArray<T> (MArrayN<T>::squeeze ()); }
+    { return intNDArray<T> (MArray<T>::squeeze ()); }
 
   intNDArray transpose (void) const
-    { return intNDArray<T> (MArrayN<T>::transpose ()); }
+    { return intNDArray<T> (MArray<T>::transpose ()); }
 
   intNDArray concat (const intNDArray<T>& rb, const Array<octave_idx_type>& ra_idx);
 
@@ -118,7 +118,7 @@
 
 protected:
 
-  intNDArray (T *d, dim_vector& dv) : MArrayN<T> (d, dv) { }
+  intNDArray (T *d, dim_vector& dv) : MArray<T> (d, dv) { }
 };
 
 // i/o
--- a/liboctave/oct-fftw.cc
+++ b/liboctave/oct-fftw.cc
@@ -763,7 +763,7 @@
 {
   dist = (dist < 0 ? npts : dist);
 
-  dim_vector dv (npts);
+  dim_vector dv (npts, 1);
   fftw_plan plan = octave_fftw_planner::create_plan (1, dv, nsamples,
                                                      stride, dist, in, out);
 
@@ -783,7 +783,7 @@
 {
   dist = (dist < 0 ? npts : dist);
 
-  dim_vector dv (npts);
+  dim_vector dv (npts, 1);
   fftw_plan plan = octave_fftw_planner::create_plan (FFTW_FORWARD, 1, dv,
                                                      nsamples, stride,
                                                      dist, in, out);
@@ -801,7 +801,7 @@
 {
   dist = (dist < 0 ? npts : dist);
 
-  dim_vector dv (npts);
+  dim_vector dv (npts, 1);
   fftw_plan plan = octave_fftw_planner::create_plan (FFTW_BACKWARD, 1, dv,
                                                      nsamples, stride,
                                                      dist, in, out);
@@ -891,7 +891,7 @@
 {
   dist = (dist < 0 ? npts : dist);
 
-  dim_vector dv (npts);
+  dim_vector dv (npts, 1);
   fftwf_plan plan = octave_float_fftw_planner::create_plan (1, dv, nsamples,
                                                             stride, dist,
                                                             in, out);
@@ -912,7 +912,7 @@
 {
   dist = (dist < 0 ? npts : dist);
 
-  dim_vector dv (npts);
+  dim_vector dv (npts, 1);
   fftwf_plan plan = octave_float_fftw_planner::create_plan (FFTW_FORWARD, 1,
                                                             dv, nsamples,
                                                             stride, dist,
@@ -931,7 +931,7 @@
 {
   dist = (dist < 0 ? npts : dist);
 
-  dim_vector dv (npts);
+  dim_vector dv (npts, 1);
   fftwf_plan plan = octave_float_fftw_planner::create_plan (FFTW_BACKWARD, 1,
                                                             dv, nsamples,
                                                             stride, dist,
--- a/liboctave/oct-norm.cc
+++ b/liboctave/oct-norm.cc
@@ -224,9 +224,9 @@
 
 // dense versions
 template <class T, class R, class ACC>
-void column_norms (const MArray2<T>& m, MArray<R>& res, ACC acc)
+void column_norms (const MArray<T>& m, MArray<R>& res, ACC acc)
 {
-  res = MArray2<R> (1, m.columns ());
+  res = MArray<R> (1, m.columns ());
   for (octave_idx_type j = 0; j < m.columns (); j++)
     {
       ACC accj = acc;
@@ -238,9 +238,9 @@
 }
 
 template <class T, class R, class ACC>
-void row_norms (const MArray2<T>& m, MArray<R>& res, ACC acc)
+void row_norms (const MArray<T>& m, MArray<R>& res, ACC acc)
 {
-  res = MArray2<R> (m.rows (), 1);
+  res = MArray<R> (m.rows (), 1);
   std::vector<ACC> acci (m.rows (), acc); 
   for (octave_idx_type j = 0; j < m.columns (); j++)
     {
@@ -256,7 +256,7 @@
 template <class T, class R, class ACC>
 void column_norms (const MSparse<T>& m, MArray<R>& res, ACC acc)
 {
-  res = MArray2<R> (1, m.columns ());
+  res = MArray<R> (1, m.columns ());
   for (octave_idx_type j = 0; j < m.columns (); j++)
     {
       ACC accj = acc;
@@ -270,7 +270,7 @@
 template <class T, class R, class ACC>
 void row_norms (const MSparse<T>& m, MArray<R>& res, ACC acc)
 {
-  res = MArray2<R> (m.rows (), 1);
+  res = MArray<R> (m.rows (), 1);
   std::vector<ACC> acci (m.rows (), acc); 
   for (octave_idx_type j = 0; j < m.columns (); j++)
     {
@@ -309,9 +309,8 @@
 }
 
 DEFINE_DISPATCHER (vector_norm, MArray<T>, R)
-DEFINE_DISPATCHER (vector_norm, MArray2<T>, R)
-DEFINE_DISPATCHER (column_norms, MArray2<T>, MArray<R>)
-DEFINE_DISPATCHER (row_norms, MArray2<T>, MArray<R>)
+DEFINE_DISPATCHER (column_norms, MArray<T>, MArray<R>)
+DEFINE_DISPATCHER (row_norms, MArray<T>, MArray<R>)
 DEFINE_DISPATCHER (column_norms, MSparse<T>, MArray<R>)
 DEFINE_DISPATCHER (row_norms, MSparse<T>, MArray<R>)
 
--- a/liboctave/oct-rand.cc
+++ b/liboctave/oct-rand.cc
@@ -425,7 +425,7 @@
 
   if (n > 0)
     {
-      retval.clear (n);
+      retval.clear (n, 1);
 
       fill (retval.capacity (), retval.fortran_vec (), a);
     }
--- a/liboctave/regex-match.cc
+++ b/liboctave/regex-match.cc
@@ -140,7 +140,7 @@
 {
   int n = s.length ();
 
-  Array<bool> retval (n);
+  Array<bool> retval (n, 1);
 
   for (int i = 0; i < n; i++)
     retval(i) = match (s[i]);
--- a/liboctave/sparse-dmsolve.cc
+++ b/liboctave/sparse-dmsolve.cc
@@ -26,7 +26,7 @@
 
 #include <vector>
 
-#include "MArray2.h"
+#include "MArray.h"
 #include "MSparse.h"
 #include "SparseQR.h"
 #include "SparseCmplxQR.h"
@@ -116,8 +116,8 @@
 #endif
 
 template <class T>
-static MArray2<T>
-dmsolve_extract (const MArray2<T> &m, const octave_idx_type *, 
+static MArray<T>
+dmsolve_extract (const MArray<T> &m, const octave_idx_type *, 
                  const octave_idx_type *, octave_idx_type r1, 
                  octave_idx_type r2, octave_idx_type c1, 
                  octave_idx_type c2)
@@ -130,7 +130,7 @@
   octave_idx_type new_r = r2 - r1 + 1;
   octave_idx_type new_c = c2 - c1 + 1;
 
-  MArray2<T> result (new_r, new_c);
+  MArray<T> result (new_r, new_c);
 
   for (octave_idx_type j = 0; j < new_c; j++)
     for (octave_idx_type i = 0; i < new_r; i++)
@@ -140,14 +140,14 @@
 }
 
 #if !defined (CXX_NEW_FRIEND_TEMPLATE_DECL)
-static MArray2<double>
-dmsolve_extract (const MArray2<double> &m, const octave_idx_type *, 
+static MArray<double>
+dmsolve_extract (const MArray<double> &m, const octave_idx_type *, 
                  const octave_idx_type *, octave_idx_type r1, 
                  octave_idx_type r2, octave_idx_type c1, 
                  octave_idx_type c2)
 
-static MArray2<Complex>
-dmsolve_extract (const MArray2<Complex> &m, const octave_idx_type *, 
+static MArray<Complex>
+dmsolve_extract (const MArray<Complex> &m, const octave_idx_type *, 
                  const octave_idx_type *, octave_idx_type r1, 
                  octave_idx_type r2, octave_idx_type c1, 
                  octave_idx_type c2)
@@ -155,7 +155,7 @@
 
 template <class T>
 static void
-dmsolve_insert (MArray2<T> &a, const MArray2<T> &b, const octave_idx_type *Q,
+dmsolve_insert (MArray<T> &a, const MArray<T> &b, const octave_idx_type *Q,
                octave_idx_type r, octave_idx_type c)
 {
   T *ax = a.fortran_vec();
@@ -177,11 +177,11 @@
 
 #if !defined (CXX_NEW_FRIEND_TEMPLATE_DECL)
 static void
-dmsolve_insert (MArray2<double> &a, const MArray2<double> &b, 
+dmsolve_insert (MArray<double> &a, const MArray<double> &b, 
                const octave_idx_type *Q, octave_idx_type r, octave_idx_type c);
 
 static void
-dmsolve_insert (MArray2<Complex> &a, const MArray2<Complex> &b,
+dmsolve_insert (MArray<Complex> &a, const MArray<Complex> &b,
                const octave_idx_type *Q, octave_idx_type r, octave_idx_type c);
 #endif
 
@@ -274,7 +274,7 @@
 
 template <class T, class RT>
 static void
-dmsolve_permute (MArray2<RT> &a, const MArray2<T>& b, const octave_idx_type *p)
+dmsolve_permute (MArray<RT> &a, const MArray<T>& b, const octave_idx_type *p)
 {
   octave_idx_type b_nr = b.rows ();
   octave_idx_type b_nc = b.cols ();
@@ -294,15 +294,15 @@
 
 #if !defined (CXX_NEW_FRIEND_TEMPLATE_DECL)
 static void
-dmsolve_permute (MArray2<double> &a, const MArray2<double>& b,
+dmsolve_permute (MArray<double> &a, const MArray<double>& b,
                  const octave_idx_type *p);
 
 static void
-dmsolve_permute (MArray2<Complex> &a, const MArray2<double>& b,
+dmsolve_permute (MArray<Complex> &a, const MArray<double>& b,
                  const octave_idx_type *p);
 
 static void
-dmsolve_permute (MArray2<Complex> &a, const MArray2<Complex>& b,
+dmsolve_permute (MArray<Complex> &a, const MArray<Complex>& b,
                  const octave_idx_type *p);
 #endif
 
--- a/liboctave/str-vec.cc
+++ b/liboctave/str-vec.cc
@@ -95,7 +95,7 @@
 // nonnegative.
 
 string_vector::string_vector (const char * const *s, octave_idx_type n)
-  : Array<std::string> (n)
+  : Array<std::string> (1, n)
 {
   for (octave_idx_type i = 0; i < n; i++)
     elem (i) = s[i];
--- a/liboctave/str-vec.h
+++ b/liboctave/str-vec.h
@@ -39,11 +39,11 @@
 
   string_vector (void) : Array<std::string> () { }
 
-  explicit string_vector (octave_idx_type n) : Array<std::string> (n) { }
+  explicit string_vector (octave_idx_type n) : Array<std::string> (1, n) { }
 
-  string_vector (const char *s) : Array<std::string> (1, s) { }
+  string_vector (const char *s) : Array<std::string> (1, 1, s) { }
 
-  string_vector (const std::string& s) : Array<std::string> (1, s) { }
+  string_vector (const std::string& s) : Array<std::string> (1, 1, s) { }
 
   string_vector (const string_vector& s) : Array<std::string> (s) { }
 
@@ -83,6 +83,9 @@
     return longest;
   }
 
+  void resize (octave_idx_type n, const std::string& rfv = resize_fill_value ())
+    { Array<std::string>::resize (1, n, rfv); }
+
   std::string& operator[] (octave_idx_type i) { return Array<std::string>::elem (i); }
 
   std::string operator[] (octave_idx_type i) const { return Array<std::string>::elem (i); }
--- a/liboctave/uint16NDArray.h
+++ b/liboctave/uint16NDArray.h
@@ -39,7 +39,7 @@
 NDND_CMP_OP_DECLS (uint16NDArray, uint16NDArray, OCTAVE_API)
 NDND_BOOL_OP_DECLS (uint16NDArray, uint16NDArray, OCTAVE_API)
 
-MARRAY_FORWARD_DEFS (MArrayN, uint16NDArray, octave_uint16)
+MARRAY_FORWARD_DEFS (MArray, uint16NDArray, octave_uint16)
 
 MINMAX_DECLS (uint16NDArray, octave_uint16, OCTAVE_API)
 
--- a/liboctave/uint32NDArray.h
+++ b/liboctave/uint32NDArray.h
@@ -39,7 +39,7 @@
 NDND_CMP_OP_DECLS (uint32NDArray, uint32NDArray, OCTAVE_API)
 NDND_BOOL_OP_DECLS (uint32NDArray, uint32NDArray, OCTAVE_API)
 
-MARRAY_FORWARD_DEFS (MArrayN, uint32NDArray, octave_uint32)
+MARRAY_FORWARD_DEFS (MArray, uint32NDArray, octave_uint32)
 
 MINMAX_DECLS (uint32NDArray, octave_uint32, OCTAVE_API)
 
--- a/liboctave/uint64NDArray.h
+++ b/liboctave/uint64NDArray.h
@@ -39,7 +39,7 @@
 NDND_CMP_OP_DECLS (uint64NDArray, uint64NDArray, OCTAVE_API)
 NDND_BOOL_OP_DECLS (uint64NDArray, uint64NDArray, OCTAVE_API)
 
-MARRAY_FORWARD_DEFS (MArrayN, uint64NDArray, octave_uint64)
+MARRAY_FORWARD_DEFS (MArray, uint64NDArray, octave_uint64)
 
 MINMAX_DECLS (uint64NDArray, octave_uint64, OCTAVE_API)
 
--- a/liboctave/uint8NDArray.h
+++ b/liboctave/uint8NDArray.h
@@ -39,7 +39,7 @@
 NDND_CMP_OP_DECLS (uint8NDArray, uint8NDArray, OCTAVE_API)
 NDND_BOOL_OP_DECLS (uint8NDArray, uint8NDArray, OCTAVE_API)
 
-MARRAY_FORWARD_DEFS (MArrayN, uint8NDArray, octave_uint8)
+MARRAY_FORWARD_DEFS (MArray, uint8NDArray, octave_uint8)
 
 MINMAX_DECLS (uint8NDArray, octave_uint8, OCTAVE_API)
 
--- a/src/Cell.cc
+++ b/src/Cell.cc
@@ -175,7 +175,7 @@
 
     default:
       {
-        Array<idx_vector> iv (n);
+        Array<idx_vector> iv (n, 1);
 
         for (octave_idx_type i = 0; i < n; i++)
           {
@@ -202,7 +202,7 @@
 {
   octave_idx_type len = idx_arg.length ();
 
-  Array<idx_vector> ra_idx (len);
+  Array<idx_vector> ra_idx (len, 1);
 
   for (octave_idx_type i = 0; i < len; i++)
     ra_idx(i) = idx_arg(i).index_vector ();
@@ -218,7 +218,7 @@
 {
   octave_idx_type len = idx_arg.length ();
 
-  Array<idx_vector> ra_idx (len);
+  Array<idx_vector> ra_idx (len, 1);
 
   for (octave_idx_type i = 0; i < len; i++)
     ra_idx.xelem (i) = idx_arg(i).index_vector ();
--- a/src/ChangeLog
+++ b/src/ChangeLog
@@ -1,3 +1,39 @@
+2010-02-23  Jaroslav Hajek  <highegg@gmail.com>
+
+	* Cell.cc: Reflect Array API changes.
+	* DLD-FUNCTIONS/__convn__.cc: Ditto.
+	* DLD-FUNCTIONS/__glpk__.cc: Ditto.
+	* DLD-FUNCTIONS/__magick_read__.cc: Ditto.
+	* DLD-FUNCTIONS/bsxfun.cc: Ditto.
+	* DLD-FUNCTIONS/cellfun.cc: Ditto.
+	* DLD-FUNCTIONS/conv2.cc: Ditto.
+	* DLD-FUNCTIONS/dlmread.cc: Ditto.
+	* DLD-FUNCTIONS/filter.cc: Ditto.
+	* DLD-FUNCTIONS/kron.cc: Ditto.
+	* DLD-FUNCTIONS/qz.cc: Ditto.
+	* DLD-FUNCTIONS/regexp.cc: Ditto.
+	* DLD-FUNCTIONS/sub2ind.cc: Ditto.
+	* data.cc: Ditto.
+	* file-io.cc: Ditto.
+	* gl-render.cc: Ditto.
+	* ls-mat5.cc: Ditto.
+	* oct-map.cc: Ditto.
+	* oct-obj.h: Ditto.
+	* oct-parse.yy: Ditto.
+	* oct-stream.cc: Ditto.
+	* ov-base-mat.cc: Ditto.
+	* ov-base-sparse.cc: Ditto.
+	* ov-perm.cc: Ditto.
+	* ov-struct.cc: Ditto.
+	* ov-typeinfo.cc: Ditto.
+	* ov-typeinfo.h: Ditto.
+	* ov.cc: Ditto.
+	* pr-output.cc: Ditto.
+	* pt-mat.cc: Ditto.
+	* strfns.cc: Ditto.
+	* txt-eng-ft.cc: Ditto.
+	* variables.cc: Ditto.
+
 2010-02-22  John W. Eaton  <jwe@octave.org>
 
 	* ls-mat5.cc: Use numel instead of nelem consistently and where
--- a/src/DLD-FUNCTIONS/__convn__.cc
+++ b/src/DLD-FUNCTIONS/__convn__.cc
@@ -91,7 +91,7 @@
   const octave_idx_type out_numel = out.numel ();
   
   // Iterate over every element of 'out'.
-  dim_vector idx_dim (ndims);
+  dim_vector idx_dim (ndims, 1);
 
   Array<octave_idx_type> a_idx (idx_dim);
   Array<octave_idx_type> b_idx (idx_dim);
--- a/src/DLD-FUNCTIONS/__glpk__.cc
+++ b/src/DLD-FUNCTIONS/__glpk__.cc
@@ -520,8 +520,8 @@
       mrowsA = A.rows ();
       octave_idx_type Anc = A.cols ();
       octave_idx_type Anz = A.nzmax ();
-      rn.resize (Anz+1);
-      cn.resize (Anz+1);
+      rn.resize (Anz+1, 1);
+      cn.resize (Anz+1, 1);
       a.resize (Anz+1, 0.0);
 
       if (Anc != mrowsc)
@@ -550,8 +550,8 @@
         }
 
       mrowsA = A.rows ();
-      rn.resize (mrowsA*mrowsc+1);
-      cn.resize (mrowsA*mrowsc+1);
+      rn.resize (mrowsA*mrowsc+1, 1);
+      cn.resize (mrowsA*mrowsc+1, 1);
       a.resize (mrowsA*mrowsc+1, 0.0);
 
       for (int i = 0; i < mrowsA; i++)
@@ -595,7 +595,7 @@
   double *lb = LB.fortran_vec ();
 
   //-- LB argument, default: Free
-  Array<int> freeLB (mrowsc);
+  Array<int> freeLB (mrowsc, 1);
   for (int i = 0; i < mrowsc; i++)
      {
        if (xisinf (lb[i]))
@@ -619,7 +619,7 @@
 
   double *ub = UB.fortran_vec ();
 
-  Array<int> freeUB (mrowsc);
+  Array<int> freeUB (mrowsc, 1);
   for (int i = 0; i < mrowsc; i++)
     {
       if (xisinf (ub[i]))
@@ -652,7 +652,7 @@
       return retval;
     }
 
-  Array<int> vartype (mrowsc);
+  Array<int> vartype (mrowsc, 1);
   volatile int isMIP = 0;
   for (int i = 0; i < mrowsc ; i++)
     {
--- a/src/DLD-FUNCTIONS/__magick_read__.cc
+++ b/src/DLD-FUNCTIONS/__magick_read__.cc
@@ -56,7 +56,7 @@
   idim(2) = 1;
   idim(3) = nframes;
 
-  Array<int> idx (dim_vector (4));
+  Array<int> idx (dim_vector (4, 1));
 
   Magick::ImageType type = imvec[0].type ();
 
@@ -396,7 +396,7 @@
     frameidx = args(1).int_vector_value();
   else
     {
-      frameidx = Array<int> (1);
+      frameidx = Array<int> (1, 1);
       frameidx(0) = 1;
     }
 
@@ -534,7 +534,7 @@
   if (dsizes.length () == 4)
     nframes = dsizes(3);
 
-  Array<octave_idx_type> idx (dsizes.length ());
+  Array<octave_idx_type> idx (dsizes.length (), 1);
 
   octave_idx_type rows = m.rows ();
   octave_idx_type columns = m.columns ();
@@ -593,7 +593,7 @@
   bool is_color = ((dsizes.length () > 2) && (dsizes(2) > 2));
   bool has_alpha = (dsizes.length () > 2 && (dsizes(2) == 2 || dsizes(2) == 4));
 
-  Array<octave_idx_type> idx (dsizes.length ());
+  Array<octave_idx_type> idx (dsizes.length (), 1);
   octave_idx_type rows = m.rows ();
   octave_idx_type columns = m.columns ();
 
--- a/src/DLD-FUNCTIONS/bsxfun.cc
+++ b/src/DLD-FUNCTIONS/bsxfun.cc
@@ -439,7 +439,7 @@
                   octave_value_list idxB;
                   octave_value C;
                   octave_value_list inputs;
-                  Array<int> ra_idx (dvc.length(), 0);
+                  Array<int> ra_idx (dvc.length(), 1, 0);
 
 
                   for (octave_idx_type i = 0; i < ncount; i++)
--- a/src/DLD-FUNCTIONS/cellfun.cc
+++ b/src/DLD-FUNCTIONS/cellfun.cc
@@ -1030,7 +1030,7 @@
 
   OCTAVE_LOCAL_BUFFER_INIT (bool, sing, maxd, false);
 
-  perm.clear (maxd);
+  perm.clear (maxd, 1);
   for (int i = 0; i < dvl; i++)
     {
       int k = dimv(i) - 1;
@@ -1475,7 +1475,7 @@
         dim = dv.first_non_singleton ();
       ndims = std::max (ndims, dim + 1);
 
-      Array<idx_vector> idx (ndims, idx_vector::colon);
+      Array<idx_vector> idx (ndims, 1, idx_vector::colon);
 
       for (octave_idx_type i = 0; i < n && ! error_state; i++)
         {
--- a/src/DLD-FUNCTIONS/conv2.cc
+++ b/src/DLD-FUNCTIONS/conv2.cc
@@ -35,22 +35,22 @@
 enum Shape { SHAPE_FULL, SHAPE_SAME, SHAPE_VALID };
 
 #if !defined (CXX_NEW_FRIEND_TEMPLATE_DECL)
-extern MArray2<double>
-conv2 (MArray<double>&, MArray<double>&, MArray2<double>&, Shape);
+extern MArray<double>
+conv2 (MArray<double>&, MArray<double>&, MArray<double>&, Shape);
 
-extern MArray2<Complex>
-conv2 (MArray<Complex>&, MArray<Complex>&, MArray2<Complex>&, Shape);
+extern MArray<Complex>
+conv2 (MArray<Complex>&, MArray<Complex>&, MArray<Complex>&, Shape);
 
-extern MArray2<float>
-conv2 (MArray<float>&, MArray<float>&, MArray2<float>&, Shape);
+extern MArray<float>
+conv2 (MArray<float>&, MArray<float>&, MArray<float>&, Shape);
 
-extern MArray2<FloatComplex>
-conv2 (MArray<FloatComplex>&, MArray<FloatComplex>&, MArray2<FloatComplex>&, Shape);
+extern MArray<FloatComplex>
+conv2 (MArray<FloatComplex>&, MArray<FloatComplex>&, MArray<FloatComplex>&, Shape);
 #endif
 
 template <class T>
-MArray2<T>
-conv2 (MArray<T>& R, MArray<T>& C, MArray2<T>& A, Shape ishape)
+MArray<T>
+conv2 (MArray<T>& R, MArray<T>& C, MArray<T>& A, Shape ishape)
 {
   octave_idx_type  Rn =  R.length ();
   octave_idx_type  Cm =  C.length ();
@@ -98,14 +98,14 @@
         error ("conv2: invalid value of parameter ishape");
     }
 
-  MArray2<T> O (outM, outN);
+  MArray<T> O (outM, outN);
 
   // X accumulates the 1-D conv for each row, before calculating
   //    the convolution in the other direction
   // There is no efficiency advantage to doing it in either direction
   //     first
 
-  MArray<T> X (An);
+  MArray<T> X (An, 1);
 
   for (octave_idx_type oi = 0; oi < outM; oi++)
     {
@@ -143,22 +143,22 @@
 }
 
 #if !defined (CXX_NEW_FRIEND_TEMPLATE_DECL)
-extern MArray2<double>
-conv2 (MArray2<double>&, MArray2<double>&, Shape);
+extern MArray<double>
+conv2 (MArray<double>&, MArray<double>&, Shape);
 
-extern MArray2<Complex>
-conv2 (MArray2<Complex>&, MArray2<Complex>&, Shape);
+extern MArray<Complex>
+conv2 (MArray<Complex>&, MArray<Complex>&, Shape);
 
-extern MArray2<float>
-conv2 (MArray2<float>&, MArray2<float>&, Shape);
+extern MArray<float>
+conv2 (MArray<float>&, MArray<float>&, Shape);
 
-extern MArray2<FloatComplex>
-conv2 (MArray2<FloatComplex>&, MArray2<FloatComplex>&, Shape);
+extern MArray<FloatComplex>
+conv2 (MArray<FloatComplex>&, MArray<FloatComplex>&, Shape);
 #endif
 
 template <class T>
-MArray2<T>
-conv2 (MArray2<T>&A, MArray2<T>&B, Shape ishape)
+MArray<T>
+conv2 (MArray<T>&A, MArray<T>&B, Shape ishape)
 {
   // Convolution works fastest if we choose the A matrix to be
   // the largest.
@@ -208,7 +208,7 @@
         break;
     }
 
-  MArray2<T> O (outM, outN);
+  MArray<T> O (outM, outN);
 
   for (octave_idx_type oi = 0; oi < outM; oi++)
     {
@@ -418,14 +418,14 @@
    return retval;
 }
 
-template MArray2<double>
-conv2 (MArray<double>&, MArray<double>&, MArray2<double>&, Shape);
+template MArray<double>
+conv2 (MArray<double>&, MArray<double>&, MArray<double>&, Shape);
 
-template MArray2<double>
-conv2 (MArray2<double>&, MArray2<double>&, Shape);
+template MArray<double>
+conv2 (MArray<double>&, MArray<double>&, Shape);
 
-template MArray2<Complex>
-conv2 (MArray<Complex>&, MArray<Complex>&, MArray2<Complex>&, Shape);
+template MArray<Complex>
+conv2 (MArray<Complex>&, MArray<Complex>&, MArray<Complex>&, Shape);
 
-template MArray2<Complex>
-conv2 (MArray2<Complex>&, MArray2<Complex>&, Shape);
+template MArray<Complex>
+conv2 (MArray<Complex>&, MArray<Complex>&, Shape);
--- a/src/DLD-FUNCTIONS/dlmread.cc
+++ b/src/DLD-FUNCTIONS/dlmread.cc
@@ -304,9 +304,9 @@
                   // Use resize_and_fill for the case of not-equal
                   // length rows.
                   if (iscmplx)
-                    cdata.resize_fill (r, c, 0);
+                    cdata.resize (r, c, 0);
                   else
-                    rdata.resize_fill (r, c, 0);
+                    rdata.resize (r, c, 0);
                   rmax = r;
                   cmax = c;
                 }
--- a/src/DLD-FUNCTIONS/filter.cc
+++ b/src/DLD-FUNCTIONS/filter.cc
@@ -40,34 +40,34 @@
 #include "oct-obj.h"
 
 #if !defined (CXX_NEW_FRIEND_TEMPLATE_DECL)
-extern MArrayN<double>
-filter (MArray<double>&, MArray<double>&, MArrayN<double>&, int dim);
+extern MArray<double>
+filter (MArray<double>&, MArray<double>&, MArray<double>&, int dim);
 
-extern MArrayN<Complex>
-filter (MArray<Complex>&, MArray<Complex>&, MArrayN<Complex>&, int dim);
+extern MArray<Complex>
+filter (MArray<Complex>&, MArray<Complex>&, MArray<Complex>&, int dim);
 
-extern MArrayN<float>
-filter (MArray<float>&, MArray<float>&, MArrayN<float>&, int dim);
+extern MArray<float>
+filter (MArray<float>&, MArray<float>&, MArray<float>&, int dim);
 
-extern MArrayN<FloatComplex>
-filter (MArray<FloatComplex>&, MArray<FloatComplex>&, MArrayN<FloatComplex>&, int dim);
+extern MArray<FloatComplex>
+filter (MArray<FloatComplex>&, MArray<FloatComplex>&, MArray<FloatComplex>&, int dim);
 #endif
 
 template <class T>
-MArrayN<T>
-filter (MArray<T>& b, MArray<T>& a, MArrayN<T>& x, MArrayN<T>& si, 
+MArray<T>
+filter (MArray<T>& b, MArray<T>& a, MArray<T>& x, MArray<T>& si, 
         int dim = 0)
 {
-  MArrayN<T> y;
+  MArray<T> y;
 
   octave_idx_type a_len  = a.length ();
   octave_idx_type b_len  = b.length ();
 
   octave_idx_type ab_len = a_len > b_len ? a_len : b_len;
 
-  b.resize (ab_len, 0.0);
+  b.resize (ab_len, 1, 0.0);
   if (a_len > 1)
-    a.resize (ab_len, 0.0);
+    a.resize (ab_len, 1, 0.0);
 
   T norm = a (0);
 
@@ -227,26 +227,26 @@
 }
 
 #if !defined (CXX_NEW_FRIEND_TEMPLATE_DECL)
-extern MArrayN<double>
-filter (MArray<double>&, MArray<double>&, MArrayN<double>&,
-        MArrayN<double>&, int dim);
+extern MArray<double>
+filter (MArray<double>&, MArray<double>&, MArray<double>&,
+        MArray<double>&, int dim);
 
-extern MArrayN<Complex>
-filter (MArray<Complex>&, MArray<Complex>&, MArrayN<Complex>&,
-        MArrayN<Complex>&, int dim);
+extern MArray<Complex>
+filter (MArray<Complex>&, MArray<Complex>&, MArray<Complex>&,
+        MArray<Complex>&, int dim);
 
-extern MArrayN<float>
-filter (MArray<float>&, MArray<float>&, MArrayN<float>&,
-        MArrayN<float>&, int dim);
+extern MArray<float>
+filter (MArray<float>&, MArray<float>&, MArray<float>&,
+        MArray<float>&, int dim);
 
-extern MArrayN<FloatComplex>
-filter (MArray<FloatComplex>&, MArray<FloatComplex>&, MArrayN<FloatComplex>&,
-        MArrayN<FloatComplex>&, int dim);
+extern MArray<FloatComplex>
+filter (MArray<FloatComplex>&, MArray<FloatComplex>&, MArray<FloatComplex>&,
+        MArray<FloatComplex>&, int dim);
 #endif
 
 template <class T>
-MArrayN<T>
-filter (MArray<T>& b, MArray<T>& a, MArrayN<T>& x, int dim = -1)
+MArray<T>
+filter (MArray<T>& b, MArray<T>& a, MArray<T>& x, int dim = -1)
 {
   dim_vector x_dims = x.dims();
 
@@ -264,7 +264,7 @@
     if (dim < 0 || dim > x_dims.length ())
       {
         error ("filter: filtering over invalid dimension");
-        return MArrayN<T> ();
+        return MArray<T> ();
       }
 
   octave_idx_type a_len = a.length ();
@@ -276,7 +276,7 @@
     si_dims(i) = si_dims(i-1);
   si_dims(0) = si_len;
   
-  MArrayN<T> si (si_dims, T (0.0));
+  MArray<T> si (si_dims, T (0.0));
 
   return filter (b, a, x, si, dim);
 }
@@ -654,33 +654,33 @@
   return retval;
 }
 
-template MArrayN<double>
-filter (MArray<double>&, MArray<double>&, MArrayN<double>&,
-        MArrayN<double>&, int dim);
+template MArray<double>
+filter (MArray<double>&, MArray<double>&, MArray<double>&,
+        MArray<double>&, int dim);
 
-template MArrayN<double>
-filter (MArray<double>&, MArray<double>&, MArrayN<double>&, int dim);
+template MArray<double>
+filter (MArray<double>&, MArray<double>&, MArray<double>&, int dim);
 
-template MArrayN<Complex>
-filter (MArray<Complex>&, MArray<Complex>&, MArrayN<Complex>&,
-        MArrayN<Complex>&, int dim);
+template MArray<Complex>
+filter (MArray<Complex>&, MArray<Complex>&, MArray<Complex>&,
+        MArray<Complex>&, int dim);
 
-template MArrayN<Complex>
-filter (MArray<Complex>&, MArray<Complex>&, MArrayN<Complex>&, int dim);
+template MArray<Complex>
+filter (MArray<Complex>&, MArray<Complex>&, MArray<Complex>&, int dim);
 
-template MArrayN<float>
-filter (MArray<float>&, MArray<float>&, MArrayN<float>&,
-        MArrayN<float>&, int dim);
+template MArray<float>
+filter (MArray<float>&, MArray<float>&, MArray<float>&,
+        MArray<float>&, int dim);
 
-template MArrayN<float>
-filter (MArray<float>&, MArray<float>&, MArrayN<float>&, int dim);
+template MArray<float>
+filter (MArray<float>&, MArray<float>&, MArray<float>&, int dim);
 
-template MArrayN<FloatComplex>
-filter (MArray<FloatComplex>&, MArray<FloatComplex>&, MArrayN<FloatComplex>&,
-        MArrayN<FloatComplex>&, int dim);
+template MArray<FloatComplex>
+filter (MArray<FloatComplex>&, MArray<FloatComplex>&, MArray<FloatComplex>&,
+        MArray<FloatComplex>&, int dim);
 
-template MArrayN<FloatComplex>
-filter (MArray<FloatComplex>&, MArray<FloatComplex>&, MArrayN<FloatComplex>&, int dim);
+template MArray<FloatComplex>
+filter (MArray<FloatComplex>&, MArray<FloatComplex>&, MArray<FloatComplex>&, int dim);
 
 /*
 %!shared a, b, x, r
--- a/src/DLD-FUNCTIONS/kron.cc
+++ b/src/DLD-FUNCTIONS/kron.cc
@@ -36,22 +36,22 @@
 
 #if !defined (CXX_NEW_FRIEND_TEMPLATE_DECL)
 extern void
-kron (const Array2<double>&, const Array2<double>&, Array2<double>&);
+kron (const Array<double>&, const Array<double>&, Array<double>&);
 
 extern void
-kron (const Array2<Complex>&, const Array2<Complex>&, Array2<Complex>&);
+kron (const Array<Complex>&, const Array<Complex>&, Array<Complex>&);
 
 extern void
-kron (const Array2<float>&, const Array2<float>&, Array2<float>&);
+kron (const Array<float>&, const Array<float>&, Array<float>&);
 
 extern void
-kron (const Array2<FlaotComplex>&, const Array2<FloatComplex>&, 
-      Array2<FloatComplex>&);
+kron (const Array<FlaotComplex>&, const Array<FloatComplex>&, 
+      Array<FloatComplex>&);
 #endif
 
 template <class T>
 void
-kron (const Array2<T>& A, const Array2<T>& B, Array2<T>& C)
+kron (const Array<T>& A, const Array<T>& B, Array<T>& C)
 {
   C.resize (A.rows () * B.rows (), A.columns () * B.columns ());
 
@@ -71,17 +71,17 @@
 }
 
 template void
-kron (const Array2<double>&, const Array2<double>&, Array2<double>&);
+kron (const Array<double>&, const Array<double>&, Array<double>&);
 
 template void
-kron (const Array2<Complex>&, const Array2<Complex>&, Array2<Complex>&);
+kron (const Array<Complex>&, const Array<Complex>&, Array<Complex>&);
 
 template void
-kron (const Array2<float>&, const Array2<float>&, Array2<float>&);
+kron (const Array<float>&, const Array<float>&, Array<float>&);
 
 template void
-kron (const Array2<FloatComplex>&, const Array2<FloatComplex>&, 
-      Array2<FloatComplex>&);
+kron (const Array<FloatComplex>&, const Array<FloatComplex>&, 
+      Array<FloatComplex>&);
 
 #if !defined (CXX_NEW_FRIEND_TEMPLATE_DECL)
 extern void
--- a/src/DLD-FUNCTIONS/qz.cc
+++ b/src/DLD-FUNCTIONS/qz.cc
@@ -862,7 +862,7 @@
           std::cout << std::endl;
 #endif
 
-          Array<octave_idx_type> ind (nn);
+          Array<octave_idx_type> ind (nn, 1);
 
           F77_XFCN (dsubsp, DSUBSP,
                     (nn, nn, aa.fortran_vec (), bb.fortran_vec (),
--- a/src/DLD-FUNCTIONS/regexp.cc
+++ b/src/DLD-FUNCTIONS/regexp.cc
@@ -237,14 +237,14 @@
               for (int i = 0; i < nnames; i++)
                 if (named(i) == tmp_name)
                   {
-                    named_idx.resize(inames+1);
+                    named_idx.resize(inames+1, 1);
                     named_idx(inames) = i;
                     found = true;
                     break;
                   }
               if (! found)
                 {
-                  named_idx.resize(inames+1);
+                  named_idx.resize(inames+1, 1);
                   named_idx(inames) = nnames;
                   named.append(tmp_name);
                   nnames++;
--- a/src/DLD-FUNCTIONS/sub2ind.cc
+++ b/src/DLD-FUNCTIONS/sub2ind.cc
@@ -89,7 +89,7 @@
   else
     {
       dim_vector dv = get_dim_vector (args(0), "sub2ind");
-      Array<idx_vector> idxa (nargin - 1);
+      Array<idx_vector> idxa (nargin - 1, 1);
 
       if (! error_state)
         {
--- a/src/data.cc
+++ b/src/data.cc
@@ -1892,7 +1892,7 @@
   do \
     { \
       int dv_len = dv.length (); \
-      Array<octave_idx_type> ra_idx (dv_len > 1 ? dv_len : 2, 0); \
+      Array<octave_idx_type> ra_idx (dv_len > 1 ? dv_len : 2, 1, 0); \
       \
       for (int j = 1; j < n_args; j++) \
         { \
@@ -2073,7 +2073,7 @@
                 return retval;
 
               int dv_len = dv.length ();
-              Array<octave_idx_type> ra_idx (dv_len, 0);
+              Array<octave_idx_type> ra_idx (dv_len, 1, 0);
 
               for (int j = 1; j < n_args; j++)
                 {
@@ -4835,7 +4835,7 @@
     new_size = args(1).int_vector_value ();
   else if (nargin > 2)
     {
-      new_size.resize (nargin-1);
+      new_size.resize (1, nargin-1);
       int empty_dim = -1;
       
       for (int i = 1; i < nargin; i++)
@@ -4904,8 +4904,6 @@
         break;
     }
 
-  new_size.resize (n);
-
   if (n < 2)
     {
       error ("reshape: expecting size to be vector with at least 2 elements");
@@ -6368,8 +6366,8 @@
   NDT retval (dim_vector (n, 1), zero_val);
 
   // Pick minimizer or maximizer.
-  void (MArrayN<T>::*op) (const idx_vector&, const MArrayN<T>&) = 
-    ismin ? (&MArrayN<T>::idx_min) : (&MArrayN<T>::idx_max);
+  void (MArray<T>::*op) (const idx_vector&, const MArray<T>&) = 
+    ismin ? (&MArray<T>::idx_min) : (&MArray<T>::idx_max);
 
   octave_idx_type l = idx.length (n);
   if (vals.numel () == 1)
--- a/src/file-io.cc
+++ b/src/file-io.cc
@@ -1149,7 +1149,7 @@
 
                   Array<double> size = (nargin == 3)
                     ? args(2).vector_value ()
-                    : Array<double> (1, lo_ieee_inf_value ());
+                    : Array<double> (1, 1, lo_ieee_inf_value ());
 
                   if (! error_state)
                     {
@@ -1234,7 +1234,7 @@
 
                       Array<double> size = (nargin == 3)
                         ? args(2).vector_value ()
-                        : Array<double> (1, lo_ieee_inf_value ());
+                        : Array<double> (1, 1, lo_ieee_inf_value ());
 
                       octave_value tmp = os.scanf (args(1), size, count, who);
 
--- a/src/gl-render.cc
+++ b/src/gl-render.cc
@@ -2394,7 +2394,7 @@
       clip(i) = is_nan_or_inf (v(i,0), v(i,1), 0);
 
   boolMatrix clip_f (1, nf, false);
-  Array<int> count_f (nf, 0);
+  Array<int> count_f (nf, 1, 0);
 
   for (int i = 0; i < nf; i++)
     {
--- a/src/ls-mat5.cc
+++ b/src/ls-mat5.cc
@@ -701,7 +701,7 @@
         NDArray re;
         if (imag)
           {
-            re = NDArray (dim_vector (nnz));
+            re = NDArray (dim_vector (nnz, 1));
             data = re.fortran_vec ();
           }
 
@@ -720,7 +720,7 @@
         // imaginary data subelement
         if (imag)
           {
-            NDArray im (dim_vector (static_cast<int> (nnz)));
+            NDArray im (dim_vector (static_cast<int> (nnz), 1));
           
             if (read_mat5_tag (is, swap, type, len))
               {
--- a/src/oct-map.cc
+++ b/src/oct-map.cc
@@ -494,7 +494,7 @@
 
   if (n_idx > 0)
     {
-      Array<idx_vector> ra_idx (n_idx);
+      Array<idx_vector> ra_idx (n_idx, 1);
 
       for (octave_idx_type i = 0; i < n_idx; i++)
         {
--- a/src/oct-obj.h
+++ b/src/oct-obj.h
@@ -51,13 +51,13 @@
     : data (dim_vector (1, n), val) { }
 
   octave_value_list (const octave_value& tc)
-    : data (1, tc) { }
+    : data (1, 1, tc) { }
 
   octave_value_list (const Array<octave_value>& d)
-    : data (d.reshape (dim_vector (1, d.numel ()))) { }
+    : data (d.as_row ()) { }
 
   octave_value_list (const Cell& tc)
-    : data (tc.reshape (dim_vector (1, tc.numel ()))) { }
+    : data (tc.as_row ()) { }
 
   octave_value_list (const octave_value_list& obj)
     : data (obj.data), names (obj.names) { }
@@ -112,10 +112,9 @@
 
   bool empty (void) const { return length () == 0; }
 
-  void resize (octave_idx_type n) { data.resize (n); }
-
-  void resize (octave_idx_type n, const octave_value& val)
-    { data.resize (n, val); }
+  void resize (octave_idx_type n, const octave_value& rfv 
+               = Array<octave_value>::resize_fill_value ()) 
+    { data.resize (1, n, rfv); }
 
   octave_value_list& prepend (const octave_value& val);
 
--- a/src/oct-parse.yy
+++ b/src/oct-parse.yy
@@ -3782,8 +3782,8 @@
 
   if (nargin == 0)
     {
-      Cell func_names (dim_vector (autoload_map.size ()), 1);
-      Cell file_names (dim_vector (autoload_map.size ()), 1);
+      Cell func_names (dim_vector (autoload_map.size (), 1));
+      Cell file_names (dim_vector (autoload_map.size (), 1));
 
       octave_idx_type i = 0;
       typedef std::map<std::string, std::string>::const_iterator am_iter;
--- a/src/oct-stream.cc
+++ b/src/oct-stream.cc
@@ -155,7 +155,7 @@
 }
 
 scanf_format_list::scanf_format_list (const std::string& s)
-  : nconv (0), curr_idx (0), list (16), buf (0)
+  : nconv (0), curr_idx (0), list (16, 1), buf (0)
 {
   octave_idx_type num_elts = 0;
 
@@ -228,7 +228,7 @@
   if (have_more)
     add_elt_to_list (width, discard, type, modifier, num_elts);
 
-  list.resize (num_elts);
+  list.resize (num_elts, 1);
 
   delete buf;
 }
@@ -260,7 +260,7 @@
                                     modifier, char_class);
 
           if (num_elts == list.length ())
-            list.resize (2 * num_elts);
+            list.resize (2 * num_elts, 1);
 
           list(num_elts++) = elt;
         }
@@ -575,7 +575,7 @@
 // Ugh again.
 
 printf_format_list::printf_format_list (const std::string& s)
-  : nconv (0), curr_idx (0), list (16), buf (0)
+  : nconv (0), curr_idx (0), list (16, 1), buf (0)
 {
   octave_idx_type num_elts = 0;
 
@@ -600,7 +600,7 @@
 
       list(num_elts++) = elt;
 
-      list.resize (num_elts);
+      list.resize (num_elts, 1);
     }
   else
     {
@@ -655,7 +655,7 @@
       if (have_more)
         add_elt_to_list (args, flags, fw, prec, type, modifier, num_elts);
 
-      list.resize (num_elts);
+      list.resize (num_elts, 1);
 
       delete buf;
     }
@@ -688,7 +688,7 @@
                                      type, modifier);
 
           if (num_elts == list.length ())
-            list.resize (2 * num_elts);
+            list.resize (2 * num_elts, 1);
 
           list(num_elts++) = elt;
         }
--- a/src/ov-base-mat.cc
+++ b/src/ov-base-mat.cc
@@ -181,7 +181,7 @@
 
     default:
       {
-        Array<idx_vector> idx_vec (n_idx);
+        Array<idx_vector> idx_vec (n_idx, 1);
         bool scalar_opt = n_idx == nd;
         const dim_vector dv = matrix.dims ();
 
@@ -257,7 +257,7 @@
 
     default:
       {
-        Array<idx_vector> idx_vec (n_idx);
+        Array<idx_vector> idx_vec (n_idx, 1);
 
         for (octave_idx_type i = 0; i < n_idx; i++)
           {
@@ -295,7 +295,7 @@
 
   int nd = matrix.ndims ();
 
-  MT mrhs (dim_vector (1), rhs);
+  MT mrhs (dim_vector (1, 1), rhs);
 
   switch (n_idx)
     {
@@ -341,7 +341,7 @@
 
     default:
       {
-        Array<idx_vector> idx_vec (n_idx);
+        Array<idx_vector> idx_vec (n_idx, 1);
         bool scalar_opt = n_idx == nd;
         const dim_vector dv = matrix.dims ().redim (n_idx);
 
@@ -387,7 +387,7 @@
 {
   octave_idx_type len = idx.length ();
 
-  Array<idx_vector> ra_idx (len);
+  Array<idx_vector> ra_idx (len, 1);
 
   for (octave_idx_type i = 0; i < len; i++)
     ra_idx(i) = idx(i).index_vector ();
--- a/src/ov-base-sparse.cc
+++ b/src/ov-base-sparse.cc
@@ -84,7 +84,7 @@
           }
         else
           {
-            Array<idx_vector> idx_vec (n_idx);
+            Array<idx_vector> idx_vec (n_idx, 1);
 
             for (octave_idx_type i = 0; i < n_idx; i++)
               {
@@ -200,7 +200,7 @@
 {
   octave_idx_type len = idx.length ();
 
-  Array<idx_vector> ra_idx (len);
+  Array<idx_vector> ra_idx (len, 1);
 
   for (octave_idx_type i = 0; i < len; i++)
     ra_idx(i) = idx(i).index_vector ();
--- a/src/ov-perm.cc
+++ b/src/ov-perm.cc
@@ -277,7 +277,6 @@
       && extract_keyword (is, "orient", orient, true))
     {
       bool colp = orient == 'c';
-      dim_vector dv (n);
       ColumnVector tmp (n);
       is >> tmp;
       if (!is) 
@@ -287,7 +286,7 @@
         }
       else
         {
-          Array<octave_idx_type> pvec (n);
+          Array<octave_idx_type> pvec (n, 1);
           for (octave_idx_type i = 0; i < n; i++) pvec(i) = tmp(i) - 1;
           matrix = PermMatrix (pvec, colp);
 
@@ -327,7 +326,7 @@
          && is.read (reinterpret_cast<char *> (&colp), 1)))
     return false;
 
-  MArray<octave_idx_type> m (sz);
+  MArray<octave_idx_type> m (sz, 1);
 
   if (! is.read (reinterpret_cast<char *> (m.fortran_vec ()), m.byte_size ()))
     return false;
--- a/src/ov-struct.cc
+++ b/src/ov-struct.cc
@@ -65,7 +65,7 @@
   if (p != map.end ())
     retval = map.contents (p);
   else if (auto_add)
-    retval = (numel () == 0) ? Cell (dim_vector (1)) : Cell (dims ());
+    retval = (numel () == 0) ? Cell (dim_vector (1, 1)) : Cell (dims ());
   else 
     error ("structure has no member `%s'", nm.c_str ());
 
@@ -1133,8 +1133,8 @@
 
                           Cell c_value (value_dv);
 
-                          Array<octave_idx_type> value_idx (value_dv.length (), 0);
-                          Array<octave_idx_type> c_idx (c_dv_length, 0);
+                          Array<octave_idx_type> value_idx (value_dv.length (), 1, 0);
+                          Array<octave_idx_type> c_idx (c_dv_length, 1, 0);
 
                           for (octave_idx_type j = 0; j < value_dv.numel (); j++)
                             {
--- a/src/ov-typeinfo.cc
+++ b/src/ov-typeinfo.cc
@@ -193,9 +193,9 @@
     {
       len *= 2;
 
-      types.resize (len, std::string ());
+      types.resize (len, 1, std::string ());
 
-      vals.resize (len, octave_value ());
+      vals.resize (len, 1, octave_value ());
 
       unary_ops.resize (static_cast<int> (octave_value::num_unary_ops), len, 0);
 
--- a/src/ov-typeinfo.h
+++ b/src/ov-typeinfo.h
@@ -194,12 +194,12 @@
 protected:
 
   octave_value_typeinfo (void)
-    : num_types (0), types (init_tab_sz, std::string ()),
-      vals (init_tab_sz),
-      unary_class_ops (octave_value::num_unary_ops, 0),
+    : num_types (0), types (init_tab_sz, 1, std::string ()),
+      vals (init_tab_sz, 1),
+      unary_class_ops (octave_value::num_unary_ops, 1, 0),
       unary_ops (octave_value::num_unary_ops, init_tab_sz, 0),
       non_const_unary_ops (octave_value::num_unary_ops, init_tab_sz, 0),
-      binary_class_ops (octave_value::num_binary_ops, 0),
+      binary_class_ops (octave_value::num_binary_ops, 1, 0),
       binary_ops (octave_value::num_binary_ops, init_tab_sz, init_tab_sz, 0),
       cat_ops (init_tab_sz, init_tab_sz, 0),
       assign_ops (octave_value::num_assign_ops, init_tab_sz, init_tab_sz, 0),
--- a/src/ov.cc
+++ b/src/ov.cc
@@ -1490,7 +1490,7 @@
       if (!force_vector_conversion)
         gripe_implicit_conversion ("Octave:array-as-vector",
                                    my_type.c_str (), wanted_type.c_str ());
-      retval = dim_vector (nel);
+      retval = dim_vector (nel, 1);
     }
 
   return retval;
--- a/src/pr-output.cc
+++ b/src/pr-output.cc
@@ -1849,7 +1849,7 @@
  \
           dim_vector dims = nda.dims (); \
  \
-          Array<octave_idx_type> ra_idx (ndims, 0); \
+          Array<octave_idx_type> ra_idx (ndims, 1, 0); \
  \
           octave_idx_type m = 1; \
  \
@@ -1884,7 +1884,7 @@
                   nm += buf.str (); \
                 } \
  \
-              Array<idx_vector> idx (ndims); \
+              Array<idx_vector> idx (ndims, 1); \
  \
               idx(0) = idx_vector (':'); \
               idx(1) = idx_vector (':'); \
@@ -2685,7 +2685,7 @@
 
       dim_vector dims = nda.dims ();
 
-      Array<octave_idx_type> ra_idx (ndims, 0);
+      Array<octave_idx_type> ra_idx (ndims, 1, 0);
 
       octave_idx_type m = 1;
 
@@ -2718,7 +2718,7 @@
               nm += buf.str ();
             }
 
-          Array<idx_vector> idx (ndims);
+          Array<idx_vector> idx (ndims, 1);
 
           idx(0) = idx_vector (':');
           idx(1) = idx_vector (':');
@@ -2950,7 +2950,7 @@
     {
       int ndims = nda.ndims ();
 
-      Array<octave_idx_type> ra_idx (ndims, 0);
+      Array<octave_idx_type> ra_idx (ndims, 1, 0);
 
       dim_vector dims = nda.dims ();
 
@@ -2985,7 +2985,7 @@
               os << nm << " =\n\n";
             }
 
-          Array<idx_vector> idx (ndims);
+          Array<idx_vector> idx (ndims, 1);
 
           idx(0) = idx_vector (':');
           idx(1) = idx_vector (':');
@@ -3021,7 +3021,7 @@
 
       dim_vector dims = nda.dims ();
 
-      Array<octave_idx_type> ra_idx (ndims, 0);
+      Array<octave_idx_type> ra_idx (ndims, 1, 0);
 
       octave_idx_type m = 1;
 
@@ -3090,7 +3090,7 @@
               os << nm << " =\n\n";
             }
 
-          Array<idx_vector> idx (ndims);
+          Array<idx_vector> idx (ndims, 1);
 
           idx(0) = idx_vector (':');
           idx(1) = idx_vector (':');
--- a/src/pt-mat.cc
+++ b/src/pt-mat.cc
@@ -1008,7 +1008,7 @@
               // insert them in the result matrix.
 
               int dv_len = dv.length ();
-              Array<octave_idx_type> ra_idx (dv_len > 1 ? dv_len : 2, 0);
+              Array<octave_idx_type> ra_idx (dv_len > 1 ? dv_len : 2, 1, 0);
 
               for (tm_const::iterator p = tmp.begin (); p != tmp.end (); p++)
                 {
--- a/src/strfns.cc
+++ b/src/strfns.cc
@@ -354,7 +354,7 @@
 
       const Cell cell = cell_val.cell_value ();
       const string_vector str = str_val.all_strings ();
-      octave_idx_type r = str.rows ();
+      octave_idx_type r = str.length ();
 
       if (r == 0 || r == 1)
         {
--- a/src/txt-eng-ft.cc
+++ b/src/txt-eng-ft.cc
@@ -400,13 +400,13 @@
           break;
         case ROTATION_90:
             {
-              Array<octave_idx_type> perm (3);
+              Array<octave_idx_type> perm (3, 1);
               perm(0) = 0;
               perm(1) = 2;
               perm(2) = 1;
               pixels = pixels.permute (perm);
 
-              Array<idx_vector> idx (3);
+              Array<idx_vector> idx (3, 1);
               idx(0) = idx_vector (':');
               idx(1) = idx_vector (pixels.dim2()-1, -1, -1);
               idx(2) = idx_vector (':');
@@ -415,7 +415,7 @@
           break;
         case ROTATION_180:
             {
-              Array<idx_vector> idx (3);
+              Array<idx_vector> idx (3, 1);
               idx(0) = idx_vector (':');
               idx(1) = idx_vector (pixels.dim2()-1, -1, -1);
               idx(2)=  idx_vector (pixels.dim3()-1, -1, -1);
@@ -424,13 +424,13 @@
           break;
         case ROTATION_270:
             {
-              Array<octave_idx_type> perm (3);
+              Array<octave_idx_type> perm (3, 1);
               perm(0) = 0;
               perm(1) = 2;
               perm(2) = 1;
               pixels = pixels.permute (perm);
 
-              Array<idx_vector> idx (3);
+              Array<idx_vector> idx (3, 1);
               idx(0) = idx_vector (':');
               idx(1) = idx_vector (':');
               idx(2) = idx_vector (pixels.dim3()-1, -1, -1);
--- a/src/variables.cc
+++ b/src/variables.cc
@@ -913,7 +913,7 @@
 
   Matrix sz = tmp.size ();
 
-  dim_vector dv (sz.numel ());
+  dim_vector dv = dim_vector::alloc (sz.numel ());
 
   for (octave_idx_type i = 0; i < dv.length (); i++)
     dv(i) = sz(i);