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 #include <qvmath.h>
00036
00037 class QVMatrix;
00038
00045 class QVVector: public QVector<double>
00046 {
00047 public:
00051 QVVector(): QVector<double>() {}
00052
00057 QVVector(const int size, const double defaultValue = 0): QVector<double>(size, defaultValue) {}
00058
00063 QVVector(const int size, const double *defaultValues): QVector<double>(size)
00064 {
00065 for (int i = 0; i < size; i++)
00066 operator[](i) = defaultValues[i];
00067 }
00068
00072 QVVector(const QVVector &vector): QVector<double>(vector) {}
00073
00077 QVVector(const QVector<double> &vector): QVector<double>(vector) {}
00078
00082 QVVector(const QList<double> &list): QVector<double>(list.toVector()) {}
00083
00090 QVVector(const QVMatrix &matrix);
00091
00095 QVVector(const gsl_vector *vector): QVector<double>(vector->size)
00096 {
00097 for(int i = 0; i < size(); i++)
00098 replace(i, gsl_vector_get(vector, i));
00099 }
00100
00104 QVVector(const QPoint &point): QVector<double>(2) { operator[](0) = point.x(); operator[](1) = point.y(); }
00105
00109 QVVector(const QPointF &point): QVector<double>(2) { operator[](0) = point.x(); operator[](1) = point.y(); }
00110
00112
00117 double operator*(const QVVector &vector) const { return dotProduct(vector); };
00118
00123 QVVector operator^(const QVVector &vector) const { return crossProduct(vector); };
00124
00129 QVVector operator+(const QVVector &vector) const { return add(vector); };
00130
00135 QVVector operator-(const QVVector &vector) const { return substract(vector); };
00136
00141 QVVector operator*(const double value) const { return scalarMultiplication(value); };
00142
00147 QVVector operator/(const double value) const { return scalarDivision(value); };
00148
00152 QVVector operator*(const QVMatrix &matrix) const;
00153
00158 bool operator==(const QVVector &vector) const { return equals(vector); };
00159
00163 QVVector & operator+=(const QVVector &vector) { return (*this = add(vector)); }
00164
00165
00170 operator QPointF() const
00171 {
00172 Q_ASSERT(size() > 1);
00173 Q_ASSERT(size() < 4);
00174 if (size() == 2)
00175 return QPointF(operator[](0), operator[](1));
00176 else
00177 return QPointF(operator[](0)/operator[](2), operator[](1)/operator[](2));
00178 }
00179
00183 operator gsl_vector * () const
00184 {
00185 gsl_vector *result = gsl_vector_alloc(size());
00186 const double *data = this->data();
00187 for(uint i = 0; i < result->size; i++)
00188 gsl_vector_set (result, i, data[i]);
00189 return result;
00190 }
00191
00193
00197 int maxIndex() const
00198 {
00199 if (size() <= 0)
00200 return -1;
00201
00202 int maxIndex = 0;
00203 for (int i = 1; i < size(); i++)
00204 if (operator[](i) > operator[](maxIndex))
00205 maxIndex = i;
00206 return maxIndex;
00207 }
00208
00212 int minIndex() const
00213 {
00214 if (size() <= 0)
00215 return -1;
00216
00217 int minIndex = 0;
00218 for (int i = 1; i < size(); i++)
00219 if (operator[](i) < operator[](minIndex))
00220 minIndex = i;
00221 return minIndex;
00222 }
00223
00227 int maxAbsIndex() const
00228 {
00229 if (size() <= 0)
00230 return -1;
00231
00232 int maxIndex = 0;
00233 for (int i = 1; i < size(); i++)
00234 if ( ABS(operator[](i)) > ABS(operator[](maxIndex)) )
00235 maxIndex = i;
00236
00237 return maxIndex;
00238 }
00239
00243 int minAbsIndex() const
00244 {
00245 if (size() <= 0)
00246 return -1;
00247
00248 int minIndex = 0;
00249 for (int i = 1; i < size(); i++)
00250 if ( ABS(operator[](i)) < ABS(operator[](minIndex)) )
00251 minIndex = i;
00252
00253 return minIndex;
00254 }
00255
00256
00260 void set(const double value)
00261 {
00262 for (int i = 0; i < size(); i++)
00263 operator[](i) = value;
00264 };
00265
00269 QVVector subVector(const int firstIndex, const int lastIndex)
00270 {
00271 Q_ASSERT(0 <= firstIndex);
00272 Q_ASSERT(firstIndex <= lastIndex);
00273 Q_ASSERT(lastIndex < this->size());
00274
00275 QVVector result(lastIndex - firstIndex +1);
00276 for (int i = firstIndex; i <= lastIndex; i++)
00277 result[i] = operator[](i);
00278
00279 return result;
00280 };
00281
00286 QVVector scalarDivision(const double value) const
00287 {
00288 QVVector result = *this;
00289 for (int i = 0; i < size(); i++)
00290 result[i] /= value;
00291 return result;
00292 };
00293
00298 QVVector scalarMultiplication(const double value) const
00299 {
00300 QVVector result = *this;
00301 for (int i = 0; i < size(); i++)
00302 result[i] *= value;
00303 return result;
00304 };
00305
00309 double norm2() const
00310 { return sqrt(*this * *this); }
00311
00316 QVVector normalize() const
00317 { return operator/(norm2()); }
00318
00321 double max() const;
00322
00325 double min() const;
00326
00333 double sum() const;
00334
00341 double mean() const;
00342
00347 double median() const;
00348
00355 double variance() const;
00356
00374 double entropy(const double base = 2) const;
00375
00380 double dotProduct(const QVVector &vector) const;
00381
00387 QVVector crossProduct(const QVVector &vector) const;
00388
00393 QVVector add(const QVVector &vector) const;
00394
00399 QVVector substract(const QVVector &vector) const;
00400
00405 bool equals(const QVVector &vector) const;
00406
00408
00419 static const QVVector gaussianVector(const int radius, const double sigma);
00420
00431 static const QVVector mexicanHatWaveletVector(const int radius, const double sigma);
00432
00436 static const QVVector homogeneousCoordinates(const QPointF &point);
00437
00443 QVVector homogeneousCoordinates() const;
00444
00465 QVMatrix crossProductMatrix() const;
00466
00468 QVMatrix toRowMatrix() const;
00469
00471 QVMatrix toColumnMatrix() const;
00472 };
00473
00476 std::ostream& operator << ( std::ostream &os, const QVVector &vector );
00477
00480 uint qHash(const QVVector &vector);
00481
00482 #endif
00483