7 #ifndef SELECTION_RULE_H
8 #define SELECTION_RULE_H
83 class ElemType< std::complex<T> >
95 template <
typename Scalar,
int SelectionRule>
99 static typename ElemType<Scalar>::type
get(
const Scalar &val)
101 throw std::invalid_argument(
"incompatible selection rule");
102 return -std::abs(val);
108 template <
typename Scalar>
112 static typename ElemType<Scalar>::type
get(
const Scalar &val)
114 return -std::abs(val);
120 template <
typename RealType>
121 class SortingTarget<std::complex<RealType>,
LARGEST_REAL>
124 static RealType
get(
const std::complex<RealType> &val)
132 template <
typename RealType>
133 class SortingTarget<std::complex<RealType>,
LARGEST_IMAG>
136 static RealType
get(
const std::complex<RealType> &val)
138 return -std::abs(val.imag());
144 template <
typename Scalar>
148 static Scalar
get(
const Scalar &val)
158 template <
typename Scalar>
162 static Scalar
get(
const Scalar &val)
170 template <
typename Scalar>
174 static typename ElemType<Scalar>::type
get(
const Scalar &val)
176 return std::abs(val);
182 template <
typename RealType>
186 static RealType
get(
const std::complex<RealType> &val)
194 template <
typename RealType>
198 static RealType
get(
const std::complex<RealType> &val)
200 return std::abs(val.imag());
206 template <
typename Scalar>
210 static Scalar
get(
const Scalar &val)
217 template <
typename PairType>
221 bool operator() (
const PairType &v1,
const PairType &v2)
223 return v1.first < v2.first;
227 template <
typename T,
int SelectionRule>
231 typedef typename ElemType<T>::type TargetType;
233 typedef std::pair<TargetType, int> PairType;
236 std::vector<PairType> pair_sort;
239 SortEigenvalue(
const T* start,
int size) :
242 for(
int i = 0; i < size; i++)
244 pair_sort[i].first = SortingTarget<T, SelectionRule>::get(start[i]);
245 pair_sort[i].second = i;
247 PairComparator<PairType> comp;
248 std::sort(pair_sort.begin(), pair_sort.end(), comp);
251 std::vector<int> index()
253 std::vector<int> ind(pair_sort.size());
254 for(
unsigned int i = 0; i < ind.size(); i++)
255 ind[i] = pair_sort[i].second;
263 #endif // SELECTION_RULE_H
Select eigenvalues with smallest imaginary part (in magnitude). Only for general eigen solvers...
Select eigenvalues with largest imaginary part (in magnitude). Only for general eigen solvers...
Select eigenvalues with largest real part. Only for general eigen solvers.
Select eigenvalues with smallest algebraic value. Only for symmetric eigen solvers.
Select eigenvalues with smallest real part. Only for general eigen solvers.