GNU Octave  4.4.1
A high-level interpreted language, primarily intended for numerical computations, mostly compatible with Matlab
fMatrix.h
Go to the documentation of this file.
1 /*
2 
3 Copyright (C) 1994-2018 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
9 the Free Software Foundation, either version 3 of the License, or
10 (at your option) any later version.
11 
12 Octave is distributed in the hope that it will be useful, but
13 WITHOUT ANY WARRANTY; without even the implied warranty of
14 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 GNU General Public License 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 <https://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 "DET.h"
29 #include "MArray.h"
30 #include "MDiagArray2.h"
31 #include "MatrixType.h"
32 #include "fNDArray.h"
33 #include "mx-defs.h"
34 #include "mx-op-decl.h"
35 
36 class
37 OCTAVE_API
39 {
40 public:
41 
44 
47 
50 
53 
54  typedef float real_elt_type;
56 
57  typedef void (*solve_singularity_handler) (float rcon);
58 
59  FloatMatrix (void) : FloatNDArray () { }
60 
62  : FloatNDArray (dim_vector (r, c)) { }
63 
65  : FloatNDArray (dim_vector (r, c), val) { }
66 
67  FloatMatrix (const dim_vector& dv) : FloatNDArray (dv.redim (2)) { }
68 
69  FloatMatrix (const dim_vector& dv, float val)
70  : FloatNDArray (dv.redim (2), val) { }
71 
73 
74  template <typename U>
76 
77  template <typename U>
79 
80  explicit FloatMatrix (const FloatRowVector& rv);
81 
82  explicit FloatMatrix (const FloatColumnVector& cv);
83 
84  explicit FloatMatrix (const FloatDiagMatrix& a);
85 
86  explicit FloatMatrix (const MDiagArray2<float>& a);
87 
88  explicit FloatMatrix (const DiagArray2<float>& a);
89 
90  explicit FloatMatrix (const PermMatrix& a);
91 
92  explicit FloatMatrix (const boolMatrix& a);
93 
94  explicit FloatMatrix (const charMatrix& a);
95 
96  bool operator == (const FloatMatrix& a) const;
97  bool operator != (const FloatMatrix& a) const;
98 
99  bool issymmetric (void) const;
100 
101  OCTAVE_DEPRECATED (4.4, "use 'issymmetric' instead")
102  bool is_symmetric (void) const
103  { return issymmetric (); }
104 
105  // destructive insert/delete/reorder operations
106 
107  FloatMatrix& insert (const FloatMatrix& a,
115 
116  FloatMatrix& fill (float val);
119 
120  FloatMatrix append (const FloatMatrix& a) const;
121  FloatMatrix append (const FloatRowVector& a) const;
122  FloatMatrix append (const FloatColumnVector& a) const;
123  FloatMatrix append (const FloatDiagMatrix& a) const;
124 
125  FloatMatrix stack (const FloatMatrix& a) const;
126  FloatMatrix stack (const FloatRowVector& a) const;
127  FloatMatrix stack (const FloatColumnVector& a) const;
128  FloatMatrix stack (const FloatDiagMatrix& a) const;
129 
130  friend OCTAVE_API FloatMatrix real (const FloatComplexMatrix& a);
131  friend OCTAVE_API FloatMatrix imag (const FloatComplexMatrix& a);
132 
133  friend class FloatComplexMatrix;
134 
135  FloatMatrix hermitian (void) const { return MArray<float>::transpose (); }
136  FloatMatrix transpose (void) const { return MArray<float>::transpose (); }
137 
138  // resize is the destructive equivalent for this one
139 
141  octave_idx_type r2, octave_idx_type c2) const;
142 
144  octave_idx_type nr, octave_idx_type nc) const;
145 
146  // extract row or column i.
147 
149 
151 
152  void resize (octave_idx_type nr, octave_idx_type nc, float rfv = 0)
153  {
154  MArray<float>::resize (dim_vector (nr, nc), rfv);
155  }
156 
157 private:
159  float& rcon, bool force, bool calc_cond) const;
160 
162  float& rcon, bool force, bool calc_cond) const;
163 
164 public:
165  FloatMatrix inverse (void) const;
166  FloatMatrix inverse (octave_idx_type& info) const;
167  FloatMatrix inverse (octave_idx_type& info, float& rcon, bool force = false,
168  bool calc_cond = true) const;
169 
170  FloatMatrix inverse (MatrixType& mattype) const;
171  FloatMatrix inverse (MatrixType& mattype, octave_idx_type& info) const;
172  FloatMatrix inverse (MatrixType& mattype, octave_idx_type& info, float& rcon,
173  bool force = false, bool calc_cond = true) const;
174 
175  FloatMatrix pseudo_inverse (float tol = 0.0) const;
176 
177  FloatComplexMatrix fourier (void) const;
178  FloatComplexMatrix ifourier (void) const;
179 
180  FloatComplexMatrix fourier2d (void) const;
181  FloatComplexMatrix ifourier2d (void) const;
182 
183  FloatDET determinant (void) const;
184  FloatDET determinant (octave_idx_type& info) const;
185  FloatDET determinant (octave_idx_type& info, float& rcon,
186  bool calc_cond = true) const;
188  float& rcon, bool calc_cond = true) const;
189 
190  float rcond (void) const;
191  float rcond (MatrixType& mattype) const;
192 
193 private:
194  // Upper triangular matrix solvers
195  FloatMatrix utsolve (MatrixType& mattype, const FloatMatrix& b,
196  octave_idx_type& info,
197  float& rcon, solve_singularity_handler sing_handler,
198  bool calc_cond = false,
199  blas_trans_type transt = blas_no_trans) const;
200 
201  // Lower triangular matrix solvers
202  FloatMatrix ltsolve (MatrixType& mattype, const FloatMatrix& b,
203  octave_idx_type& info,
204  float& rcon, solve_singularity_handler sing_handler,
205  bool calc_cond = false,
206  blas_trans_type transt = blas_no_trans) const;
207 
208  // Full matrix solvers (lu/cholesky)
209  FloatMatrix fsolve (MatrixType& mattype, const FloatMatrix& b,
210  octave_idx_type& info,
211  float& rcon, solve_singularity_handler sing_handler,
212  bool calc_cond = false) const;
213 
214 public:
215  // Generic interface to solver with no probing of type
216  FloatMatrix solve (MatrixType& mattype, const FloatMatrix& b) const;
217  FloatMatrix solve (MatrixType& mattype, const FloatMatrix& b,
218  octave_idx_type& info) const;
219  FloatMatrix solve (MatrixType& mattype, const FloatMatrix& b,
220  octave_idx_type& info, float& rcon) const;
221  FloatMatrix solve (MatrixType& mattype, const FloatMatrix& b,
222  octave_idx_type& info, float& rcon,
223  solve_singularity_handler sing_handler,
224  bool singular_fallback = true,
225  blas_trans_type transt = blas_no_trans) const;
226 
228  const FloatComplexMatrix& b) const;
230  octave_idx_type& info) const;
232  octave_idx_type& info, float& rcon) const;
234  octave_idx_type& info, float& rcon,
235  solve_singularity_handler sing_handler,
236  bool singular_fallback = true,
237  blas_trans_type transt = blas_no_trans) const;
238 
239  FloatColumnVector solve (MatrixType& mattype, const FloatColumnVector& b) const;
241  octave_idx_type& info) const;
243  octave_idx_type& info, float& rcon) const;
245  octave_idx_type& info, float& rcon,
246  solve_singularity_handler sing_handler,
247  blas_trans_type transt = blas_no_trans) const;
248 
250  const FloatComplexColumnVector& b) const;
253  octave_idx_type& info) const;
256  octave_idx_type& info, float& rcon) const;
259  octave_idx_type& info, float& rcon,
260  solve_singularity_handler sing_handler,
261  blas_trans_type transt = blas_no_trans) const;
262 
263  // Generic interface to solver with probing of type
264  FloatMatrix solve (const FloatMatrix& b) const;
265  FloatMatrix solve (const FloatMatrix& b, octave_idx_type& info) const;
267  float& rcon) const;
268  FloatMatrix solve (const FloatMatrix& b, octave_idx_type& info, float& rcon,
269  solve_singularity_handler sing_handler,
270  blas_trans_type transt = blas_no_trans) const;
271 
274  octave_idx_type& info) const;
276  float& rcon) const;
278  float& rcon,
279  solve_singularity_handler sing_handler,
280  blas_trans_type transt = blas_no_trans) const;
281 
284  octave_idx_type& info) const;
286  float& rcon) const;
288  float& rcon,
289  solve_singularity_handler sing_handler,
290  blas_trans_type transt = blas_no_trans) const;
291 
294  octave_idx_type& info) const;
296  octave_idx_type& info,
297  float& rcon) const;
299  octave_idx_type& info,
300  float& rcon,
301  solve_singularity_handler sing_handler,
302  blas_trans_type transt = blas_no_trans) const;
303 
304  // Singular solvers
305  FloatMatrix lssolve (const FloatMatrix& b) const;
306  FloatMatrix lssolve (const FloatMatrix& b, octave_idx_type& info) const;
308  octave_idx_type& rank) const;
310  octave_idx_type& rank, float& rcon) const;
311 
314  octave_idx_type& info) const;
316  octave_idx_type& info,
317  octave_idx_type& rank) const;
319  octave_idx_type& info, octave_idx_type& rank,
320  float& rcon) const;
321 
324  octave_idx_type& info) const;
326  octave_idx_type& rank) const;
328  octave_idx_type& rank, float& rcon) const;
329 
332  octave_idx_type& info) const;
334  octave_idx_type& info,
335  octave_idx_type& rank) const;
337  octave_idx_type& info,
338  octave_idx_type& rank, float& rcon) const;
339 
342 
343  FloatMatrix cumprod (int dim = -1) const;
344  FloatMatrix cumsum (int dim = -1) const;
345  FloatMatrix prod (int dim = -1) const;
346  FloatMatrix sum (int dim = -1) const;
347  FloatMatrix sumsq (int dim = -1) const;
348  FloatMatrix abs (void) const;
349 
350  FloatMatrix diag (octave_idx_type k = 0) const;
351 
353 
354  FloatColumnVector row_min (void) const;
355  FloatColumnVector row_max (void) const;
356 
359 
360  FloatRowVector column_min (void) const;
361  FloatRowVector column_max (void) const;
362 
365 
366  // i/o
367 
368  friend OCTAVE_API std::ostream& operator << (std::ostream& os,
369  const FloatMatrix& a);
370  friend OCTAVE_API std::istream& operator >> (std::istream& is,
371  FloatMatrix& a);
372 };
373 
374 // Publish externally used friend functions.
375 
376 extern OCTAVE_API FloatMatrix real (const FloatComplexMatrix& a);
377 extern OCTAVE_API FloatMatrix imag (const FloatComplexMatrix& a);
378 
379 // column vector by row vector -> matrix operations
380 
381 extern OCTAVE_API FloatMatrix operator * (const FloatColumnVector& a,
382  const FloatRowVector& b);
383 
384 // Other functions.
385 
386 extern OCTAVE_API FloatMatrix Givens (float, float);
387 
388 extern OCTAVE_API FloatMatrix Sylvester (const FloatMatrix&, const FloatMatrix&,
389  const FloatMatrix&);
390 
391 extern OCTAVE_API FloatMatrix xgemm (const FloatMatrix& a, const FloatMatrix& b,
393  blas_trans_type transb = blas_no_trans);
394 
395 extern OCTAVE_API FloatMatrix operator * (const FloatMatrix& a,
396  const FloatMatrix& b);
397 
398 extern OCTAVE_API FloatMatrix min (float d, const FloatMatrix& m);
399 extern OCTAVE_API FloatMatrix min (const FloatMatrix& m, float d);
400 extern OCTAVE_API FloatMatrix min (const FloatMatrix& a, const FloatMatrix& b);
401 
402 extern OCTAVE_API FloatMatrix max (float d, const FloatMatrix& m);
403 extern OCTAVE_API FloatMatrix max (const FloatMatrix& m, float d);
404 extern OCTAVE_API FloatMatrix max (const FloatMatrix& a, const FloatMatrix& b);
405 
406 extern OCTAVE_API FloatMatrix linspace (const FloatColumnVector& x1,
407  const FloatColumnVector& x2,
408  octave_idx_type n);
409 
410 MS_CMP_OP_DECLS (FloatMatrix, float, OCTAVE_API)
411 MS_BOOL_OP_DECLS (FloatMatrix, float, OCTAVE_API)
412 
413 SM_CMP_OP_DECLS (float, FloatMatrix, OCTAVE_API)
414 SM_BOOL_OP_DECLS (float, FloatMatrix, OCTAVE_API)
415 
418 
420 
421 template <typename T>
422 void read_int (std::istream& is, bool swap_bytes, T& val);
423 
424 #endif
static void swap_bytes(void *ptr, unsigned int i, unsigned int j)
Definition: byte-swap.h:29
FloatComplexMatrix finverse(MatrixType &mattype, octave_idx_type &info, float &rcon, bool force, bool calc_cond) const
Definition: fCMatrix.cc:838
OCTAVE_API FloatMatrix Sylvester(const FloatMatrix &, const FloatMatrix &, const FloatMatrix &)
Definition: fMatrix.cc:2889
void resize(octave_idx_type nr, octave_idx_type nc, float rfv=0)
Definition: fMatrix.h:152
OCTAVE_EXPORT octave_value_list column
Definition: sparse.cc:123
Template for N-dimensional array classes with like-type math operators.
Definition: MArray.h:32
FloatMatrix(const dim_vector &dv, float val)
Definition: fMatrix.h:69
bool operator!=(const dim_vector &a, const dim_vector &b)
Definition: dim-vector.h:566
float real_elt_type
Definition: fMatrix.h:54
FloatComplexMatrix diag(octave_idx_type k=0) const
Definition: fCMatrix.cc:3025
FloatMatrix(const FloatMatrix &a)
Definition: fMatrix.h:72
FloatMatrix(octave_idx_type r, octave_idx_type c, float val)
Definition: fMatrix.h:64
FloatComplexColumnVector stack(const FloatColumnVector &a) const
Definition: fCColVector.cc:177
std::istream & operator>>(std::istream &is, SparseBoolMatrix &a)
Definition: boolSparse.cc:279
FloatComplex complex_elt_type
Definition: fMatrix.h:55
FloatComplexMatrix fourier2d(void) const
Definition: fCMatrix.cc:1081
identity matrix If supplied two scalar respectively For allows like xample val
Definition: data.cc:4986
FloatColumnVector real_column_vector_type
Definition: fMatrix.h:45
for large enough k
Definition: lu.cc:617
FloatMatrix(octave_idx_type r, octave_idx_type c)
Definition: fMatrix.h:61
STL namespace.
static T abs(T x)
Definition: pr-output.cc:1696
FloatMatrix(void)
Definition: fMatrix.h:59
float rcond(void) const
Definition: fCMatrix.cc:1517
FloatComplexMatrix pseudo_inverse(float tol=0.0) const
Definition: fCMatrix.cc:978
FloatColumnVector column_vector_type
Definition: fMatrix.h:42
#define SM_CMP_OP_DECLS(S, M, API)
Definition: mx-op-decl.h:114
nd example oindent opens the file binary numeric values will be read assuming they are stored in IEEE format with the least significant bit and then converted to the native representation Opening a file that is already open simply opens it again and returns a separate file id It is not an error to open a file several though writing to the same file through several different file ids may produce unexpected results The possible values of text mode reading and writing automatically converts linefeeds to the appropriate line end character for the you may append a you must also open the file in binary mode The parameter conversions are currently only supported for and permissions will be set to and then everything is written in a single operation This is very efficient and improves performance c
Definition: file-io.cc:587
MArray< T > transpose(void) const
Definition: MArray.h:103
FloatComplexRowVector column_min(void) const
Definition: fCMatrix.cc:3235
FloatComplexMatrix extract(octave_idx_type r1, octave_idx_type c1, octave_idx_type r2, octave_idx_type c2) const
Definition: fCMatrix.cc:685
Array< FloatComplex > as_matrix(void) const
Return the array as a matrix.
Definition: Array.h:390
#define MARRAY_FORWARD_DEFS(B, R, T)
Definition: MArray.h:126
void read_int(std::istream &is, bool swap_bytes, T &val)
FloatComplexMatrix lssolve(const FloatMatrix &b) const
Definition: fCMatrix.cc:2409
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:2967
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 const F77_DBLE F77_DBLE &F77_RET_T const F77_REAL F77_REAL &F77_RET_T const F77_DBLE const F77_DBLE F77_DBLE * d
FloatDiagMatrix real_diag_matrix_type
Definition: fMatrix.h:51
FloatMatrix hermitian(void) const
Definition: fMatrix.h:135
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:400
FloatMatrix(const dim_vector &dv)
Definition: fMatrix.h:67
FloatComplexMatrix sumsq(int dim=-1) const
Definition: fCMatrix.cc:3014
FloatComplexMatrix fourier(void) const
Definition: fCMatrix.cc:1023
OCTAVE_API FloatMatrix Givens(float, float)
Definition: fMatrix.cc:2872
FloatComplexMatrix inverse(void) const
Definition: fCMatrix.cc:739
Array< FloatComplex > index(const idx_vector &i) const
Indexing without resizing.
Definition: Array.cc:697
OCTAVE_API FloatMatrix real(const FloatComplexMatrix &a)
Definition: fMatrix.cc:390
FloatComplexDET determinant(void) const
Definition: fCMatrix.cc:1341
#define SM_BOOL_OP_DECLS(S, M, API)
Definition: mx-op-decl.h:122
Definition: DET.h:34
#define MM_CMP_OP_DECLS(M1, M2, API)
Definition: mx-op-decl.h:139
FloatComplexMatrix tinverse(MatrixType &mattype, octave_idx_type &info, float &rcon, bool force, bool calc_cond) const
Definition: fCMatrix.cc:779
#define MM_BOOL_OP_DECLS(M1, M2, API)
Definition: mx-op-decl.h:147
void(* solve_singularity_handler)(float rcon)
Definition: fCMatrix.h:58
void resize(const dim_vector &dv, const T &rfv)
Resizing (with fill).
Definition: Array.cc:1010
bool append
Definition: load-save.cc:1618
FloatComplexMatrix cumprod(int dim=-1) const
Definition: fCMatrix.cc:2990
OCTAVE_API FloatMatrix imag(const FloatComplexMatrix &a)
Definition: fMatrix.cc:396
static M ltsolve(const SM &L, const ColumnVector &Q, const M &m)
Definition: eigs-base.cc:80
FloatMatrix(const MArray< U > &a)
Definition: fMatrix.h:75
FloatMatrix real_matrix_type
Definition: fMatrix.h:48
FloatMatrix transpose(void) const
Definition: fMatrix.h:136
bool operator==(const dim_vector &a, const dim_vector &b)
Definition: dim-vector.h:550
FloatRowVector real_row_vector_type
Definition: fMatrix.h:46
#define MS_CMP_OP_DECLS(M, S, API)
Definition: mx-op-decl.h:89
FloatComplexMatrix fsolve(MatrixType &mattype, const FloatComplexMatrix &b, octave_idx_type &info, float &rcon, solve_singularity_handler sing_handler, bool calc_cond=false) const
Definition: fCMatrix.cc:1895
N Dimensional Array with copy-on-write semantics.
Definition: Array.h:125
OCTAVE_API FloatMatrix linspace(const FloatColumnVector &x1, const FloatColumnVector &x2, octave_idx_type n)
Definition: fMatrix.cc:3192
FloatComplexColumnVector row_max(void) const
Definition: fCMatrix.cc:3160
FloatComplexMatrix ifourier2d(void) const
Definition: fCMatrix.cc:1095
FloatMatrix operator+=(FloatMatrix &x, const float &y)
Definition: fMatrix.h:419
template OCTAVE_API std::ostream & operator<<(std::ostream &, const Array< bool > &)
FloatRowVector row_vector_type
Definition: fMatrix.h:43
OCTAVE_API FloatMatrix max(float d, const FloatMatrix &m)
Definition: fMatrix.cc:3129
FloatComplexMatrix cumsum(int dim=-1) const
Definition: fCMatrix.cc:2996
#define MS_BOOL_OP_DECLS(M, S, API)
Definition: mx-op-decl.h:97
b
Definition: cellfun.cc:400
static M utsolve(const SM &U, const ColumnVector &Q, const M &m)
Definition: eigs-base.cc:100
FloatComplexMatrix extract_n(octave_idx_type r1, octave_idx_type c1, octave_idx_type nr, octave_idx_type nc) const
Definition: fCMatrix.cc:695
FloatComplexColumnVector & fill(float val)
Definition: fCColVector.cc:101
for i
Definition: data.cc:5264
FloatComplexColumnVector & insert(const FloatColumnVector &a, octave_idx_type r)
Definition: fCColVector.cc:62
std::complex< float > FloatComplex
Definition: oct-cmplx.h:32
blas_trans_type
Definition: mx-defs.h:105
FloatComplexMatrix prod(int dim=-1) const
Definition: fCMatrix.cc:3002
FloatComplexMatrix sum(int dim=-1) const
Definition: fCMatrix.cc:3008
FloatMatrix operator-=(FloatMatrix &x, const float &y)
Definition: fMatrix.h:419
write the output to stdout if nargout is
Definition: load-save.cc:1612
FloatComplexColumnVector row_min(void) const
Definition: fCMatrix.cc:3085
FloatComplexRowVector column_max(void) const
Definition: fCMatrix.cc:3310
OCTAVE_API FloatMatrix min(float d, const FloatMatrix &m)
Definition: fMatrix.cc:3065
Vector representing the dimensions (size) of an Array.
Definition: dim-vector.h:87
FloatComplexMatrix complex_matrix_type
Definition: fMatrix.h:49
FloatComplexMatrix ifourier(void) const
Definition: fCMatrix.cc:1052
OCTAVE_API FloatMatrix operator*(const FloatColumnVector &a, const FloatRowVector &b)
Definition: fMatrix.cc:2529
dim_vector dv
Definition: sub2ind.cc:263
octave::stream os
Definition: file-io.cc:627
FloatMatrix(const Array< U > &a)
Definition: fMatrix.h:78
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
FloatComplexDiagMatrix complex_diag_matrix_type
Definition: fMatrix.h:52
FloatComplexMatrix solve(MatrixType &mattype, const FloatMatrix &b) const
Definition: fCMatrix.cc:2106