00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00024
00025 #include <QString>
00026 #include <QVVector>
00027 #include <QVMatrix>
00028
00029 #include <QVPermutation>
00030
00031 bool QVPermutation::checkConsistency() const {
00032 QVector<bool> check(size(), false);
00033
00034
00035
00036 for(int i=0;i<size();i++) {
00037 if( (operator[](i) < 0) or (operator[](i) >= size()) )
00038 return FALSE;
00039 check[operator[](i)] = true;
00040 }
00041 for(int i=0;i<size();i++)
00042 if(not check[i])
00043 return FALSE;
00044 return TRUE;
00045 }
00046
00047
00048 QVMatrix QVPermutation::toMatrix() const
00049 {
00050 if(not checkConsistency())
00051 qFatal("Inconsistent QVPermutation in QVPermutation::toMatrix()");
00052 QVMatrix result(size(),size(),0.0);
00053 for(int i=0;i<size();i++)
00054 result(i,operator[](i)) = 1.0;
00055 return result;
00056 }
00057
00058 int QVPermutation::signature() const
00059 {
00060 int p=0, n=size();
00061 QVector<bool> v(n, false);
00062
00063
00064
00065
00066 for(int j=0;j<n;j++) {
00067 if(v[j])
00068 ++p;
00069 else {
00070 int x = j;
00071 do {
00072 x = operator[](x);
00073 v[x] = true;
00074 } while (x != j);
00075 }
00076 }
00077 if(p&1)
00078 return -1;
00079 else
00080 return +1;
00081 }
00082
00083 QVPermutation QVPermutation::fromMatrix(const QVMatrix &matrix)
00084 {
00085 const int m=matrix.getRows();
00086 # ifndef QT_NO_DEBUG
00087 const int n=matrix.getCols();
00088 # endif
00089 Q_ASSERT(m == n);
00090 QVPermutation perm(m);
00091 for(int i=0;i<m;i++)
00092 perm[i] = matrix.getRow(i).maxIndex();
00093
00094 if(not perm.checkConsistency())
00095 qFatal("QVPermutation::fromMatrix() called with matrix where the position of the maximum elements in each row do not generate a permutation matrix");
00096
00097 return perm;
00098 }
00099
00100 std::ostream& operator << ( std::ostream &os, const QVPermutation &vector )
00101 {
00102 const int size = vector.size();
00103
00104 os << "QVPermutation (" << size << ") [ ";
00105
00106 for (int i = 0; i < size; i++)
00107 os << qPrintable(QString("%1").arg(vector[i])) << " ";
00108
00109 os << "]";
00110 return os;
00111 }