diff liboctave/CColVector.cc @ 4316:236c10efcde2

[project @ 2003-02-10 21:57:15 by jwe]
author jwe
date Mon, 10 Feb 2003 21:57:15 +0000
parents 5719210fff4c
children 6f3382e08a52
line wrap: on
line diff
--- a/liboctave/CColVector.cc	Mon Feb 03 17:34:24 2003 +0000
+++ b/liboctave/CColVector.cc	Mon Feb 10 21:57:15 2003 +0000
@@ -78,14 +78,20 @@
 ComplexColumnVector::insert (const ColumnVector& a, int r)
 {
   int a_len = a.length ();
+
   if (r < 0 || r + a_len > length ())
     {
       (*current_liboctave_error_handler) ("range error for insert");
       return *this;
     }
 
-  for (int i = 0; i < a_len; i++)
-    elem (r+i) = a.elem (i);
+  if (a_len > 0)
+    {
+      make_unique ();
+
+      for (int i = 0; i < a_len; i++)
+	xelem (r+i) = a.elem (i);
+    }
 
   return *this;
 }
@@ -94,14 +100,20 @@
 ComplexColumnVector::insert (const ComplexColumnVector& a, int r)
 {
   int a_len = a.length ();
+
   if (r < 0 || r + a_len > length ())
     {
       (*current_liboctave_error_handler) ("range error for insert");
       return *this;
     }
 
-  for (int i = 0; i < a_len; i++)
-    elem (r+i) = a.elem (i);
+  if (a_len > 0)
+    {
+      make_unique ();
+
+      for (int i = 0; i < a_len; i++)
+	xelem (r+i) = a.elem (i);
+    }
 
   return *this;
 }
@@ -110,9 +122,15 @@
 ComplexColumnVector::fill (double val)
 {
   int len = length ();
+
   if (len > 0)
-    for (int i = 0; i < len; i++)
-      elem (i) = val;
+    {
+      make_unique ();
+
+      for (int i = 0; i < len; i++)
+	xelem (i) = val;
+    }
+
   return *this;
 }
 
@@ -120,9 +138,16 @@
 ComplexColumnVector::fill (const Complex& val)
 {
   int len = length ();
+
   if (len > 0)
-    for (int i = 0; i < len; i++)
-      elem (i) = val;
+    {
+      make_unique ();
+
+      for (int i = 0; i < len; i++)
+	xelem (i) = val;
+    }
+
+
   return *this;
 }
 
@@ -130,6 +155,7 @@
 ComplexColumnVector::fill (double val, int r1, int r2)
 {
   int len = length ();
+
   if (r1 < 0 || r2 < 0 || r1 >= len || r2 >= len)
     {
       (*current_liboctave_error_handler) ("range error for fill");
@@ -138,8 +164,13 @@
 
   if (r1 > r2) { int tmp = r1; r1 = r2; r2 = tmp; }
 
-  for (int i = r1; i <= r2; i++)
-    elem (i) = val;
+  if (r2 >= r1)
+    {
+      make_unique ();
+
+      for (int i = r1; i <= r2; i++)
+	xelem (i) = val;
+    }
 
   return *this;
 }
@@ -148,6 +179,7 @@
 ComplexColumnVector::fill (const Complex& val, int r1, int r2)
 {
   int len = length ();
+
   if (r1 < 0 || r2 < 0 || r1 >= len || r2 >= len)
     {
       (*current_liboctave_error_handler) ("range error for fill");
@@ -156,8 +188,13 @@
 
   if (r1 > r2) { int tmp = r1; r1 = r2; r2 = tmp; }
 
-  for (int i = r1; i <= r2; i++)
-    elem (i) = val;
+  if (r2 >= r1)
+    {
+      make_unique ();
+
+      for (int i = r1; i <= r2; i++)
+	xelem (i) = val;
+    }
 
   return *this;
 }
@@ -224,6 +261,17 @@
   return result;
 }
 
+ComplexColumnVector
+ComplexColumnVector::extract_n (int r1, int n) const
+{
+  ComplexColumnVector result (n);
+
+  for (int i = 0; i < n; i++)
+    result.elem (i) = elem (r1+i);
+
+  return result;
+}
+
 // column vector by column vector -> column vector operations
 
 ComplexColumnVector&