diff liboctave/dMatrix.cc @ 4316:236c10efcde2

[project @ 2003-02-10 21:57:15 by jwe]
author jwe
date Mon, 10 Feb 2003 21:57:15 +0000
parents a9560cebae6e
children d53c33d93440
line wrap: on
line diff
--- a/liboctave/dMatrix.cc	Mon Feb 03 17:34:24 2003 +0000
+++ b/liboctave/dMatrix.cc	Mon Feb 10 21:57:15 2003 +0000
@@ -199,14 +199,20 @@
 Matrix::insert (const RowVector& a, int r, int c)
 {
   int a_len = a.length ();
+
   if (r < 0 || r >= rows () || c < 0 || c + a_len > cols ())
     {
       (*current_liboctave_error_handler) ("range error for insert");
       return *this;
     }
 
-  for (int i = 0; i < a_len; i++)
-    elem (r, c+i) = a.elem (i);
+  if (a_len > 0)
+    {
+      make_unique ();
+
+      for (int i = 0; i < a_len; i++)
+	xelem (r, c+i) = a.elem (i);
+    }
 
   return *this;
 }
@@ -215,14 +221,20 @@
 Matrix::insert (const ColumnVector& a, int r, int c)
 {
   int a_len = a.length ();
+
   if (r < 0 || r + a_len > rows () || c < 0 || c >= cols ())
     {
       (*current_liboctave_error_handler) ("range error for insert");
       return *this;
     }
 
-  for (int i = 0; i < a_len; i++)
-    elem (r+i, c) = a.elem (i);
+  if (a_len > 0)
+    {
+      make_unique ();
+
+      for (int i = 0; i < a_len; i++)
+	xelem (r+i, c) = a.elem (i);
+    }
 
   return *this;
 }
@@ -241,8 +253,15 @@
 
   fill (0.0, r, c, r + a_nr - 1, c + a_nc - 1);
 
-  for (int i = 0; i < a.length (); i++)
-    elem (r+i, c+i) = a.elem (i, i);
+  int a_len = a.length ();
+
+  if (a_len > 0)
+    {
+      make_unique ();
+
+      for (int i = 0; i < a_len; i++)
+	xelem (r+i, c+i) = a.elem (i, i);
+    }
 
   return *this;
 }
@@ -252,10 +271,15 @@
 {
   int nr = rows ();
   int nc = cols ();
+
   if (nr > 0 && nc > 0)
-    for (int j = 0; j < nc; j++)
-      for (int i = 0; i < nr; i++)
-	elem (i, j) = val;
+    {
+      make_unique ();
+
+      for (int j = 0; j < nc; j++)
+	for (int i = 0; i < nr; i++)
+	  xelem (i, j) = val;
+    }
 
   return *this;
 }
@@ -265,6 +289,7 @@
 {
   int nr = rows ();
   int nc = cols ();
+
   if (r1 < 0 || r2 < 0 || c1 < 0 || c2 < 0
       || r1 >= nr || r2 >= nr || c1 >= nc || c2 >= nc)
     {
@@ -275,9 +300,14 @@
   if (r1 > r2) { int tmp = r1; r1 = r2; r2 = tmp; }
   if (c1 > c2) { int tmp = c1; c1 = c2; c2 = tmp; }
 
-  for (int j = c1; j <= c2; j++)
-    for (int i = r1; i <= r2; i++)
-      elem (i, j) = val;
+  if (r2 >= r1 && c2 >= c1)
+    {
+      make_unique ();
+
+      for (int j = c1; j <= c2; j++)
+	for (int i = r1; i <= r2; i++)
+	  xelem (i, j) = val;
+    }
 
   return *this;
 }
@@ -465,7 +495,19 @@
 
   for (int j = 0; j < new_c; j++)
     for (int i = 0; i < new_r; i++)
-      result.elem (i, j) = elem (r1+i, c1+j);
+      result.xelem (i, j) = elem (r1+i, c1+j);
+
+  return result;
+}
+
+Matrix
+Matrix::extract_n (int r1, int c1, int nr, int nc) const
+{
+  Matrix result (nr, nc);
+
+  for (int j = 0; j < nc; j++)
+    for (int i = 0; i < nr; i++)
+      result.xelem (i, j) = elem (r1+i, c1+j);
 
   return result;
 }
@@ -484,7 +526,7 @@
 
   RowVector retval (nc);
   for (int j = 0; j < nc; j++)
-    retval.elem (j) = elem (i, j);
+    retval.xelem (j) = elem (i, j);
 
   return retval;
 }
@@ -522,7 +564,7 @@
 
   ColumnVector retval (nr);
   for (int j = 0; j < nr; j++)
-    retval.elem (j) = elem (j, i);
+    retval.xelem (j) = elem (j, i);
 
   return retval;
 }