32#ifndef GIMLI_VECTOR__H
33#define GIMLI_VECTOR__H
35#define EXPRVEC_USE_TEMPORARY_EXPRESSION
39#define EXPRVEC_USE_INDIRECTION
42#include "expressions.h"
57 #include <boost/bind.hpp>
66IndexArray
find(
const BVector & v);
68DLLEXPORT IndexArray range(Index start, Index stop, Index step=1);
69DLLEXPORT IndexArray range(Index stop);
73inline void Dump(
const void * mem,
unsigned int n) {
74 const char * p =
reinterpret_cast< const char *
>(mem);
75 for (
unsigned int i = 0; i < n; i++) {
76 std::cout << std::hex << int(p[i]) <<
" ";
78 std::cout << std::endl;
82template <
class ValueType >
class DLLEXPORT VectorIterator {
84 typedef ValueType value_type;
88 typedef Index difference_type;
89 typedef value_type & pointer;
90 typedef value_type & reference;
91 typedef std::random_access_iterator_tag iterator_category;
92 bool operator < (
const VectorIterator< ValueType > & a)
const {
return val_ < a.val_; }
96 : val_(0), maxSize_(0), end_(0){
99 VectorIterator(ValueType * v, Index size)
100 : val_(v), maxSize_(size), end_(v + size){
103 VectorIterator(
const VectorIterator < ValueType > & iter)
104 : val_(iter.val_), maxSize_(iter.maxSize_), end_(iter.val_ + iter.maxSize_){
107 VectorIterator < ValueType > & operator = (
const VectorIterator < ValueType > & iter){
111 maxSize_ = iter.maxSize_ ;
117 inline const ValueType & operator * ()
const {
return * val_; }
119 inline ValueType & operator * () {
return * val_; }
121 inline const ValueType & operator [] (
const Index i)
const {
124 inline ValueType & operator [] (
const Index i) {
127 inline VectorIterator< ValueType > & operator ++ () {
128 ++val_;
return *
this;
131 inline VectorIterator< ValueType > & operator -- () {
132 --val_;
return *
this;
135 inline VectorIterator< ValueType > operator ++ (
int) {
136 VectorIterator< ValueType > old(*
this);
142 inline VectorIterator< ValueType > operator -- (
int) {
143 VectorIterator< ValueType > old(*
this);
149 inline bool operator == (
const VectorIterator< ValueType > & a)
const {
return val_ == a.val_; }
150 inline bool operator != (
const VectorIterator< ValueType > & a)
const {
return val_ != a.val_; }
152 inline Index size()
const {
return maxSize_; }
154 inline ValueType * ptr()
const {
return val_; }
155 inline ValueType * ptr() {
return val_; }
157 inline bool hasMore()
const {
return val_ != end_; }
165 inline ValueType nextForPy(){
168#include "boost/python.hpp"
169 boost::python::objects::stop_iteration_error();
186template<
class ValueType >
class DLLEXPORT
Vector {
188 typedef ValueType ValType;
199 : size_(0), data_(0), capacity_(0){
205 : size_(0), data_(0), capacity_(0){
215 : size_(0), data_(0), capacity_(0){
224 : size_(0), data_(0), capacity_(0){
225 this->
load(filename, format);
232 : size_(0), data_(0), capacity_(0){
241 : size_(0), data_(0), capacity_(0){
243 std::copy(&v[start], &v[end], data_);
250 : size_(0), data_(0), capacity_(0){
259 Vector(
const std::vector< ValueType > & v)
260 : size_(0), data_(0), capacity_(0){
262 for (Index i = 0; i < v.size(); i ++) data_[i] = v[i];
267 : size_(0), data_(0), capacity_(0){
269 for (Index i = 0; i < v.size(); i ++) data_[i] = ValueType(v[i]);
299 inline Vector < ValueType >
copy()
const {
303 inline const ValueType & operator[](
const Index i)
const {
308 inline ValueType & operator[](
const Index i) {
313 inline const Vector < ValueType > operator[](
const IndexArray & i)
const {
return this->get_(i); }
315 inline Vector < ValueType > operator[](
const IndexArray & i) {
return this->get_(i); }
317 inline Vector < ValueType > operator[](
const BVector & b) {
return this->get_(b); }
324 inline Vector < ValueType > operator () (Index start, SIndex end)
const {
325 return getVal(start, end);
328 inline Vector < ValueType > operator () (
const std::pair< Index, SIndex > & pair)
const {
329 return getVal(pair.first, pair.second);
339 inline Vector < ValueType > operator () (
const IndexArray & iArray)
const {
346 inline Vector < ValueType > operator () (
const SIndexArray & siArray)
const {
347 return get_(siArray);
349 inline Vector < ValueType > operator () (
const IVector & iVec)
const {
352 template <
class IndexContainer > Vector < ValueType > get_(
const IndexContainer & idx)
const {
356 Vector < ValueType > v(idx.size());
358 for (Index i = 0; i < idx.size(); i ++){
360 if (
id >= 0 &&
id < size_){
361 v[i] = data_[(Index)
id];
363 throwLengthError(WHERE_AM_I +
" idx out of range " +
364 str(
id) +
" [" + str(0) +
" " + str(size_) +
")");
371 Vector < ValueType > get_(
const BVector & bv)
const {
374 Vector < ValueType > getVUI_(
const IndexArray & iA)
const {
375 return this->get_(iA);
377 Vector < ValueType > getVSI_(
const IVector & iA)
const {
378 return this->get_(iA);
395 template <
class T >
operator std::vector< T >() {
396 std::vector< T > f(this->size());
397 for (Index i = 0; i < this->size(); i ++){ f[i] = T(data_[i]); }
426 ASSERT_EQUAL(this->size(), bv.size())
427 for (Index i = 0; i < bv.size(); i ++ )
if (bv[i]) data_[i] = val;
434 ASSERT_RANGE(i, 0, this->size())
444 Index start, SIndex end) {
445 Index e = (Index)end;
446 if (e > this->size()) e = this->size();
447 if (start > e) start = e;
449 std::fill(data_+ start, data_ + e, val);
455 const std::pair< Index, SIndex > & pair) {
456 return setVal(val, pair.first, pair.second);
461 const IndexArray & ids) {
462 for (Index i = 0; i < ids.size(); i ++)
setVal(val, ids[i]);
469 const IndexArray & ids) {
470 ASSERT_EQUAL(vals.size(), ids.size())
471 for (Index i = 0; i < ids.size(); i ++){
481 Index newS = start + vals.size();
482 if (this->size() < newS) this->
resize(newS);
483 this->
setVal(vals, start, newS);
493 Index start, Index end) {
494 if (start > this->size()){
495 throwLengthError(WHERE_AM_I +
" vals.size() < start " +
496 str(vals.size()) +
" " + str(start) +
" " + str(end)) ;
499 if (end > this->size()) end = this->size();
500 if (start > end) start = end;
502 if (vals.size() < (end - start)){
503 throwLengthError( WHERE_AM_I +
" vals.size() < (end-start) " +
504 str(vals.size()) +
" " + str(start) +
" " + str(end)) ;
507 if (this->size() == vals.size()){
508 std::copy(&vals[start], &vals[end], &data_[start]);
510 std::copy(&vals[0], &vals[end - start], &data_[start]);
517 const std::pair< Index, SIndex > & pair) {
518 return setVal(vals, pair.first, pair.second);
523 return setVal(v, size_ -1);
528 Index start, Index end) {
529 if (end > this->size()) end = this->size();
530 if (start > end) start = end;
532 if (vals.size() < end - start){
533 throwLengthError(WHERE_AM_I +
" vals.size() < (end-start) " +
534 str(vals.size()) +
" " + str(start) +
" " + str(end)) ;
537 if (this->size() == vals.size()){
538 for (Index i = start; i < end; i ++) data_[i] += vals[i];
540 for (Index i = start; i < end; i ++) data_[i] += vals[i - start];
547 const std::pair< Index, SIndex > & pair) {
548 return addVal(vals, pair.first, pair.second);
554 const IndexArray & idx) {
555 ASSERT_EQUAL(idx.size(), vals.size())
557 for (Index i = 0; i < idx.size(); i ++) data_[idx[i]] += vals[i];
564 ASSERT_RANGE(i, 0, this->size())
570 void add(
const ElementMatrix < double > & A);
573 void add(
const ElementMatrix < double > & A,
const double & scale);
576 void add(
const ElementMatrix < double > & A,
const Pos & scale);
579 void add(
const ElementMatrix < double > & A,
const RMatrix & scale);
582 void add(
const ElementMatrix < double > & A,
583 const Vector < double > & scale);
587 inline const ValueType &
getVal(Index i)
const {
588 ASSERT_RANGE(i, 0, this->size())
592 Vector < ValueType > getVal(Index start, SIndex end)
const {
593 Index e = (Index) end;
595 e = max(start, size_ + end);
598 Vector < ValueType > v(e-start);
600 if (start == e)
return v;
602 if (start >= 0 && start < e){
603 std::copy(& data_[start], & data_[e], &v[0]);
605 throwLengthError(WHERE_AM_I +
" bounds out of range " +
606 str(start) +
" " + str(end) +
" " + str(size_));
611 Vector < ValueType > getVal(
const std::pair< Index, SIndex > & pair)
const {
612 return getVal(pair.first, pair.second);
617 bool operator < (
const Vector< ValueType > & v)
const {
return false; }
619 BVector operator < (
const Vector< ValueType > & v)
const {
620 ASSERT_EQUAL(this->size(), v.size())
622 BVector ret(this->size(), 0);
624 std::less<ValueType> l;
625 for (Index i = 0; i < v.size(); i ++) ret[i] = l(data_[i], v[i]);
630#define DEFINE_COMPARE_OPERATOR_VEC__(OP, FUNCT) \
631 BVector operator OP (const Vector< ValueType > & v) const { \
632 ASSERT_EQUAL(this->size(), v.size()) \
633 BVector ret(this->size(), 0); \
634 FUNCT<ValueType> f; \
635 for (Index i = 0; i < v.size(); i ++) ret[i] = f(data_[i], v[i]); \
639DEFINE_COMPARE_OPERATOR_VEC__(<=, std::less_equal)
640DEFINE_COMPARE_OPERATOR_VEC__(>=, std::greater_equal)
641DEFINE_COMPARE_OPERATOR_VEC__(>, std::greater)
643#undef DEFINE_COMPARE_OPERATOR_VEC__
645#define DEFINE_COMPARE_OPERATOR__(OP, FUNCT) \
646 inline BVector operator OP (const int & v) const { \
647 BVector ret(this->size(), 0); \
648 FUNCT<ValueType> f; \
649 for (Index i = 0; i < this->size(); i ++){ ret[i] = f(data_[i], ValueType(v)); } \
652 inline BVector operator OP (const uint & v) const { \
653 BVector ret(this->size(), 0); \
654 FUNCT<ValueType> f; \
655 for (Index i = 0; i < this->size(); i ++){ ret[i] = f(data_[i], ValueType(v)); } \
658 inline BVector operator OP (const ValueType & v) const { \
659 BVector ret(this->size(), 0); \
660 FUNCT<ValueType> f; \
661 for (Index i = 0; i < this->size(); i ++){ ret[i] = f(data_[i], v); } \
665DEFINE_COMPARE_OPERATOR__(<, std::less)
666DEFINE_COMPARE_OPERATOR__(<=, std::less_equal)
667DEFINE_COMPARE_OPERATOR__(>=, std::greater_equal)
668DEFINE_COMPARE_OPERATOR__(==, std::equal_to)
669DEFINE_COMPARE_OPERATOR__(!=, std::not_equal_to)
670DEFINE_COMPARE_OPERATOR__(>, std::greater)
672#undef DEFINE_COMPARE_OPERATOR__
680#define DEFINE_UNARY_MOD_OPERATOR__(OP, FUNCT) \
681 inline Vector< ValueType > & operator OP##= (const Vector < ValueType > & v) { \
682 ASSERT_EQUAL_SIZE((*this), v) \
683 std::transform(data_, data_ + size_, &v[0], data_, FUNCT()); return *this; } \
684 inline Vector< ValueType > & operator OP##= (const ValueType & val) { \
685 for (Index i = 0; i < size_; i ++) data_[i] OP##= val; return *this; } \
687DEFINE_UNARY_MOD_OPERATOR__(+, PLUS)
688DEFINE_UNARY_MOD_OPERATOR__(-, MINUS)
689DEFINE_UNARY_MOD_OPERATOR__(/, DIVID)
690DEFINE_UNARY_MOD_OPERATOR__(*, MULT)
692#undef DEFINE_UNARY_MOD_OPERATOR__
695 inline Vector < ValueType > operator - ()
const {
return *
this * -1.0; }
701 for (Index i = size_; i < n; i ++) data_[i]=
fill;
706 void resize(Index n){
713 Index newCapacity = max(1, n);
717 newCapacity = pow(2, exp);
721 if (newCapacity != capacity_) {
722 ValueType * buffer =
new ValueType[newCapacity];
724 std::memcpy(buffer, data_,
725 sizeof(ValueType) * min(capacity_, newCapacity));
727 if (data_)
delete [] data_;
729 capacity_ = newCapacity;
738 for (Index i = 0; i < size_; i ++) data_[i] = ValueType(val[i]);
745 std::fill(data_, data_ + size_, val);
return *
this; }
749 for (Index i = 0; i < size_; i ++){
750 data_[i] = expr((ValueType)i);
758 template <
class ExprOP >
inline void assign(
const ExprOP & v){
771 if (size_ > 0) std::memset(data_,
'\0',
sizeof(ValueType) * size_);
785 inline bool empty()
const {
return size() == 0; }
787 inline Index size()
const {
return size_; }
789 inline Index capacity()
const {
return capacity_; }
791 inline Index nThreads()
const {
return nThreads_; }
793 inline Index singleCalcCount()
const {
return singleCalcCount_; }
795 ValueType * data() {
return data_; }
809 bool save(
const std::string & filename,
IOFormat format = Ascii)
const {
811 if (filename.rfind(VECTORASCSUFFIX) != std::string::npos) format = Ascii;
812 else if (filename.rfind(VECTORBINSUFFIX) != std::string::npos) format = Binary;
813 std::string fname(filename);
815 if (format == Ascii){
816 if (fname.rfind(
".") == std::string::npos) fname += VECTORASCSUFFIX;
818 std::ofstream file; file.open(fname.c_str());
820 throwError(filename +
": " + strerror(errno));
823 file.setf(std::ios::scientific, std::ios::floatfield);
826 for (Index i = 0, imax = size_; i < imax; i ++) file << data_[i] << std::endl;
829 if (fname.rfind(
".") == std::string::npos) fname += VECTORBINSUFFIX;
834 FILE *file; file = fopen(fname.c_str(),
"w+b");
836 throwError(filename +
": " + strerror(errno));
839 int64 count = (int64)size_;
840 Index ret = 0; ret = fwrite((
char*)&count,
sizeof(int64), 1, file);
845 for (Index i = 0; i < size_; i++) ret = fwrite((
char*)&data_[i],
sizeof(ValueType), 1, file);
859 if (filename.rfind(VECTORASCSUFFIX) != std::string::npos) format = Ascii;
860 else if (filename.rfind(VECTORBINSUFFIX) != std::string::npos) format = Binary;
862 if (!fileExist(filename)){
863 if (fileExist(filename + VECTORBINSUFFIX))
864 return this->
load(filename + VECTORBINSUFFIX, Binary);
865 if (fileExist(filename + VECTORASCSUFFIX))
866 return this->
load(filename + VECTORASCSUFFIX, Ascii);
869 if (format == Ascii){
870 std::vector < ValueType > tmp;
872 std::fstream file; openInFile(filename.c_str(), &file);
873 ValueType val;
while(file >> val) {
887 std::copy(tmp.begin(), tmp.end(), &data_[0]);
892 file = fopen(filename.c_str(),
"r+b");
894 throwError(filename +
": " + strerror(errno));
897 int64 size; ret = fread(&size,
sizeof(int64), 1, file);
898 if (ret) this->
resize(size);
900 ret = fread(&data_[0],
sizeof(ValueType), size, file);
909 VectorIterator< ValueType > begin()
const {
return VectorIterator< ValueType >(data_, size_); }
910 VectorIterator< ValueType > end()
const {
return VectorIterator< ValueType >(data_ + size_, 0); }
914 for (Index i = 0; i < this->size_; ++i) {
924 if (data_)
delete [] data_;
928 void copy_(
const Vector< ValueType > & v){
936 std::copy(&v[0], &v[v.size()], data_);
942 template <
class ExprOP >
inline void assign_(
const ExprOP & v) {
954 static const Index minSizePerThread = 10000;
955 static const int maxThreads = 8;
957 Index singleCalcCount_;
960template <> DLLEXPORT
void Vector< Pos >::clean();
964 const ElementMatrix < double >& A);
966 const ElementMatrix < double >& A,
const double & a);
968 const ElementMatrix < double >& A,
const Pos & a);
970 const ElementMatrix < double >& A,
const RMatrix & a);
973 const ElementMatrix < double >& A){ THROW_TO_IMPL}
975 const ElementMatrix < double >& A,
const double & a){THROW_TO_IMPL}
977 const ElementMatrix < double >& A,
const Pos & a){THROW_TO_IMPL}
979 const ElementMatrix < double >& A,
const RMatrix & a){THROW_TO_IMPL}
983 const ElementMatrix < double > & A,
const RVector & a);
986 const ElementMatrix < double >& A,
const Vector< double> & a){THROW_TO_IMPL}
992 std::transform(data_, data_ + size_, data_, boost::bind(roundTo< double >, _1, tolerance));
994 for (Index i = 0; i < size_; i ++) data_[i] = roundTo(data_[i], tolerance);
999template<
class ValueType,
class Iter >
class AssignResult{
1002 : a_(&a), iter_(result), start_(start), end_(end){
1005 ValueType * iter = a_->begin().ptr();
1007 for (Index i = start_; i < end_; i++) iter[i] = iter_[i];
1016struct BINASSIGN {
template <
class T >
inline T operator()(
const T & a,
const T & b)
const {
return b; } };
1018template<
class ValueType,
class Iter >
void assignResult(
Vector< ValueType > & v,
const Iter & result) {
1019#ifdef EXPRVEC_USE_TEMPORARY_EXPRESSION
1022 Iter result2 = result;
1025 Iter& result2 = (Iter&)result;
1029#ifdef EXPRVEC_USE_BOOST_THREAD
1032 if (v.nThreads() == 1) {
1035 boost::thread_group threads;
1036 for (Index i = 0; i < v.nThreads(); i ++){
1037 Index start = v.singleCalcCount() * i;
1038 Index end = v.singleCalcCount() * (i + 1);
1039 if (i == v.nThreads() -1) end = v.size();
1040 threads.create_thread(AssignResult< ValueType, Iter >(v, result, start, end));
1045 #ifdef EXPRVEC_USE_STD_ALGORITHM
1047 std::transform(v.begin().ptr(),
1050 v.begin().ptr(), BINASSIGN());
1053 #ifdef EXPRVEC_USE_INDIRECTION
1054 ValueType * iter = v.begin().ptr();
1057 for (Index i = v.size(); i--;) iter[i] = result2[i];
1059 ValueType * iter = v.begin().ptr();
1060 ValueType * end = v.end().ptr();
1065 }
while (++iter != end);
1071template<
class ValueType,
class A >
class __VectorExpr {
1073 __VectorExpr(
const A & a) : iter_(a) { }
1075 inline ValueType operator [] (Index i)
const {
return iter_[i]; }
1077 inline ValueType operator * ()
const {
return *iter_; }
1079 inline void operator ++ () { ++iter_; }
1083 inline Index size()
const {
return iter_.size(); }
1085 A * begin() {
return iter_.begin(); }
1086 A * end() {
return iter_.end(); }
1092template<
class ValueType,
class A,
class Op >
class __VectorUnaryExprOp {
1094 __VectorUnaryExprOp(
const A & a) : iter_(a) { }
1096 inline ValueType operator [] (Index i)
const {
return Op()(iter_[i]); }
1098 inline ValueType operator * ()
const {
return Op()(*iter_); }
1100 inline void operator ++ () { ++iter_; }
1102 inline Index size()
const {
return iter_.size(); }
1108template<
class ValueType,
class A,
class B,
class Op >
class __VectorBinaryExprOp {
1110 __VectorBinaryExprOp(
const A & a,
const B & b) : iter1_(a), iter2_(b) { }
1112 inline ValueType operator [] (Index i)
const {
return Op()(iter1_[i], iter2_[i]); }
1114 inline ValueType operator * ()
const {
return Op()(*iter1_, *iter2_); }
1116 inline void operator ++ () { ++iter1_; ++iter2_; }
1118 inline Index size()
const {
return iter2_.size(); }
1125template<
class ValueType,
class A,
class Op >
class __VectorValExprOp {
1127 __VectorValExprOp(
const A & a,
const ValueType & val) : iter_(a), val_(val) { }
1129 inline ValueType operator [] (Index i)
const {
return Op()(iter_[i], val_); }
1131 inline ValueType operator * ()
const {
return Op()(*iter_, val_); }
1133 inline void operator ++ () { ++iter_; }
1135 inline Index size()
const {
return iter_.size(); }
1142template<
class ValueType,
class A,
class Op >
class __ValVectorExprOp {
1144 __ValVectorExprOp(
const ValueType & val,
const A & a) : iter_(a), val_(val) { }
1146 inline ValueType operator [] (Index i)
const {
return Op()(val_, iter_[i]); }
1148 inline ValueType operator * ()
const {
return Op()(val_, *iter_); }
1150 inline void operator ++ () { ++iter_; }
1152 inline Index size()
const {
return iter_.size(); }
1159#define DEFINE_UNARY_EXPR_OPERATOR__(OP, FUNCT)\
1161template < class T > \
1162__VectorExpr< T, __VectorUnaryExprOp< T, VectorIterator< T >, FUNCT > > \
1163OP(const Vector< T > & a){ \
1164 typedef __VectorUnaryExprOp< T, VectorIterator< T >, FUNCT > ExprT; \
1165 return __VectorExpr< T, ExprT >(ExprT(a.begin())); } \
1167template < class T, class A > \
1168__VectorExpr< T, __VectorUnaryExprOp< T, __VectorExpr< T, A >, FUNCT > > \
1169OP(const __VectorExpr< T, A > & a){ \
1170 typedef __VectorUnaryExprOp< T, __VectorExpr< T, A >, FUNCT > ExprT; \
1171 return __VectorExpr< T, ExprT >(ExprT(a)); \
1174DEFINE_UNARY_EXPR_OPERATOR__(abs, ABS_)
1175DEFINE_UNARY_EXPR_OPERATOR__(acot, ACOT)
1176DEFINE_UNARY_EXPR_OPERATOR__(atan, ATAN)
1177DEFINE_UNARY_EXPR_OPERATOR__(cos, COS)
1178DEFINE_UNARY_EXPR_OPERATOR__(cot, COT)
1179DEFINE_UNARY_EXPR_OPERATOR__(exp, EXP)
1180DEFINE_UNARY_EXPR_OPERATOR__(exp10, EXP10)
1181DEFINE_UNARY_EXPR_OPERATOR__(fabs, ABS_)
1182DEFINE_UNARY_EXPR_OPERATOR__(log, LOG)
1183DEFINE_UNARY_EXPR_OPERATOR__(log10, LOG10)
1184DEFINE_UNARY_EXPR_OPERATOR__(sign, SIGN)
1185DEFINE_UNARY_EXPR_OPERATOR__(sin, SIN)
1186DEFINE_UNARY_EXPR_OPERATOR__(sqrt, SQRT)
1187DEFINE_UNARY_EXPR_OPERATOR__(square, SQR)
1188DEFINE_UNARY_EXPR_OPERATOR__(tan, TAN)
1189DEFINE_UNARY_EXPR_OPERATOR__(tanh, TANH)
1191#undef DEFINE_UNARY_EXPR_OPERATOR__
1193#define DEFINE_EXPR_OPERATOR__(OP, FUNCT) \
1194template < class T > \
1195__VectorExpr< T, __VectorBinaryExprOp< T, VectorIterator< T >, VectorIterator< T >, FUNCT > > \
1196operator OP (const Vector< T > & a, const Vector< T > & b){ \
1197 typedef __VectorBinaryExprOp< T, VectorIterator< T >, VectorIterator< T >, FUNCT > ExprT; \
1198 return __VectorExpr< T, ExprT >(ExprT(a.begin(), b.begin())); \
1201template < class T > \
1202__VectorExpr< T, __VectorValExprOp< T, VectorIterator< T >, FUNCT > > \
1203operator OP (const Vector< T > & a, const T & val){ \
1204 typedef __VectorValExprOp< T, VectorIterator< T >, FUNCT > ExprT; \
1205 return __VectorExpr< T, ExprT >(ExprT(a.begin(), val)); \
1208template < class T > \
1209__VectorExpr< T, __ValVectorExprOp< T, VectorIterator< T >, FUNCT > > \
1210operator OP (const T & val, const Vector< T > & a){ \
1211 typedef __ValVectorExprOp< T, VectorIterator< T >, FUNCT > ExprT; \
1212 return __VectorExpr< T, ExprT >(ExprT(val, a.begin())); \
1215template< class T, class A > \
1216__VectorExpr< T, __VectorBinaryExprOp< T, __VectorExpr< T, A >, VectorIterator< T >, FUNCT > > \
1217operator OP (const __VectorExpr< T, A > & a, const Vector< T > & b){ \
1218 typedef __VectorBinaryExprOp< T, __VectorExpr< T, A >, VectorIterator< T >, FUNCT > ExprT; \
1219 return __VectorExpr< T, ExprT >(ExprT(a, b.begin())); \
1222template< class T, class A > \
1223__VectorExpr< T, __VectorBinaryExprOp< T, VectorIterator< T >, __VectorExpr< T, A >, FUNCT > > \
1224operator OP (const Vector< T > & a, const __VectorExpr< T, A > & b){ \
1225 typedef __VectorBinaryExprOp< T, VectorIterator< T >, __VectorExpr< T, A >, FUNCT > ExprT; \
1226 return __VectorExpr< T, ExprT >(ExprT(a.begin(), b)); \
1229template< class T, class A > \
1230__VectorExpr< T, __VectorValExprOp< T, __VectorExpr< T, A >, FUNCT > > \
1231 operator OP (const __VectorExpr< T, A > & a, const T & val){ \
1232 typedef __VectorValExprOp< T, __VectorExpr< T, A >, FUNCT > ExprT; \
1233 return __VectorExpr< T, ExprT >(ExprT(a, val)); \
1236template< class T, class A > \
1237__VectorExpr< T, __ValVectorExprOp< T, __VectorExpr< T, A >, FUNCT > > \
1238operator OP (const T & val, const __VectorExpr< T, A > & a){ \
1239 typedef __ValVectorExprOp< T, __VectorExpr< T, A >, FUNCT > ExprT; \
1240 return __VectorExpr< T, ExprT >(ExprT(val, a)); \
1243template< class T, class A, class B > \
1244__VectorExpr< T, __VectorBinaryExprOp< T, __VectorExpr< T, A >, __VectorExpr< T, B >, FUNCT > > \
1245operator OP (const __VectorExpr< T, A > & a, const __VectorExpr< T, B > & b){ \
1246 typedef __VectorBinaryExprOp< T, __VectorExpr< T, A >, __VectorExpr< T, B >, FUNCT > ExprT; \
1247 return __VectorExpr< T, ExprT >(ExprT(a, b)); \
1250template< class T, class T2, class A > \
1251 __VectorExpr< T, __VectorValExprOp< T, __VectorExpr< T, A >, FUNCT > > \
1252 operator OP (const __VectorExpr< T, A > & a, const T2 & val){ \
1253 typedef __VectorValExprOp< T, __VectorExpr< T, A >, FUNCT > ExprT; \
1254 return __VectorExpr< T, ExprT >(ExprT(a, (T)val)); \
1257template< class T, class T2, class A > \
1258 __VectorExpr< T, __ValVectorExprOp< T, __VectorExpr< T, A >, FUNCT > > \
1259 operator OP (const T2 & val, const __VectorExpr< T, A > & a){ \
1260 typedef __ValVectorExprOp< T, __VectorExpr< T, A >, FUNCT > ExprT; \
1261 return __VectorExpr< T, ExprT >(ExprT((T)val, a)); \
1264template < class T, class T2 > \
1265 __VectorExpr< T, __ValVectorExprOp< T, VectorIterator< T >, FUNCT > > \
1266 operator OP (const T2 & val, const Vector< T > & a){ \
1267 typedef __ValVectorExprOp< T, VectorIterator< T >, FUNCT > ExprT; \
1268 return __VectorExpr< T, ExprT >(ExprT((T)val, a.begin())); \
1271template < class T, class T2 > \
1272 __VectorExpr< T, __VectorValExprOp< T, VectorIterator< T >, FUNCT > > \
1273 operator OP (const Vector< T > & a, const T2 & val){ \
1274 typedef __VectorValExprOp< T, VectorIterator< T >, FUNCT > ExprT; \
1275 return __VectorExpr< T, ExprT >(ExprT(a.begin(), (T)val)); \
1279DEFINE_EXPR_OPERATOR__(+, PLUS)
1280DEFINE_EXPR_OPERATOR__(-, MINUS)
1281DEFINE_EXPR_OPERATOR__(*, MULT)
1282DEFINE_EXPR_OPERATOR__(/, DIVID)
1284#undef DEFINE_EXPR_OPERATOR__
1294template <
class ValueType >
1296 if (v1.size() != v2.size())
return false;
1297 for (Index i = 0; i < v1.size(); i ++){
1298 if (!isEqual(v1[i], v2[i])) {
1308template <
class ValueType,
class A >
1309bool operator == (
const Vector< ValueType > & v1,
const __VectorExpr< ValueType, A > & v2){
1310 return v1 == Vector< ValueType >(v2);
1314template <
class ValueType >
1316 return (max(abs(v)) < TOLERANCE);
1320template <
class ValueType >
1325template <
class ValueType >
1326bool operator != (
const Vector< ValueType > & v1,
const Vector< ValueType > & v2){
1331template <
class ValueType >
1337template <
class ValueType >
1346inline IndexArray
find(
const BVector & v){
1349 for (Index i = 0; i < v.size(); i ++){
1350 if (v[i]) idx.push_back(i);
1356inline BVector operator ~ (
const BVector & a){
1357 BVector ret(a.size());
1358 for (Index i = 0; i < ret.size(); i ++) ret[i] = !a[i];
1363inline BVector
inv(
const BVector & a){
1368inline BVector operator & (
const BVector & a,
const BVector & b){
1369 BVector ret(a.size());
1370 for (Index i = 0; i < ret.size(); i ++) ret[i] = a[i] && b[i];
1375inline BVector operator | (
const BVector & a,
const BVector & b){
1376 BVector ret(a.size());
1377 for (Index i = 0; i < ret.size(); i ++) ret[i] = a[i] || b[i];
1381inline RVector operator * (
const BVector & a,
const RVector & b){
1382 RVector ret(a.size());
1383 for (Index i = 0; i < ret.size(); i ++) ret[i] = a[i] * b[i];
1387inline RVector operator * (
const RVector & a,
const BVector & b){
1388 RVector ret(a.size());
1389 for (Index i = 0; i < ret.size(); i ++) ret[i] = a[i] * b[i];
1399#define DEFINE_COMPARE_OPERATOR__(OP) \
1400template < class ValueType, class A > BVector \
1401operator OP (const __VectorExpr< ValueType, A > & vec, const ValueType & v){ \
1402 BVector ret(vec.size(), 0); \
1403 for (Index i = 0; i < ret.size(); i ++) ret[i] = vec[i] OP v; \
1406template < class ValueType > BVector \
1407operator OP (const std::vector < ValueType > & vec, const ValueType & v){ \
1408 BVector ret(vec.size(), 0); \
1409 for (Index i = 0; i < ret.size(); i ++) ret[i] = vec[i] OP v; \
1413DEFINE_COMPARE_OPERATOR__(<)
1414DEFINE_COMPARE_OPERATOR__(<=)
1415DEFINE_COMPARE_OPERATOR__(>=)
1416DEFINE_COMPARE_OPERATOR__(==)
1417DEFINE_COMPARE_OPERATOR__(!=)
1418DEFINE_COMPARE_OPERATOR__(>)
1420#undef DEFINE_COMPARE_OPERATOR__
1422#define DEFINE_UNARY_COMPARE_OPERATOR__(OP, FUNCT) \
1423template < class ValueType, class A > \
1424BVector OP(const __VectorExpr< ValueType, A > & vec){ \
1425 BVector ret(vec.size(), 0); \
1426 for (Index i = 0; i < ret.size(); i ++) ret[i] = FUNCT()(vec[i]); \
1429template < class ValueType > \
1430BVector OP (const Vector< ValueType > & vec){ \
1431 BVector ret(vec.size(), 0); \
1432 std::transform(vec.begin().ptr(), vec.end().ptr(), ret.begin().ptr(), FUNCT()); \
1436DEFINE_UNARY_COMPARE_OPERATOR__(isInf, ISINF)
1437DEFINE_UNARY_COMPARE_OPERATOR__(isNaN, ISNAN)
1438DEFINE_UNARY_COMPARE_OPERATOR__(isInfNaN, ISINFNAN)
1440#undef DEFINE_UNARY_COMPARE_OPERATOR__
1442template <
class T > Vector < T > cat(
const Vector< T > & a,
const Vector< T > & b){
1443 Vector < T > c (a.size() + b.size());
1444 std::copy(&a[0], &a[a.size()], &c[0]);
1445 std::copy(&b[0], &b[b.size()], &c[a.size()]);
1449template <
class T,
class A > T sum(
const __VectorExpr< T, A > & a){
1452 for (Index i = 0, imax = a.size(); i < imax; i++) tmp += a[i];
1474inline Complex sum(
const CVector & c){
1475 return std::accumulate(c.begin(), c.end(), Complex(0));
1477inline double sum(
const RVector & r){
1478 return std::accumulate(r.begin(), r.end(),
double(0));
1480inline SIndex sum(
const IVector & i){
1481 return std::accumulate(i.begin(), i.end(), SIndex(0));
1485template <
class T,
class A > T min(
const __VectorExpr< T, A > & a){
return min(Vector< T >(a)); }
1486template <
class T,
class A > T max(
const __VectorExpr< T, A > & a){
return max(Vector< T >(a)); }
1488inline Complex max(
const CVector & v){
1491 for (Index i = 1; i < v.size(); i ++ )
if (v[i] > ret) ret = v[i];
1495inline Complex min(
const CVector & v){
1498 for (Index i = 1; i < v.size(); i ++ )
if (v[i] < ret) ret = v[i];
1502template <
class T > T min(
const Vector < T > & v){
1504 return *std::min_element(&v[0], &v[0] + v.size());
1506template <
class T > T max(
const Vector < T > & v){
1508 return *std::max_element(&v[0], &v[0] + v.size());
1511template <
class T >
void capMax(Vector < T > & v, T max){
1513 for (Index i = 0; i < v.size(); i ++ ) v[i] = min(v[i], max);
1516template <
class T >
void capMin(Vector < T > & v, T min){
1518 for (Index i = 0; i < v.size(); i ++ ) v[i] = max(v[i], min);
1521template <
class ValueType >
1522 ValueType mean(
const Vector < ValueType > & a){
1523 return sum(a) / ValueType(a.size());
1526template <
class ValueType,
class A>
1527 ValueType mean(
const __VectorExpr< ValueType, A > & a){
1528 return sum(a) / a.size();
1531template <
class ValueType > ValueType stdDev(
const Vector < ValueType > & a){
1532 return std::sqrt(sum(square(a - mean(a))) / (
double)(a.size() - 1));
1535template <
class ValueType >
bool haveInfNaN(
const Vector < ValueType > & v){
1536 for (VectorIterator < ValueType > it = v.begin(); it != v.end(); ++it){
1537 if (isInfNaN(*it))
return true;
1542template <
class ValueType > Vector < ValueType > fixZero(
const Vector < ValueType > & v,
const ValueType tol = TOLERANCE){
1543 Vector < ValueType > ret(v);
1544 for (VectorIterator < ValueType > it = ret.begin(); it != ret.end(); ++it){
1545 if (::fabs(*it) < TOLERANCE) *it = tol;
1550template <
class ValueType > Vector < ValueType > round(
const Vector < ValueType > & v, ValueType tol){
1551 return Vector< ValueType >(v).round(tol);
1555Vector < T > fliplr(
const Vector < T > & v){
1556 Vector < T > n(v.size());
1557 for (Index i = 0; i < v.size(); i ++) n[i] = v[v.size() - 1 - i];
1561template <
class T,
class A,
class T2 > Vector < T > pow(
const __VectorExpr< T, A > & a, T2 power){
1562 return pow(Vector< T >(a), power);
1565template <
class T > Vector < T > pow(
const Vector < T > & v,
const Vector < T > & npower){
1566 ASSERT_EQUAL(v.size(), npower.size())
1568 Vector < T > r(v.size());
1569 for (Index i = 0; i < v.size(); i ++) r[i] = std::pow(v[i], T(npower[i]));
1573template < class T > Vector < T > pow(const Vector < T > & v,
double npower){
1574 Vector < T > r(v.size());
1575 for (Index i = 0; i < v.size(); i ++){
1576 r[i] = std::pow(v[i], T(npower));
1582template <
class T > Vector < T > pow(
const Vector < T > & v,
int npower){
1583 return pow(v, (
double)npower);
1586template <
class T > Vector< T > sort(
const Vector < T > & a){
1587 #ifndef PYGIMLI_CAST
1588 std::vector < T > tmp(a.size(), 0.0) ;
1589 for (Index i = 0; i < a.size(); i ++) tmp[i] = a[i];
1590 std::sort(tmp.begin(), tmp.end());
1592 Vector < T > ret(tmp);
1597 return Vector < T > (0);
1606 std::vector < T > tmp(a.size()), u;
1607 for (Index i = 0; i < a.size(); i ++) tmp[i] = a[i];
1608 std::unique_copy(tmp.begin(), tmp.end(), back_inserter(u));
1610 Vector < T > ret(u);
1613 return Vector < T >(0);
1618template<
class ValueType >
struct indexCmp {
1619 indexCmp(
const Vector < ValueType > & arr) : arr_(arr) {}
1620 bool operator()(
const Index a,
const Index b)
const {
1621 return arr_[a] < arr_[b];
1623 const Vector < ValueType > & arr_;
1626template <
class ValueType >
1627void sort(
const Vector < ValueType > & unsorted,
1628 Vector < ValueType > & sorted,
1629 IndexArray & indexMap){
1631 indexMap.
resize(unsorted.size());
1633 for (Index i=0; i < unsorted.size(); i++) indexMap[i] = i;
1637 std::vector < Index > tmp(indexMap.size(), 0.0) ;
1638 for (Index i = 0; i < indexMap.size(); i ++) tmp[i] = indexMap[i];
1640 for (Index i = 0; i < indexMap.size(); i ++) indexMap[i] = tmp[i];
1642 sorted = unsorted(indexMap);
1645template <
class ValueType >
1646IndexArray sortIdx(
const Vector < ValueType > & unsorted){
1647 IndexArray indexMap;
1648 Vector < ValueType > sorted;
1649 sort(unsorted, sorted, indexMap);
1661std::ostream & operator << (std::ostream & str,
const std::vector < T > & vec){
1662 for (Index i = 0; i < vec.size(); i ++) str << vec[i] <<
" ";
1667std::ostream & operator << (std::ostream & str,
const Vector < T > & vec){
1668 for (Index i = 0; i < vec.size(); i ++) str << vec[i] <<
" ";
1675template <
class ValueType >
1677 const ValueType & last, Index n){
1678 if (abs(a) < 1e-12){
1679 throwError(
"Can't create increasing range for start value of: " +
1684 throwError(
"start and end need to be different: " +
1685 str(a) +
" " + str(last));
1688 if (sign(a) != sign(last)){
1689 throwError(
"Can't create increasing range from [0 " + str(a) +
" to " + str(last) +
"]");
1693 throwError(
"need at least n > 2" + str(a) +
" n(" + str(n) +
") "+ str(last));
1697 ValueType
x = (last- (n-1) * a) / (n-2);
1700 RVector
y(n);
y.fill(x__ * a);
1701 for (Index i = 2; i < n; i ++ )
y[i] +=
x*(i-1);
1709template <
class ValueType >
1711 const ValueType & last, Index n){
1712 if (sign(first) != sign(last)){
1713 throwError(
"cant increase range from [0 " + str(first) +
" to " + str(last) +
"]");
1717 RVector
y(n + 1);
y.fill(x__);
1719 ValueType dy = (last - first * n) / (sum(
y) - ValueType(n));
1726 ValueType yval = 0.0;
1727 for (Index i = 0; i < n; i ++){
1728 yval = yval + first + dy * i;
1736template <
class ValueType >
1737Vector < std::complex < ValueType > > toComplex(
const Vector < ValueType > & re,
1738 const Vector < ValueType > & im){
1739 Vector < std::complex < ValueType > > cv(re.size());
1740 for (Index i = 0; i < cv.size(); i ++)
1741 cv[i] = std::complex < ValueType >(re[i], im[i]);
1755inline CVector toComplex(
const RVector & re,
double im=0.){
1756 return toComplex(re, RVector(re.size(), im));
1758inline CVector toComplex(
double re,
const RVector & im){
1759 return toComplex(RVector(im.size(), re), im);
1766 log(Warning,
"polarToComplex .. Do not use me" );
1767 ASSERT_EQUAL(mag.size(), phi.size())
1771 return toComplex(RVector(mag * cos(phi)), RVector(-mag * sin(phi)));
1775template <
class ValueType >
1776Vector < std::complex < ValueType > > operator * (
const Vector < std::complex< ValueType > > & cv,
1777 const Vector < ValueType > & v){
1778 return cv * toComplex(v);
1781template <
class ValueType >
1782Vector < std::complex < ValueType > > operator * (
const Vector < ValueType > & v,
1783 const Vector < std::complex< ValueType > > & cv){
1784 return cv * toComplex(v);
1787template <
class ValueType >
1788Vector < std::complex < ValueType > > operator / (
const std::complex< ValueType > & v,
1789 const Vector < std::complex< ValueType > > & cv){
1790 Vector < std::complex< ValueType > > ret(cv.size());
1791 for (Index i = 0; i < ret.size(); i ++ ) {
1797template <
class ValueType >
1798Vector < std::complex < ValueType > > operator / (
const ValueType & v,
1799 const Vector < std::complex< ValueType > > & cv){
1800 return std::complex< ValueType >(v) / cv;
1803template <
class ValueType,
class A >
1804Vector < ValueType > real(
const __VectorExpr< std::complex< ValueType >, A > & a){
1805 return real(Vector < std::complex< ValueType > >(a));
1808template <
class ValueType >
1809Vector < ValueType > real(
const Vector < std::complex< ValueType > > & cv){
1810 Vector < ValueType > v(cv.size());
1811 for (Index i = 0; i < cv.size(); i ++) v[i] = cv[i].real();
1815template <
class ValueType,
class A >
1816Vector < ValueType > imag(
const __VectorExpr< std::complex< ValueType >, A > & a){
1817 return imag(Vector < std::complex< ValueType > >(a));
1820template <
class ValueType >
1821Vector < ValueType > imag(
const Vector < std::complex< ValueType > > & cv){
1822 Vector < ValueType > v(cv.size());
1823 for (Index i = 0; i < cv.size(); i ++) v[i] = cv[i].imag();
1827template <
class ValueType,
class A >
1828Vector < ValueType > angle(
const __VectorExpr< std::complex< ValueType >, A > & a){
1829 return angle(Vector < std::complex< ValueType > >(a));
1832template <
class ValueType >
1833Vector < ValueType > angle(
const Vector < std::complex< ValueType > > & z){
1834 Vector < ValueType > v(
z.size());
1835 for (Index i = 0; i <
z.size(); i ++) v[i] = std::atan2(imag(z[i]), real(z[i]));
1839inline RVector angle(
const RVector & b,
const RVector & a){
1840 ASSERT_EQUAL_SIZE(b, a)
1841 RVector v(b.size());
1842 for (Index i = 0; i < b.size(); i ++) v[i] = std::atan2(b[i], a[i]);
1846template <
class ValueType >
1847Vector < ValueType > phase(
const Vector < std::complex< ValueType > > & z){
1848 Vector < ValueType > v(
z.size());
1849 for (Index i = 0; i <
z.size(); i ++) v[i] = std::arg(z[i]);
1854template <
class ValueType,
class A >
1855Vector < ValueType > abs(
const __VectorExpr< std::complex< ValueType >, A > & a){
1856 return abs(Vector < std::complex< ValueType > >(a));
1859template <
class ValueType >
1860Vector < ValueType > abs(
const Vector < std::complex< ValueType > > & cv){
1861 return sqrt(real(cv * conj(cv)));
1864template <
class ValueType,
class A >
1865Vector < std::complex< ValueType > > conj(
const __VectorExpr< std::complex< ValueType >, A > & a){
1866 return conj(Vector < std::complex< ValueType > >(a));
1869template <
class ValueType >
1870Vector < std::complex< ValueType > > conj(
const Vector < std::complex< ValueType > > & cv){
1871 Vector < std::complex< ValueType > > v(cv.size());
1872 for (Index i = 0; i < cv.size(); i ++) v[i] = conj(cv[i]);
1876inline RVector TmpToRealHACK(
const RVector & v){
return v; }
1877inline RVector TmpToRealHACK(
const CVector & v){ __M
return real(v); }
1879#define DEFINE_SCALAR_COMPLEX_BINARY_OPERATOR(OP) \
1880template <class T, class U > \
1881inline std::complex< T > operator OP (const std::complex< T > & lhs, const U & rhs) { \
1882 std::complex< T > ret; \
1883 return ret OP##= rhs; \
1886DEFINE_SCALAR_COMPLEX_BINARY_OPERATOR(*)
1887DEFINE_SCALAR_COMPLEX_BINARY_OPERATOR(/)
1888DEFINE_SCALAR_COMPLEX_BINARY_OPERATOR(-)
1889DEFINE_SCALAR_COMPLEX_BINARY_OPERATOR(+)
1891#undef DEFINE_SCALAR_COMPLEX_BINARY_OPERATOR
1893inline IVector toIVector(
const RVector & v){
1894 IVector ret(v.size());
1895 for (Index i = 0; i < ret.size(); i ++) ret[i] =
int(v[i]);
1899template <
class ValueType >
1900bool save(
const Vector< ValueType > & a,
const std::string & filename,
1901 IOFormat format=Ascii){
1902 return saveVec(a, filename, format);
1905template <
class ValueType >
1906bool load(Vector< ValueType > & a,
const std::string & filename,
1907 IOFormat format = Ascii,
1909 return loadVec(a, filename, format, verbose);
1915template <
class ValueType >
1918 return a.
save(filename, format);
1924template <
class ValueType >
1926 const std::string & filename,
1928 return a.
load(filename, format);
1935 template<>
struct hash< std::complex < double > > {
1936 GIMLI::Index operator()(
const std::complex < double > & p)
const noexcept {
1937 return GIMLI::hash(p.real(), p.imag());
1940 template<>
struct hash<
GIMLI::RVector > {
1941 GIMLI::Index operator()(
const GIMLI::RVector & p)
const noexcept {
1945 template<>
struct hash<
GIMLI::IndexArray > {
1946 GIMLI::Index operator()(
const GIMLI::IndexArray & p)
const noexcept {
1950 template<>
struct hash<
GIMLI::IVector > {
1951 GIMLI::Index operator()(
const GIMLI::IVector & p)
const noexcept {
1955 template<>
struct hash< std::map< std::string, GIMLI::RVector > > {
1956 GIMLI::Index operator()(
const std::map< std::string, GIMLI::RVector > & p)
const noexcept {
1957 GIMLI::Index seed = 0;
1959 hashCombine(seed, x.first, x.second);
Definition expressions.h:214
3 dimensional vector
Definition pos.h:73
ValueType nextVal()
Definition vector.h:160
One dimensional array aka Vector of limited size.
Definition vector.h:186
Vector(Index n, const ValueType &val)
Definition vector.h:214
void reserve(Index n)
Definition vector.h:711
Vector< ValueType > & setVal(const Vector< ValueType > &vals, const IndexArray &ids)
Definition vector.h:468
bool save(const std::string &filename, IOFormat format=Ascii) const
Definition vector.h:809
const double & getVal(Index i) const
Definition vector.h:587
void add(const ElementMatrix< double > &A, const Vector< double > &scale)
Definition vector.h:985
Vector(const std::vector< ValueType > &v)
Definition vector.h:259
Vector< ValueType > & addVal(const Vector< ValueType > &vals, Index start, Index end)
Definition vector.h:527
Vector< ValueType > & setVal(const ValueType &val, const std::pair< Index, SIndex > &pair)
Definition vector.h:454
Vector< ValueType > & setVal(const ValueType &val, Index start, SIndex end)
Definition vector.h:443
Vector(const Vector< ValueType > &v)
Definition vector.h:231
Vector< ValueType > & setVal(const Vector< ValueType > &vals, const std::pair< Index, SIndex > &pair)
Definition vector.h:516
void clean()
Definition vector.h:770
Vector< ValueType > & setVal(const Vector< ValueType > &vals, Index start, Index end)
Definition vector.h:492
~Vector()
Definition vector.h:275
void add(const ElementMatrix< double > &A, const Pos &scale)
Definition vector.h:976
Vector< ValueType > & setVal(const ValueType &val, const IndexArray &ids)
Definition vector.h:460
Vector< ValueType > & setVal(const Vector< ValueType > &vals, Index start)
Definition vector.h:479
Vector< ValueType > copy() const
Definition vector.h:299
Vector(const Vector< ValueType > &v, Index start, Index end)
Definition vector.h:240
Vector(const std::string &filename, IOFormat format=Ascii)
Definition vector.h:223
Vector< ValueType > & fill(const ValueType &val)
Definition vector.h:744
Vector< ValueType > & round(const ValueType &tolerance)
Definition vector.h:778
Vector< double > & fill(V *val)
Definition vector.h:737
void add(const ElementMatrix< double > &A, const double &scale)
Definition vector.h:974
Vector< ValueType > & addVal(const Vector< ValueType > &vals, const IndexArray &idx)
Definition vector.h:553
void clear()
Definition vector.h:775
Vector< ValueType > & setVal(const ValueType &val)
Definition vector.h:417
Vector< ValueType > & addVal(const ValueType &val, Index i)
Definition vector.h:563
Vector(const __VectorExpr< ValueType, A > &v)
Definition vector.h:249
void add(const ElementMatrix< double > &A, const RMatrix &scale)
Definition vector.h:978
void resize(Index n, double fill)
Definition vector.h:698
Vector< ValueType > & setVal(const ValueType &val, Index i)
Definition vector.h:433
Vector()
Definition vector.h:198
void add(const ElementMatrix< double > &A)
Definition vector.h:972
bool load(const std::string &filename, IOFormat format=Ascii)
Definition vector.h:857
Vector< ValueType > & setVal(const ValueType &val, const BVector &bv)
Definition vector.h:425
Vector< ValueType > & fill(Expr< Ex > expr)
Definition vector.h:748
GIMLi main namespace for the Geophyiscal Inversion and Modelling Library.
Definition baseentity.h:24
Vector< ValueType > increasingRange(const ValueType &first, const ValueType &last, Index n)
Definition vector.h:1710
void hashCombine(Index &seed, const T &val)
Definition gimli.h:655
Matrix3< ValueType > inv(const Matrix3< ValueType > &A)
Definition matrix.h:1051
RVector y(const R3Vector &rv)
Definition pos.cpp:114
RVector x(const R3Vector &rv)
Definition pos.cpp:107
RVector z(const R3Vector &rv)
Definition pos.cpp:120
bool nonZero(const Vector< ValueType > &v)
Definition vector.h:1321
CVector polarToComplex(const RVector &mag, const RVector &phi, bool mRad=false)
Definition vector.h:1764
bool loadVec(Vector< ValueType > &a, const std::string &filename, IOFormat format=Ascii)
Definition vector.h:1925
Vector< T > unique(const Vector< T > &a)
Definition vector.h:1604
bool zero(const Vector< ValueType > &v)
Definition vector.h:1315
bool saveVec(const Vector< ValueType > &a, const std::string &filename, IOFormat format=Ascii)
Definition vector.h:1916
IndexArray find(const BVector &v)
Definition vector.h:1346
Vector< ValueType > increasingRange2(const ValueType &a, const ValueType &last, Index n)
Definition vector.h:1676
IOFormat
Definition gimli.h:289
bool load(Matrix< ValueType > &A, const std::string &filename)
Definition matrix.h:828