GNU Octave  4.2.1
A high-level interpreted language, primarily intended for numerical computations, mostly compatible with Matlab
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Properties Friends Macros Pages
fMatrix.h
Go to the documentation of this file.
1 /*
2 
3 Copyright (C) 1994-2017 John W. Eaton
4 
5 This file is part of Octave.
6 
7 Octave is free software; you can redistribute it and/or modify it
8 under the terms of the GNU General Public License as published by the
9 Free Software Foundation; either version 3 of the License, or (at your
10 option) any later version.
11 
12 Octave is distributed in the hope that it will be useful, but WITHOUT
13 ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
14 FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
15 for more details.
16 
17 You should have received a copy of the GNU General Public License
18 along with Octave; see the file COPYING. If not, see
19 <http://www.gnu.org/licenses/>.
20 
21 */
22 
23 #if ! defined (octave_fMatrix_h)
24 #define octave_fMatrix_h 1
25 
26 #include "octave-config.h"
27 
28 #include "fNDArray.h"
29 #include "MArray.h"
30 #include "MDiagArray2.h"
31 #include "MatrixType.h"
32 
33 #include "mx-defs.h"
34 #include "mx-op-decl.h"
35 #include "DET.h"
36 
37 class
38 OCTAVE_API
40 {
41 public:
42 
45 
48 
51 
54 
55  typedef float real_elt_type;
57 
58  typedef void (*solve_singularity_handler) (float rcon);
59 
60  FloatMatrix (void) : FloatNDArray () { }
61 
63  : FloatNDArray (dim_vector (r, c)) { }
64 
66  : FloatNDArray (dim_vector (r, c), val) { }
67 
68  FloatMatrix (const dim_vector& dv) : FloatNDArray (dv.redim (2)) { }
69 
70  FloatMatrix (const dim_vector& dv, float val)
71  : FloatNDArray (dv.redim (2), val) { }
72 
74 
75  template <typename U>
77 
78  template <typename U>
80 
81  explicit FloatMatrix (const FloatRowVector& rv);
82 
83  explicit FloatMatrix (const FloatColumnVector& cv);
84 
85  explicit FloatMatrix (const FloatDiagMatrix& a);
86 
87  explicit FloatMatrix (const MDiagArray2<float>& a);
88 
89  explicit FloatMatrix (const DiagArray2<float>& a);
90 
91  explicit FloatMatrix (const PermMatrix& a);
92 
93  explicit FloatMatrix (const boolMatrix& a);
94 
95  explicit FloatMatrix (const charMatrix& a);
96 
97  bool operator == (const FloatMatrix& a) const;
98  bool operator != (const FloatMatrix& a) const;
99 
100  bool is_symmetric (void) const;
101 
102  // destructive insert/delete/reorder operations
103 
104  FloatMatrix& insert (const FloatMatrix& a,
112 
113  FloatMatrix& fill (float val);
116 
117  FloatMatrix append (const FloatMatrix& a) const;
118  FloatMatrix append (const FloatRowVector& a) const;
119  FloatMatrix append (const FloatColumnVector& a) const;
120  FloatMatrix append (const FloatDiagMatrix& a) const;
121 
122  FloatMatrix stack (const FloatMatrix& a) const;
123  FloatMatrix stack (const FloatRowVector& a) const;
124  FloatMatrix stack (const FloatColumnVector& a) const;
125  FloatMatrix stack (const FloatDiagMatrix& a) const;
126 
127  friend OCTAVE_API FloatMatrix real (const FloatComplexMatrix& a);
128  friend OCTAVE_API FloatMatrix imag (const FloatComplexMatrix& a);
129 
130  friend class FloatComplexMatrix;
131 
132  FloatMatrix hermitian (void) const { return MArray<float>::transpose (); }
133  FloatMatrix transpose (void) const { return MArray<float>::transpose (); }
134 
135  // resize is the destructive equivalent for this one
136 
138  octave_idx_type r2, octave_idx_type c2) const;
139 
141  octave_idx_type nr, octave_idx_type nc) const;
142 
143  // extract row or column i.
144 
146 
148 
149  void resize (octave_idx_type nr, octave_idx_type nc, float rfv = 0)
150  {
151  MArray<float>::resize (dim_vector (nr, nc), rfv);
152  }
153 
154 private:
156  float& rcon, bool force, bool calc_cond) const;
157 
159  float& rcon, bool force, bool calc_cond) const;
160 
161 public:
162  FloatMatrix inverse (void) const;
163  FloatMatrix inverse (octave_idx_type& info) const;
164  FloatMatrix inverse (octave_idx_type& info, float& rcon, bool force = false,
165  bool calc_cond = true) const;
166 
167  FloatMatrix inverse (MatrixType &mattype) const;
168  FloatMatrix inverse (MatrixType &mattype, octave_idx_type& info) const;
169  FloatMatrix inverse (MatrixType &mattype, octave_idx_type& info, float& rcon,
170  bool force = false, bool calc_cond = true) const;
171 
172  FloatMatrix pseudo_inverse (float tol = 0.0) const;
173 
174  FloatComplexMatrix fourier (void) const;
175  FloatComplexMatrix ifourier (void) const;
176 
177  FloatComplexMatrix fourier2d (void) const;
178  FloatComplexMatrix ifourier2d (void) const;
179 
180  FloatDET determinant (void) const;
181  FloatDET determinant (octave_idx_type& info) const;
182  FloatDET determinant (octave_idx_type& info, float& rcon,
183  bool calc_cond = true) const;
185  float& rcon, bool calc_cond = true) const;
186 
187  float rcond (void) const;
188  float rcond (MatrixType &mattype) const;
189 
190 private:
191  // Upper triangular matrix solvers
193  octave_idx_type& info,
194  float& rcon, solve_singularity_handler sing_handler,
195  bool calc_cond = false,
196  blas_trans_type transt = blas_no_trans) const;
197 
198  // Lower triangular matrix solvers
200  octave_idx_type& info,
201  float& rcon, solve_singularity_handler sing_handler,
202  bool calc_cond = false,
203  blas_trans_type transt = blas_no_trans) const;
204 
205  // Full matrix solvers (lu/cholesky)
206  FloatMatrix fsolve (MatrixType &typ, const FloatMatrix& b,
207  octave_idx_type& info,
208  float& rcon, solve_singularity_handler sing_handler,
209  bool calc_cond = false) const;
210 
211 public:
212  // Generic interface to solver with no probing of type
213  FloatMatrix solve (MatrixType &typ, const FloatMatrix& b) const;
214  FloatMatrix solve (MatrixType &typ, const FloatMatrix& b,
215  octave_idx_type& info) const;
216  FloatMatrix solve (MatrixType &typ, const FloatMatrix& b,
217  octave_idx_type& info, float& rcon) const;
218  FloatMatrix solve (MatrixType &typ, const FloatMatrix& b,
219  octave_idx_type& info, float& rcon,
220  solve_singularity_handler sing_handler,
221  bool singular_fallback = true,
222  blas_trans_type transt = blas_no_trans) const;
223 
226  octave_idx_type& info) const;
228  octave_idx_type& info, float& rcon) const;
230  octave_idx_type& info, float& rcon,
231  solve_singularity_handler sing_handler,
232  bool singular_fallback = true,
233  blas_trans_type transt = blas_no_trans) const;
234 
237  octave_idx_type& info) const;
239  octave_idx_type& info, float& rcon) const;
241  octave_idx_type& info, float& rcon,
242  solve_singularity_handler sing_handler,
243  blas_trans_type transt = blas_no_trans) const;
244 
246  const FloatComplexColumnVector& b) const;
249  octave_idx_type& info) const;
252  octave_idx_type& info, float& rcon) const;
255  octave_idx_type& info, float& rcon,
256  solve_singularity_handler sing_handler,
257  blas_trans_type transt = blas_no_trans) const;
258 
259  // Generic interface to solver with probing of type
260  FloatMatrix solve (const FloatMatrix& b) const;
261  FloatMatrix solve (const FloatMatrix& b, octave_idx_type& info) const;
263  float& rcon) const;
264  FloatMatrix solve (const FloatMatrix& b, octave_idx_type& info, float& rcon,
265  solve_singularity_handler sing_handler,
266  blas_trans_type transt = blas_no_trans) const;
267 
270  octave_idx_type& info) const;
272  float& rcon) const;
274  float& rcon,
275  solve_singularity_handler sing_handler,
276  blas_trans_type transt = blas_no_trans) const;
277 
280  octave_idx_type& info) const;
282  float& rcon) const;
284  float& rcon,
285  solve_singularity_handler sing_handler,
286  blas_trans_type transt = blas_no_trans) const;
287 
290  octave_idx_type& info) const;
292  octave_idx_type& info,
293  float& rcon) const;
295  octave_idx_type& info,
296  float& rcon,
297  solve_singularity_handler sing_handler,
298  blas_trans_type transt = blas_no_trans) const;
299 
300  // Singular solvers
301  FloatMatrix lssolve (const FloatMatrix& b) const;
302  FloatMatrix lssolve (const FloatMatrix& b, octave_idx_type& info) const;
304  octave_idx_type& rank) const;
306  octave_idx_type& rank, float& rcon) const;
307 
310  octave_idx_type& info) const;
312  octave_idx_type& info,
313  octave_idx_type& rank) const;
315  octave_idx_type& info, octave_idx_type& rank,
316  float &rcon) const;
317 
320  octave_idx_type& info) const;
322  octave_idx_type& rank) const;
324  octave_idx_type& rank, float& rcon) const;
325 
328  octave_idx_type& info) const;
330  octave_idx_type& info,
331  octave_idx_type& rank) const;
333  octave_idx_type& info,
334  octave_idx_type& rank, float& rcon) const;
335 
338 
339  FloatMatrix cumprod (int dim = -1) const;
340  FloatMatrix cumsum (int dim = -1) const;
341  FloatMatrix prod (int dim = -1) const;
342  FloatMatrix sum (int dim = -1) const;
343  FloatMatrix sumsq (int dim = -1) const;
344  FloatMatrix abs (void) const;
345 
346  FloatMatrix diag (octave_idx_type k = 0) const;
347 
349 
350  FloatColumnVector row_min (void) const;
351  FloatColumnVector row_max (void) const;
352 
355 
356  FloatRowVector column_min (void) const;
357  FloatRowVector column_max (void) const;
358 
361 
362  // i/o
363 
364  friend OCTAVE_API std::ostream& operator << (std::ostream& os,
365  const FloatMatrix& a);
366  friend OCTAVE_API std::istream& operator >> (std::istream& is,
367  FloatMatrix& a);
368 };
369 
370 // Publish externally used friend functions.
371 
372 extern OCTAVE_API FloatMatrix real (const FloatComplexMatrix& a);
373 extern OCTAVE_API FloatMatrix imag (const FloatComplexMatrix& a);
374 
375 // column vector by row vector -> matrix operations
376 
377 extern OCTAVE_API FloatMatrix operator * (const FloatColumnVector& a,
378  const FloatRowVector& b);
379 
380 // Other functions.
381 
382 extern OCTAVE_API FloatMatrix Givens (float, float);
383 
384 extern OCTAVE_API FloatMatrix Sylvester (const FloatMatrix&, const FloatMatrix&,
385  const FloatMatrix&);
386 
387 extern OCTAVE_API FloatMatrix xgemm (const FloatMatrix& a, const FloatMatrix& b,
389  blas_trans_type transb = blas_no_trans);
390 
391 extern OCTAVE_API FloatMatrix operator * (const FloatMatrix& a,
392  const FloatMatrix& b);
393 
394 extern OCTAVE_API FloatMatrix min (float d, const FloatMatrix& m);
395 extern OCTAVE_API FloatMatrix min (const FloatMatrix& m, float d);
396 extern OCTAVE_API FloatMatrix min (const FloatMatrix& a, const FloatMatrix& b);
397 
398 extern OCTAVE_API FloatMatrix max (float d, const FloatMatrix& m);
399 extern OCTAVE_API FloatMatrix max (const FloatMatrix& m, float d);
400 extern OCTAVE_API FloatMatrix max (const FloatMatrix& a, const FloatMatrix& b);
401 
402 extern OCTAVE_API FloatMatrix linspace (const FloatColumnVector& x1,
403  const FloatColumnVector& x2,
404  octave_idx_type n);
405 
406 MS_CMP_OP_DECLS (FloatMatrix, float, OCTAVE_API)
407 MS_BOOL_OP_DECLS (FloatMatrix, float, OCTAVE_API)
408 
409 SM_CMP_OP_DECLS (float, FloatMatrix, OCTAVE_API)
410 SM_BOOL_OP_DECLS (float, FloatMatrix, OCTAVE_API)
411 
412 MM_CMP_OP_DECLS (FloatMatrix, FloatMatrix, OCTAVE_API)
413 MM_BOOL_OP_DECLS (FloatMatrix, FloatMatrix, OCTAVE_API)
414 
415 MARRAY_FORWARD_DEFS (MArray, FloatMatrix, float)
416 
417 template <typename T>
418 void read_int (std::istream& is, bool swap_bytes, T& val);
419 
420 #endif
static void swap_bytes(void *ptr, unsigned int i, unsigned int j)
Definition: byte-swap.h:29
Array< FloatComplex > as_matrix(void) const
Return the array as a matrix.
Definition: Array.h:387
FloatComplexRowVector column_min(void) const
Definition: fCMatrix.cc:3109
OCTAVE_API FloatMatrix Sylvester(const FloatMatrix &, const FloatMatrix &, const FloatMatrix &)
Definition: fMatrix.cc:2780
FloatComplexMatrix solve(MatrixType &typ, const FloatMatrix &b) const
Definition: fCMatrix.cc:2016
FloatComplexMatrix extract(octave_idx_type r1, octave_idx_type c1, octave_idx_type r2, octave_idx_type c2) const
Definition: fCMatrix.cc:689
void resize(octave_idx_type nr, octave_idx_type nc, float rfv=0)
Definition: fMatrix.h:149
void(* solve_singularity_handler)(float rcon)
Definition: fCMatrix.h:59
OCTAVE_EXPORT octave_value_list column
Definition: sparse.cc:123
FloatMatrix(const dim_vector &dv, float val)
Definition: fMatrix.h:70
bool operator!=(const dim_vector &a, const dim_vector &b)
Definition: dim-vector.h:567
float real_elt_type
Definition: fMatrix.h:55
FloatMatrix(const FloatMatrix &a)
Definition: fMatrix.h:73
FloatMatrix(octave_idx_type r, octave_idx_type c, float val)
Definition: fMatrix.h:65
std::istream & operator>>(std::istream &is, SparseBoolMatrix &a)
Definition: boolSparse.cc:279
FloatComplex complex_elt_type
Definition: fMatrix.h:56
FloatComplexMatrix tinverse(MatrixType &mattype, octave_idx_type &info, float &rcon, bool force, bool calc_cond) const
Definition: fCMatrix.cc:760
FloatComplexMatrix fsolve(MatrixType &typ, const FloatComplexMatrix &b, octave_idx_type &info, float &rcon, solve_singularity_handler sing_handler, bool calc_cond=false) const
Definition: fCMatrix.cc:1822
identity matrix If supplied two scalar respectively For allows like xample val
Definition: data.cc:5068
FloatColumnVector real_column_vector_type
Definition: fMatrix.h:46
FloatMatrix transpose(void) const
Definition: fMatrix.h:133
for large enough k
Definition: lu.cc:606
FloatMatrix(octave_idx_type r, octave_idx_type c)
Definition: fMatrix.h:62
STL namespace.
MArray< T > transpose(void) const
Definition: MArray.h:103
FloatMatrix hermitian(void) const
Definition: fMatrix.h:132
FloatMatrix(void)
Definition: fMatrix.h:60
FloatColumnVector column_vector_type
Definition: fMatrix.h:43
Template for N-dimensional array classes with like-type math operators.
Definition: MArray.h:32
#define SM_CMP_OP_DECLS(S, M, API)
Definition: mx-op-decl.h:114
FloatComplexMatrix inverse(void) const
Definition: fCMatrix.cc:720
FloatComplexMatrix lssolve(const FloatMatrix &b) const
Definition: fCMatrix.cc:2312
#define MARRAY_FORWARD_DEFS(B, R, T)
Definition: MArray.h:126
void read_int(std::istream &is, bool swap_bytes, T &val)
OCTAVE_API FloatMatrix xgemm(const FloatMatrix &a, const FloatMatrix &b, blas_trans_type transa=blas_no_trans, blas_trans_type transb=blas_no_trans)
Definition: fMatrix.cc:2858
F77_RET_T F77_REAL &F77_RET_T F77_DBLE &F77_RET_T F77_REAL &F77_RET_T F77_DBLE &F77_RET_T F77_REAL &F77_RET_T F77_DBLE &F77_RET_T const F77_REAL const F77_REAL F77_REAL &F77_RET_T const F77_DBLE const F77_DBLE F77_DBLE &F77_RET_T F77_REAL &F77_RET_T F77_DBLE &F77_RET_T F77_DBLE &F77_RET_T F77_REAL &F77_RET_T F77_REAL &F77_RET_T F77_DBLE &F77_RET_T const F77_DBLE F77_DBLE &F77_RET_T const F77_REAL F77_REAL &F77_RET_T F77_REAL F77_REAL &F77_RET_T F77_DBLE F77_DBLE &F77_RET_T const F77_DBLE const F77_DBLE F77_DBLE * d
FloatDiagMatrix real_diag_matrix_type
Definition: fMatrix.h:52
FloatComplexMatrix cumprod(int dim=-1) const
Definition: fCMatrix.cc:2864
calling an anonymous function involves an overhead quite comparable to the overhead of an m file function Passing a handle to a built in function is because the interpreter is not involved in the internal loop For a
Definition: cellfun.cc:398
FloatComplexMatrix diag(octave_idx_type k=0) const
Definition: fCMatrix.cc:2899
FloatComplexMatrix pseudo_inverse(float tol=0.0) const
Definition: fCMatrix.cc:938
FloatMatrix(const dim_vector &dv)
Definition: fMatrix.h:68
OCTAVE_API FloatMatrix Givens(float, float)
Definition: fMatrix.cc:2763
FloatComplexMatrix fourier2d(void) const
Definition: fCMatrix.cc:1040
OCTAVE_API FloatMatrix real(const FloatComplexMatrix &a)
Definition: fMatrix.cc:392
#define SM_BOOL_OP_DECLS(S, M, API)
Definition: mx-op-decl.h:122
nd deftypefn *octave_map m
Definition: ov-struct.cc:2058
Definition: DET.h:33
#define MM_CMP_OP_DECLS(M1, M2, API)
Definition: mx-op-decl.h:139
#define MM_BOOL_OP_DECLS(M1, M2, API)
Definition: mx-op-decl.h:147
FloatComplexColumnVector row_min(void) const
Definition: fCMatrix.cc:2959
void resize(const dim_vector &dv, const T &rfv)
Definition: Array.cc:1028
bool append
Definition: load-save.cc:1582
FloatComplexMatrix sum(int dim=-1) const
Definition: fCMatrix.cc:2882
OCTAVE_API FloatMatrix imag(const FloatComplexMatrix &a)
Definition: fMatrix.cc:398
static M ltsolve(const SM &L, const ColumnVector &Q, const M &m)
Definition: eigs-base.cc:79
FloatComplexMatrix sumsq(int dim=-1) const
Definition: fCMatrix.cc:2888
FloatMatrix(const MArray< U > &a)
Definition: fMatrix.h:76
FloatMatrix real_matrix_type
Definition: fMatrix.h:49
FloatComplexMatrix cumsum(int dim=-1) const
Definition: fCMatrix.cc:2870
the sparsity preserving column transformation such that that defines the pivoting threshold can be given in which case it defines the c
Definition: lu.cc:138
FloatComplexMatrix ifourier(void) const
Definition: fCMatrix.cc:1011
FloatComplexColumnVector stack(const FloatColumnVector &a) const
Definition: fCColVector.cc:178
bool operator==(const dim_vector &a, const dim_vector &b)
Definition: dim-vector.h:538
FloatRowVector real_row_vector_type
Definition: fMatrix.h:47
FloatComplexRowVector column_max(void) const
Definition: fCMatrix.cc:3184
#define MS_CMP_OP_DECLS(M, S, API)
Definition: mx-op-decl.h:89
N Dimensional Array with copy-on-write semantics.
Definition: Array.h:126
OCTAVE_API FloatMatrix linspace(const FloatColumnVector &x1, const FloatColumnVector &x2, octave_idx_type n)
Definition: fMatrix.cc:3083
FloatComplexMatrix prod(int dim=-1) const
Definition: fCMatrix.cc:2876
=val(i)}if ode{val(i)}occurs in table i
Definition: lookup.cc:239
OCTAVE_EXPORT octave_value_list return the value of the option it must match the dimension of the state and the relative tolerance must also be a vector of the same length tem it must match the dimension of the state and the absolute tolerance must also be a vector of the same length The local error test applied at each integration step is xample roup abs(local error in x(i))<
FloatMatrix operator+=(FloatMatrix &x, const float &y)
Definition: fMatrix.h:415
template OCTAVE_API std::ostream & operator<<(std::ostream &, const Array< bool > &)
FloatRowVector row_vector_type
Definition: fMatrix.h:44
OCTAVE_API FloatMatrix max(float d, const FloatMatrix &m)
Definition: fMatrix.cc:3020
FloatComplexMatrix fourier(void) const
Definition: fCMatrix.cc:982
#define MS_BOOL_OP_DECLS(M, S, API)
Definition: mx-op-decl.h:97
b
Definition: cellfun.cc:398
static M utsolve(const SM &U, const ColumnVector &Q, const M &m)
Definition: eigs-base.cc:106
FloatComplexColumnVector & fill(float val)
Definition: fCColVector.cc:102
FloatComplexColumnVector & insert(const FloatColumnVector &a, octave_idx_type r)
Definition: fCColVector.cc:63
std::complex< float > FloatComplex
Definition: oct-cmplx.h:32
blas_trans_type
Definition: mx-defs.h:103
FloatComplexColumnVector row_max(void) const
Definition: fCMatrix.cc:3034
FloatComplexDET determinant(void) const
Definition: fCMatrix.cc:1298
float rcond(void) const
Definition: fCMatrix.cc:1458
FloatComplexMatrix ifourier2d(void) const
Definition: fCMatrix.cc:1054
FloatMatrix operator-=(FloatMatrix &x, const float &y)
Definition: fMatrix.h:415
write the output to stdout if nargout is
Definition: load-save.cc:1576
OCTAVE_API FloatMatrix min(float d, const FloatMatrix &m)
Definition: fMatrix.cc:2956
Vector representing the dimensions (size) of an Array.
Definition: dim-vector.h:87
FloatComplexMatrix complex_matrix_type
Definition: fMatrix.h:50
FloatComplexMatrix finverse(MatrixType &mattype, octave_idx_type &info, float &rcon, bool force, bool calc_cond) const
Definition: fCMatrix.cc:815
OCTAVE_API FloatMatrix operator*(const FloatColumnVector &a, const FloatRowVector &b)
Definition: fMatrix.cc:2420
FloatComplexMatrix extract_n(octave_idx_type r1, octave_idx_type c1, octave_idx_type nr, octave_idx_type nc) const
Definition: fCMatrix.cc:699
dim_vector dv
Definition: sub2ind.cc:263
FloatMatrix(const Array< U > &a)
Definition: fMatrix.h:79
where the brackets indicate optional arguments and and character or cell array For character arrays the conversion is repeated for every row
Definition: str2double.cc:342
Array< FloatComplex > index(const idx_vector &i) const
Indexing without resizing.
FloatComplexDiagMatrix complex_diag_matrix_type
Definition: fMatrix.h:53