diff --git a/Numeric/fullMatrix.h b/Numeric/fullMatrix.h
index 8d555d84d370a6c125b4bd41a3fcb58b2ce2c395..654ece1004a650dff7fc087ad6f027279ade4e2d 100644
--- a/Numeric/fullMatrix.h
+++ b/Numeric/fullMatrix.h
@@ -20,24 +20,25 @@ class fullVector
  private:
   int _r;          // size of the vector
   scalar *_data;   // pointer on the first element
+  bool _own_data;
   friend class fullMatrix<scalar>;
 
  public:
   // constructor and destructor
-  fullVector(void) : _r(0),_data(0) {}
-  fullVector(int r) : _r(r)
+  fullVector(void) : _r(0),_data(0),_own_data(1) {}
+  fullVector(int r) : _r(r),_own_data(1)
   {
     _data = new scalar[_r];
     setAll(0.);
   }
-  fullVector(const fullVector<scalar> &other) : _r(other._r)
+  fullVector(const fullVector<scalar> &other) : _r(other._r),_own_data(1)
   {
     _data = new scalar[_r];
     for(int i = 0; i < _r; ++i) _data[i] = other._data[i];
   }
   ~fullVector()
   {
-    if(_data) delete [] _data;
+    if(_own_data && _data) delete [] _data;
   }
 
   // get information (size, value)
@@ -74,10 +75,18 @@ class fullVector
   }
   void setAsProxy(const fullVector<scalar> &original, int r_start, int r)
   {
-    if(_data) delete [] _data;
+    if(_own_data && _data) delete [] _data;
+    _own_data = false;
     _r = r;
     _data = original._data + r_start;
   }
+  void setAsProxy(const fullMatrix<scalar> &original, int c)
+  {
+    if(_own_data && _data) delete [] _data;
+    _own_data = false;
+    _r = original._r;
+    _data = original._data + c * _r;
+  }
   inline void scale(const scalar s)
   {
     if(s == 0.)