00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00024
00025 #ifndef QVVECTOR_H
00026 #define QVVECTOR_H
00027
00028 #include <math.h>
00029 #include <iostream>
00030 #include <QVector>
00031 #include <QPointF>
00032 #include <qvdefines.h>
00033 #include <gsl/gsl_linalg.h>
00034
00035 class QVMatrix;
00036
00043 class QVVector: public QVector<double>
00044 {
00045 public:
00049 QVVector(): QVector<double>() {}
00050
00055 QVVector(const int size, const double defaultValue = 0): QVector<double>(size, defaultValue) {}
00056
00060 QVVector(const QVVector &vector): QVector<double>(vector) {}
00061
00065 QVVector(const QVector<double> &vector): QVector<double>(vector) {}
00066
00070 QVVector(const QList<double> &list): QVector<double>(list.toVector()) {}
00071
00078 QVVector(const QVMatrix &matrix);
00079
00083 QVVector(const gsl_vector *vector): QVector<double>(vector->size)
00084 {
00085 for(int i = 0; i < size(); i++)
00086 replace(i, gsl_vector_get(vector, i));
00087 }
00088
00092 QVVector(const QPoint &point): QVector<double>(2) { operator[](0) = point.x(); operator[](1) = point.y(); }
00093
00097 QVVector(const QPointF &point): QVector<double>(2) { operator[](0) = point.x(); operator[](1) = point.y(); }
00098
00100
00105 double operator*(const QVVector &vector) const { return dotProduct(vector); };
00106
00111 QVVector operator^(const QVVector &vector) const { return crossProduct(vector); };
00112
00117 QVVector operator+(const QVVector &vector) const { return add(vector); };
00118
00123 QVVector operator-(const QVVector &vector) const { return substract(vector); };
00124
00129 QVVector operator*(const double value) const { return scalarMultiplication(value); };
00130
00135 QVVector operator/(const double value) const { return scalarDivision(value); };
00136
00140 QVVector operator*(const QVMatrix &matrix) const;
00141
00146 bool operator==(const QVVector &vector) const { return equals(vector); };
00147
00151 QVVector & operator+=(const QVVector &vector) { return (*this = add(vector)); }
00152
00153
00158 operator QPointF() const
00159 {
00160 Q_ASSERT(size() > 1);
00161 Q_ASSERT(size() < 4);
00162 if (size() == 2)
00163 return QPointF(operator[](0), operator[](1));
00164 else
00165 return QPointF(operator[](0)/operator[](2), operator[](1)/operator[](2));
00166 }
00167
00171 operator gsl_vector * () const
00172 {
00173 gsl_vector *result = gsl_vector_alloc(size());
00174 const double *data = this->data();
00175 for(uint i = 0; i < result->size; i++)
00176 gsl_vector_set (result, i, data[i]);
00177 return result;
00178 }
00179
00181
00185 int maxIndex() const
00186 {
00187 if (size() <= 0)
00188 return -1;
00189
00190 int maxIndex = 0;
00191 for (int i = 1; i < size(); i++)
00192 if (operator[](i) > operator[](maxIndex))
00193 maxIndex = i;
00194 return maxIndex;
00195 }
00196
00200 int minIndex() const
00201 {
00202 if (size() <= 0)
00203 return -1;
00204
00205 int minIndex = 0;
00206 for (int i = 1; i < size(); i++)
00207 if (operator[](i) < operator[](minIndex))
00208 minIndex = i;
00209 return minIndex;
00210 }
00211
00215 void set(const double value)
00216 {
00217 for (int i = 0; i < size(); i++)
00218 operator[](i) = value;
00219 };
00220
00224 QVVector subVector(const int firstIndex, const int lastIndex)
00225 {
00226 Q_ASSERT(0 <= firstIndex);
00227 Q_ASSERT(firstIndex <= lastIndex);
00228 Q_ASSERT(lastIndex < this->size());
00229
00230 QVVector result(lastIndex - firstIndex +1);
00231 for (int i = firstIndex; i <= lastIndex; i++)
00232 result[i] = operator[](i);
00233
00234 return result;
00235 };
00236
00241 QVVector scalarDivision(const double value) const
00242 {
00243 QVVector result = *this;
00244 for (int i = 0; i < size(); i++)
00245 result[i] /= value;
00246 return result;
00247 };
00248
00253 QVVector scalarMultiplication(const double value) const
00254 {
00255 QVVector result = *this;
00256 for (int i = 0; i < size(); i++)
00257 result[i] *= value;
00258 return result;
00259 };
00260
00264 double norm2() const
00265 { return sqrt(*this * *this); }
00266
00271 QVVector normalize() const
00272 { return operator/(norm2()); }
00273
00276 double max() const;
00277
00280 double min() const;
00281
00288 double sum() const;
00289
00296 double mean() const;
00297
00304 double variance() const;
00305
00323 double entropy(const double base = 2) const;
00324
00329 double dotProduct(const QVVector &vector) const;
00330
00336 QVVector crossProduct(const QVVector &vector) const;
00337
00342 QVVector add(const QVVector &vector) const;
00343
00348 QVVector substract(const QVVector &vector) const;
00349
00354 bool equals(const QVVector &vector) const;
00355
00357
00368 static const QVVector gaussianVector(const int radius, const double sigma);
00369
00380 static const QVVector mexicanHatWaveletVector(const int radius, const double sigma);
00381
00385 static const QVVector homogeneousCoordinates(const QPointF &point);
00386
00407 QVMatrix crossProductMatrix() const;
00408
00410 QVMatrix toRowMatrix() const;
00411
00413 QVMatrix toColumnMatrix() const;
00414 };
00415
00418 std::ostream& operator << ( std::ostream &os, const QVVector &vector );
00419
00422 uint qHash(const QVVector &vector);
00423
00424 #endif
00425