diff --git a/Numeric/fullMatrix.h b/Numeric/fullMatrix.h index 1285646b83c413981754002955ca77e2e0ca444d..cd3ea275b5b2713761386909d3a2d64822690d71 100644 --- a/Numeric/fullMatrix.h +++ b/Numeric/fullMatrix.h @@ -46,6 +46,19 @@ class fullVector inline const scalar * getDataPtr() const { return _data; } inline scalar operator () (int i) const { return _data[i]; } inline scalar & operator () (int i) { return _data[i]; } + // copy + fullVector<scalar>& operator= (const fullVector<scalar> &other) + { + if (this != &other) { + if ((!resize(other.size(), false) && _r > 2*other.size())) { + if (_data) delete[] _data; + _r = other.size(); + _data = new scalar[_r]; + } + setAll(other); + } + return *this; + } // set inline void set(int r, scalar v){ #ifdef _DEBUG @@ -63,14 +76,20 @@ class fullVector for(int i = 0; i < _r; ++i) n += _data[i] * _data[i]; return sqrt(n); } - bool resize(int r) + bool resize(int r, bool resetValue = true) { - if (_r < r) { - if (_data) delete[] _data; + if (_r < r || !_own_data) { + if (_own_data && _data) delete[] _data; _r = r; _data = new scalar[_r]; + _own_data = true; + if(resetValue) + setAll(0.); return true; } + _r = r; + if(resetValue) + setAll(0.); return false; } void setAsProxy(const fullVector<scalar> &original, int r_start, int r) @@ -224,19 +243,17 @@ class fullMatrix bool resize(int r, int c, bool resetValue = true) // data will be owned (same as constructor) { if ((r * c > _r * _c) || !_own_data) { + if (_own_data && _data) delete[] _data; _r = r; _c = c; - if (_own_data && _data) delete[] _data; _data = new scalar[_r * _c]; _own_data = true; if(resetValue) setAll(0.); return true; } - else { - _r = r; - _c = c; - } + _r = r; + _c = c; if(resetValue) setAll(0.); return false; // no reallocation