xvector.h
Go to the documentation of this file.
1 #pragma once
2 #include "xerror.h"
3 #include "xoutput.h"
4 #include "xdefs.h"
5 #include "xvector7.h"
6 #include <algorithm>
7 #include <array>
8 #include <cmath>
9 #include <functional>
10 #include <gsl/gsl_blas.h>
11 #include <gsl/gsl_linalg.h>
12 #include <gsl/gsl_vector.h>
13 #include <initializer_list>
14 #include <iterator>
15 #include <numeric>
16 #include <optional>
17 #include <vector>
18 
19 namespace nmx::gsl {
20 
21 using namespace nmx::gsl::vec;
22 
23 class Vector;
24 
29 class VView : public IVBase<VView>,
30  public IVCalc<VView>,
31  public IVProperties<VView>,
32  public IVCalc1<Vector, VView>,
33  public IVBlas<VView>
34 
35 {
36 private:
37  gsl_vector_view _view; //gsl-Struktur
38 
39 public:
44  VView(gsl_vector_view v) { _view = v; }
45 
51  VView(size_t dim, double f[]) { //
52  _view = gsl_vector_view_array(f, dim);
53  }
54 
59  inline const gsl_vector *gsl() const { return &_view.vector; }
60 
65  inline gsl_vector *gsl() { return &_view.vector; }
66 }; //VView
67 
68 } // namespace nmx::gsl
69 
70 namespace nmx::gsl {
71 
76 class Vector : public IVBase<Vector>,
77  public IVCalc<Vector>,
78  public IVStl<Vector>,
79  public IVProperties<Vector>,
80  public IVCalc1<Vector, Vector>,
81  public IVBlas<Vector>,
82  public IVMinMax<Vector>
83 {
84 public:
85  using View = VView; //Synonym
86 
87 private:
88  gsl_vector *_vector = nullptr; // gsl-Struktur
89 
90 public:
94  inline Vector() {}
95 
100  inline explicit Vector(size_t dim, double val = 0) {
101  //reserviere Speicher
102  _vector = gsl_vector_alloc(dim);
103  //setze alle Elemente gleich einem vorgegebenen Wert
104  gsl_vector_set_all(_vector, val);
105  }
106 
111  inline Vector(std::initializer_list<double> lst)
112  : Vector(lst.size()) {
113  std::copy(ALL(lst), begin());
114  }
115 
121  inline Vector(size_t n, const double f[])
122  : Vector(n) {
123  std::copy(f, f + n, begin());
124  }
125 
130  inline Vector(const Vector &v)
131  : Vector(v.size()) {
132  std::copy(ALL(v), begin());
133  }
134 
139  inline Vector(Vector &&v) {
140  std::swap(_vector, v._vector);
141  v._vector = nullptr;
142  }
143 
147  inline ~Vector() {
148  if (_vector != nullptr) {
149  gsl_vector_free(_vector);
150  }
151  }
152 
158  inline Vector &operator=(const Vector &v) {
159  if (&v != this) {
160  if (_vector != nullptr) {
161  gsl_vector_free(_vector);
162  }
163  _vector = gsl_vector_alloc(v.size());
164  std::copy(ALL(v), begin());
165  }
166  return *this;
167  }
168 
174  inline Vector &operator=(Vector &&v) {
175  if (&v != this) {
176  if (_vector != nullptr) {
177  //gebe alten Speicher frei
178  gsl_vector_free(_vector);
179  //der Zeiger ist ab jetzt ungültig
180  _vector = nullptr;
181  }
182  //vertausche Zeiger
183  std::swap(_vector, v._vector);
184  }
185  return *this;
186  }
187 
192  inline const gsl_vector *gsl() const {
193  //ist der Zeiger gültig?
194  Check::ptr(nmx_msg, _vector);
195  return _vector;
196  }
197 
202  inline gsl_vector *gsl() {
203  //ist der Zeiger gültig?
204  Check::ptr(nmx_msg, _vector);
205  return _vector;
206  }
207 
214  inline View view(size_t offset, size_t n) {
215  return View(gsl_vector_subvector(gsl(), offset, n));
216  }
217 
225  inline View view(size_t offset, size_t stride, size_t n) {
226  return View(gsl_vector_subvector_with_stride(gsl(), //
227  offset,
228  stride,
229  n));
230  }
231 
237  inline bool empty() const { //
238  return _vector != nullptr && size() != 0;
239  }
240 
245  inline bool is_init() const { return _vector != nullptr; }
246 }; //Vector
247 
248 } // namespace nmx::gsl
The IVCalc struct Komponente implementiert Operatoren +=,-=,*=,/=.
Definition: xvector2.h:14
Vector(size_t n, const double f[])
Vector Konstruktor: kopiere Inhalt eines C-Feldes.
Definition: xvector.h:121
const gsl_vector * gsl() const
gsl ermöglicht direkten Zugriff auf gsl-Funktionen
Definition: xvector.h:192
static void ptr(const std::string &s, T *ptr)
null_ptr teste Zeiger auf Gültigkeit
Definition: xerror.h:98
Vector(const Vector &v)
Vector Kopierkonstruktor.
Definition: xvector.h:130
View view(size_t offset, size_t stride, size_t n)
view erzeuge View auf Daten
Definition: xvector.h:225
Vector & operator=(Vector &&v)
operator = übernehme Daten eines Vektors
Definition: xvector.h:174
size_t size() const
size
Definition: xvector1.h:25
Vector(std::initializer_list< double > lst)
Vector Konstruktor:kopiere eine Liste von Zahlen.
Definition: xvector.h:111
The IVBlas struct Schnittstellen zur BLAS für das Rechnen mit Vektoren oder Views.
Definition: xvector7.h:14
Vector()
Vector leerer Vektor.
Definition: xvector.h:94
#define nmx_msg
Definition: xerror.h:113
LU::Vector Vector
Definition: x038.h:10
The IVBase struct Basisfunktionalität für eine Vektor-Klasse.
Definition: xvector1.h:15
gsl_vector * gsl()
gsl_vec ermöglicht direkten Zugriff auf gsl Funktionen
Definition: xvector.h:65
Vector & operator=(const Vector &v)
operator = kopiere die Werte eines Vektors
Definition: xvector.h:158
Vector(size_t dim, double val=0)
Vector Konstruktor: Vektor mit reservierten Speicher.
Definition: xvector.h:100
The IVCalc1 class Implementierung von +,-,*,/ (binär)
Definition: xvector3.h:11
gsl_vector * gsl()
gsl ermöglicht direkten Zugriff auf gsl-Funktionen
Definition: xvector.h:202
The IVEqual class Informationen über die Elemente eines Vektors und Vergleichsoperatoren.
Definition: xvector6.h:12
View view(size_t offset, size_t n)
view erzeuge View auf Daten
Definition: xvector.h:214
bool is_init() const
is_init
Definition: xvector.h:245
The IVMinMax class Suche minimales,maximales Element.
Definition: xvector5.h:11
The Vector class Klasse für gsl-Vektoren zussamengesetzt aus Komponenten.
Definition: xvector.h:76
const gsl_vector * gsl() const
gsl_vec ermöglicht direkten Zugriff auf gsl Funktionen
Definition: xvector.h:59
Vector(Vector &&v)
Vector move-Konstruktor.
Definition: xvector.h:139
#define ALL(x)
bool empty() const
empty
Definition: xvector.h:237
The VView class Klasse für Sichten zusammengesetzt aus Komponenten.
Definition: xvector.h:29
VView(gsl_vector_view v)
VView Konstruktor.
Definition: xvector.h:44
double f(double x, void *params)
f
Definition: x035.h:15
VView(size_t dim, double f[])
VView Konstruktor.
Definition: xvector.h:51
The IVStl class Schnittstelle zur Standard Template Library.
Definition: xvector4.h:11