diff liboctave/ArrayN.cc @ 4473:32ac2bea0185

[project @ 2003-07-29 23:05:32 by jwe]
author jwe
date Tue, 29 Jul 2003 23:05:32 +0000
parents 0990c9b77109
children f62a7ed4fb06
line wrap: on
line diff
--- a/liboctave/ArrayN.cc
+++ b/liboctave/ArrayN.cc
@@ -229,6 +229,8 @@
   if (no_change)
     return;
 
+  int old_len = length ();
+
   typename Array<T>::ArrayRep *old_rep = Array<T>::rep;
   const T *old_data = data ();
 
@@ -236,8 +238,6 @@
 
   Array<int> old_dimensions = dimensions;
 
-  int old_len = length ();
-
   dimensions = dims;
 
   Array<int> ra_idx (dimensions.length (), 0);
@@ -287,14 +287,14 @@
   typename Array<T>::ArrayRep *old_rep = Array<T>::rep;
   const T *old_data = data ();
 
+  int old_len = length ();
+
   int len = get_size (dims);
 
   Array<T>::rep = new typename Array<T>::ArrayRep (len);
 
   Array<int> old_dimensions = dimensions;
 
-  int old_len = length ();
-
   dimensions = dims;
 
   Array<int> ra_idx (dimensions.length (), 0);
@@ -354,22 +354,110 @@
 std::ostream&
 operator << (std::ostream& os, const ArrayN<T>& a)
 {
-  Array<int> dims = a.dimensions;
+  Array<int> a_dims = a.dimensions;
+
+  int n_dims = a_dims.length ();
+
+  os << n_dims << "-dimensional array";
+
+  if (n_dims)
+    {
+      os << " (";
+
+      for (int i = 0; i < n_dims - 1; i++)
+	os << a_dims(i) << "x";
+
+      os << a_dims(n_dims-1) << ")";
+    }
+
+  os <<"\n\n";
 
-  int n_dims = dims.length ();
+  if (n_dims)
+    {
+      os << "data:";
+
+      Array<int> ra_idx (n_dims,0);
+
+      // Number of times the first 2d-array is to be displayed.
 
-  os << n_dims << "-dimensional array (";
+      int m = 1;
+      for (int i = 2; i < n_dims; i++)
+	m *= a_dims(i);
+
+      if (m == 1)
+        {
+          int rows = 0;
+          int cols = 0;
+
+          switch (n_dims)
+            {
+	    case 2:
+	      rows = a_dims(0);
+	      cols = a_dims(1);
 
-  for (int i = 0; i < n_dims - 1; i++)
-    os << dims(i) << "x";
-  os << dims(n_dims-1) << ")\n\n";
+	      for (int j = 0; j < rows; j++)
+		{
+		  ra_idx(0) = j;
+		  for (int k = 0; k < cols; k++)
+		    {
+		      ra_idx(1) = k;
+		      os << " " << a.elem(ra_idx);
+		    }
+		  os << "\n";
+		}
+	      break;
+
+	    case 1:
+	      rows = a_dims(0);
+
+	      for (int k = 0; k < rows; k++)
+		{
+		  ra_idx(0) = k;
+		  os << " " << a.elem(ra_idx);
+		}
+	      break;
+
+	    default:
+	      (*current_liboctave_error_handler)
+		("std::operator <<: problems with dimensions (= 0)!");
+	    }
 
-  os << "data:\n";
+          os << "\n";
+        }
+      else
+        {
+          int rows = a_dims(0);
+          int cols = a_dims(1);
+
+          for (int i = 0; i < m; i++)
+            {
+              os << "\n(:,:,";
+
+              for (int j = 2; j < n_dims - 1; j++)
+		os << ra_idx(j) + 1 << ",";
+
+	      os << ra_idx(n_dims - 1) + 1 << ") = \n";
 
-  int n = ArrayN<T>::get_size (dims);
+	      for (int j = 0; j < rows; j++)
+	        {
+	          ra_idx(0) = j;
+
+	          for (int k = 0; k < cols; k++)
+	            {
+		      ra_idx(1) = k;
+		      os << " " << a.elem(ra_idx);
+		    }
 
-  //  for (int i = 0; i < n; i++)
-  //    os << a.elem (i) << "\n";
+	          os << "\n";
+	        }
+
+	      os << "\n";
+
+	      if (i != m - 1)
+		increment_index (ra_idx, a_dims, 2);
+            }
+        }
+    }
 
   return os;
 }