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
op-fcm-fcm.cc
Go to the documentation of this file.
1 /*
2 
3 Copyright (C) 1996-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 (HAVE_CONFIG_H)
24 # include "config.h"
25 #endif
26 
27 #include "errwarn.h"
28 #include "ovl.h"
29 #include "ov.h"
30 #include "ov-cx-mat.h"
31 #include "ov-flt-cx-mat.h"
32 #include "ov-typeinfo.h"
33 #include "ov-null-mat.h"
34 #include "ops.h"
35 #include "xdiv.h"
36 #include "xpow.h"
37 
38 // unary complex matrix ops.
39 
40 DEFNDUNOP_OP (not, float_complex_matrix, float_complex_array, !)
41 DEFNDUNOP_OP (uplus, float_complex_matrix, float_complex_array, /* no-op */)
42 DEFNDUNOP_OP (uminus, float_complex_matrix, float_complex_array, -)
43 
44 DEFUNOP (transpose, float_complex_matrix)
45 {
47  = dynamic_cast<const octave_float_complex_matrix&> (a);
48 
49  if (v.ndims () > 2)
50  error ("transpose not defined for N-D objects");
51 
53 }
54 
55 DEFUNOP (hermitian, float_complex_matrix)
56 {
58  = dynamic_cast<const octave_float_complex_matrix&> (a);
59 
60  if (v.ndims () > 2)
61  error ("complex-conjugate transpose not defined for N-D objects");
62 
64 }
65 
66 DEFNCUNOP_METHOD (incr, float_complex_matrix, increment)
67 DEFNCUNOP_METHOD (decr, float_complex_matrix, decrement)
68 DEFNCUNOP_METHOD (changesign, float_complex_matrix, changesign)
69 
70 // complex matrix by complex matrix ops.
71 
72 DEFNDBINOP_OP (add, float_complex_matrix, float_complex_matrix,
73  float_complex_array, float_complex_array, +)
74 DEFNDBINOP_OP (sub, float_complex_matrix, float_complex_matrix,
75  float_complex_array, float_complex_array, -)
76 
77 DEFBINOP_OP (mul, float_complex_matrix, float_complex_matrix, *)
78 
79 DEFBINOP (div, float_complex_matrix, float_complex_matrix)
80 {
82  = dynamic_cast<const octave_float_complex_matrix&> (a1);
84  = dynamic_cast<const octave_float_complex_matrix&> (a2);
85  MatrixType typ = v2.matrix_type ();
86 
88  v2.float_complex_matrix_value (), typ);
89 
90  v2.matrix_type (typ);
91  return ret;
92 }
93 
94 DEFBINOPX (pow, float_complex_matrix, float_complex_matrix)
95 {
96  error ("can't do A ^ B for A and B both matrices");
97 }
98 
99 DEFBINOP (ldiv, float_complex_matrix, float_complex_matrix)
100 {
102  = dynamic_cast<const octave_float_complex_matrix&> (a1);
104  = dynamic_cast<const octave_float_complex_matrix&> (a2);
105  MatrixType typ = v1.matrix_type ();
106 
108  v2.float_complex_matrix_value (), typ);
109 
110  v1.matrix_type (typ);
111  return ret;
112 }
113 
114 DEFBINOP (trans_mul, float_complex_matrix, float_complex_matrix)
115 {
117  = dynamic_cast<const octave_float_complex_matrix&> (a1);
119  = dynamic_cast<const octave_float_complex_matrix&> (a2);
123 }
124 
125 DEFBINOP (mul_trans, float_complex_matrix, float_complex_matrix)
126 {
128  = dynamic_cast<const octave_float_complex_matrix&> (a1);
130  = dynamic_cast<const octave_float_complex_matrix&> (a2);
134 }
135 
136 DEFBINOP (herm_mul, float_complex_matrix, float_complex_matrix)
137 {
139  = dynamic_cast<const octave_float_complex_matrix&> (a1);
141  = dynamic_cast<const octave_float_complex_matrix&> (a2);
145 }
146 
147 DEFBINOP (mul_herm, float_complex_matrix, float_complex_matrix)
148 {
150  = dynamic_cast<const octave_float_complex_matrix&> (a1);
152  = dynamic_cast<const octave_float_complex_matrix&> (a2);
156 }
157 
158 DEFBINOP (trans_ldiv, float_complex_matrix, float_complex_matrix)
159 {
161  = dynamic_cast<const octave_float_complex_matrix&> (a1);
163  = dynamic_cast<const octave_float_complex_matrix&> (a2);
164  MatrixType typ = v1.matrix_type ();
165 
168  typ, blas_trans);
169 
170  v1.matrix_type (typ);
171  return ret;
172 }
173 
174 DEFBINOP (herm_ldiv, float_complex_matrix, float_complex_matrix)
175 {
177  = dynamic_cast<const octave_float_complex_matrix&> (a1);
179  = dynamic_cast<const octave_float_complex_matrix&> (a2);
180  MatrixType typ = v1.matrix_type ();
181 
184  typ, blas_conj_trans);
185 
186  v1.matrix_type (typ);
187  return ret;
188 }
189 
190 DEFNDCMPLXCMPOP_FN (lt, float_complex_matrix, float_complex_matrix,
191  float_complex_array, float_complex_array, mx_el_lt)
192 DEFNDCMPLXCMPOP_FN (le, float_complex_matrix, float_complex_matrix,
193  float_complex_array, float_complex_array, mx_el_le)
194 DEFNDCMPLXCMPOP_FN (eq, float_complex_matrix, float_complex_matrix,
195  float_complex_array, float_complex_array, mx_el_eq)
196 DEFNDCMPLXCMPOP_FN (ge, float_complex_matrix, float_complex_matrix,
197  float_complex_array, float_complex_array, mx_el_ge)
198 DEFNDCMPLXCMPOP_FN (gt, float_complex_matrix, float_complex_matrix,
199  float_complex_array, float_complex_array, mx_el_gt)
200 DEFNDCMPLXCMPOP_FN (ne, float_complex_matrix, float_complex_matrix,
201  float_complex_array, float_complex_array, mx_el_ne)
202 
203 DEFNDBINOP_FN (el_mul, float_complex_matrix, float_complex_matrix,
204  float_complex_array, float_complex_array, product)
205 DEFNDBINOP_FN (el_div, float_complex_matrix, float_complex_matrix,
206  float_complex_array, float_complex_array, quotient)
207 DEFNDBINOP_FN (el_pow, float_complex_matrix, float_complex_matrix,
208  float_complex_array, float_complex_array, elem_xpow)
209 
210 DEFBINOP (el_ldiv, float_complex_matrix, float_complex_matrix)
211 {
213  = dynamic_cast<const octave_float_complex_matrix&> (a1);
215  = dynamic_cast<const octave_float_complex_matrix&> (a2);
216 
219 }
220 
221 DEFNDBINOP_FN (el_and, float_complex_matrix, float_complex_matrix,
222  float_complex_array, float_complex_array, mx_el_and)
223 DEFNDBINOP_FN (el_or, float_complex_matrix, float_complex_matrix,
224  float_complex_array, float_complex_array, mx_el_or)
225 
226 DEFNDCATOP_FN (fcm_fcm, float_complex_matrix, float_complex_matrix,
227  float_complex_array, float_complex_array, concat)
228 
229 DEFNDCATOP_FN (cm_fcm, complex_matrix, float_complex_matrix,
230  float_complex_array, float_complex_array, concat)
231 
232 DEFNDCATOP_FN (fcm_cm, float_complex_matrix, complex_matrix,
233  float_complex_array, float_complex_array, concat)
234 
235 DEFNDASSIGNOP_FN (assign, float_complex_matrix, float_complex_matrix,
236  float_complex_array, assign)
237 DEFNDASSIGNOP_FN (sgl_clx_assign, float_complex_matrix, complex_matrix,
238  float_complex_array, assign)
239 DEFNDASSIGNOP_FN (sgl_assign, float_complex_matrix, matrix,
240  float_complex_array, assign)
241 DEFNDASSIGNOP_FN (dbl_assign, complex_matrix, float_complex_matrix,
242  complex_array, assign)
243 
244 DEFNULLASSIGNOP_FN (null_assign, float_complex_matrix, delete_elements)
245 
246 DEFNDASSIGNOP_OP (assign_add, float_complex_matrix,
247  float_complex_matrix, float_complex_array, +=)
248 DEFNDASSIGNOP_OP (assign_sub, float_complex_matrix,
249  float_complex_matrix, float_complex_array, -=)
250 DEFNDASSIGNOP_FNOP (assign_el_mul, float_complex_matrix, float_complex_matrix,
251  float_complex_array, product_eq)
252 DEFNDASSIGNOP_FNOP (assign_el_div, float_complex_matrix, float_complex_matrix,
253  float_complex_array, quotient_eq)
254 
255 void
257 {
263 
267 
289  octave_float_complex_matrix, trans_ldiv);
291  octave_float_complex_matrix, herm_ldiv);
292 
312  octave_float_complex_matrix, el_ldiv);
317 
319  octave_float_complex_matrix, fcm_fcm);
323  octave_complex_matrix, fcm_cm);
324 
328  octave_complex_matrix, sgl_clx_assign);
330  octave_matrix, sgl_assign);
332  octave_float_complex_matrix, dbl_assign);
333 
335  octave_null_matrix, null_assign);
337  octave_null_str, null_assign);
339  octave_null_sq_str, null_assign);
340 
342  octave_float_complex_matrix, assign_add);
344  octave_float_complex_matrix, assign_sub);
346  octave_float_complex_matrix, assign_el_mul);
348  octave_float_complex_matrix, assign_el_div);
349 }
FloatComplexMatrix transpose(void) const
Definition: fCMatrix.h:170
ComplexColumnVector quotient_eq(ComplexColumnVector &x, const ComplexColumnVector &y)
Definition: CColVector.h:151
ComplexColumnVector product(const ComplexColumnVector &x, const ComplexColumnVector &y)
Definition: CColVector.h:151
octave_value op_mul_trans(const octave_value &a1, const octave_value &a2)
Definition: ov.h:1546
octave_value op_uplus(const octave_value &a)
Definition: ov.h:1485
#define DEFBINOP(name, t1, t2)
Definition: ops.h:223
#define DEFUNOP(name, t)
Definition: ops.h:172
octave_value op_el_pow(const octave_value &a1, const octave_value &a2)
Definition: ov.h:1531
#define INSTALL_NCUNOP(op, t, f)
Definition: ops.h:44
#define DEFBINOPX(name, t1, t2)
Definition: ops.h:218
octave_value op_eq(const octave_value &a1, const octave_value &a2)
Definition: ov.h:1524
FloatComplexMatrix hermitian(void) const
Definition: fCMatrix.h:168
#define DEFNDASSIGNOP_FNOP(name, t1, t2, f, fnop)
Definition: ops.h:134
#define DEFNULLASSIGNOP_FN(name, t, f)
Definition: ops.h:93
octave_value op_el_ldiv(const octave_value &a1, const octave_value &a2)
Definition: ov.h:1532
the sparsity preserving column transformation such that that defines the pivoting threshold can be given in which case it defines the then the first element defines the pivoting tolerance for the unsymmetric the values defined such that for full matrix
Definition: lu.cc:138
static void transpose(octave_idx_type N, const octave_idx_type *ridx, const octave_idx_type *cidx, octave_idx_type *ridx2, octave_idx_type *cidx2)
Definition: symrcm.cc:382
ComplexNDArray concat(NDArray &ra, ComplexNDArray &rb, const Array< octave_idx_type > &ra_idx)
Definition: CNDArray.cc:655
boolMatrix mx_el_le(const boolMatrix &m1, const boolMatrix &m2)
Definition: boolMatrix.cc:90
void error(const char *fmt,...)
Definition: error.cc:570
octave_value op_pow(const octave_value &a1, const octave_value &a2)
Definition: ov.h:1519
#define DEFNDBINOP_FN(name, t1, t2, e1, e2, f)
Definition: ops.h:294
#define INSTALL_ASSIGNOP(op, t1, t2, f)
Definition: ops.h:57
MatrixType matrix_type(void) const
Definition: ov-base-mat.h:129
ComplexMatrix mul_trans(const ComplexMatrix &m, const SparseComplexMatrix &a)
Definition: CSparse.cc:7373
#define DEFBINOP_OP(name, t1, t2, op)
Definition: ops.h:228
const octave_base_value & a2
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
octave_value op_div(const octave_value &a1, const octave_value &a2)
Definition: ov.h:1517
octave_value op_el_or(const octave_value &a1, const octave_value &a2)
Definition: ov.h:1534
ComplexColumnVector quotient(const ComplexColumnVector &x, const ComplexColumnVector &y)
Definition: CColVector.h:151
#define INSTALL_BINOP(op, t1, t2, f)
Definition: ops.h:48
boolMatrix mx_el_ge(const boolMatrix &m1, const boolMatrix &m2)
Definition: boolMatrix.cc:90
void install_fcm_fcm_ops(void)
Definition: op-fcm-fcm.cc:256
octave_value op_not(const octave_value &a)
Definition: ov.h:1484
ComplexMatrix herm_mul(const SparseComplexMatrix &m, const ComplexMatrix &a)
Definition: CSparse.cc:7409
boolMatrix mx_el_gt(const boolMatrix &m1, const boolMatrix &m2)
Definition: boolMatrix.cc:90
octave_value op_trans_mul(const octave_value &a1, const octave_value &a2)
Definition: ov.h:1545
octave_value op_transpose(const octave_value &a)
Definition: ov.h:1488
FloatComplexNDArray float_complex_array_value(bool=false) const
FloatComplexMatrix float_complex_matrix_value(bool=false) const
octave_value elem_xpow(double a, const SparseMatrix &b)
Definition: sparse-xpow.cc:247
octave_value op_el_and(const octave_value &a1, const octave_value &a2)
Definition: ov.h:1533
octave_int< T > pow(const octave_int< T > &a, const octave_int< T > &b)
ComplexMatrix mul_herm(const ComplexMatrix &m, const SparseComplexMatrix &a)
Definition: CSparse.cc:7379
octave_value op_mul_herm(const octave_value &a1, const octave_value &a2)
Definition: ov.h:1548
Matrix xleftdiv(const SparseMatrix &a, const Matrix &b, MatrixType &typ)
Definition: sparse-xdiv.cc:464
boolMatrix mx_el_ne(const boolMatrix &m1, const boolMatrix &m2)
Definition: boolMatrix.cc:90
int ndims(void) const
Definition: ov-base-mat.h:114
octave_value op_le(const octave_value &a1, const octave_value &a2)
Definition: ov.h:1523
octave_value op_lt(const octave_value &a1, const octave_value &a2)
Definition: ov.h:1522
#define INSTALL_CATOP(t1, t2, f)
Definition: ops.h:53
octave_value op_el_div(const octave_value &a1, const octave_value &a2)
Definition: ov.h:1530
ComplexMatrix xgemm(const ComplexMatrix &a, const ComplexMatrix &b, blas_trans_type transa, blas_trans_type transb)
Definition: CMatrix.cc:3396
const octave_char_matrix & v2
boolMatrix mx_el_or(const boolMatrix &m1, const boolMatrix &m2)
Definition: boolMatrix.cc:87
#define DEFNDASSIGNOP_FN(name, t1, t2, e, f)
Definition: ops.h:105
Matrix xdiv(const Matrix &a, const SparseMatrix &b, MatrixType &typ)
Definition: sparse-xdiv.cc:133
octave_value op_ne(const octave_value &a1, const octave_value &a2)
Definition: ov.h:1527
ComplexMatrix trans_mul(const SparseComplexMatrix &m, const ComplexMatrix &a)
Definition: CSparse.cc:7403
boolMatrix mx_el_and(const boolMatrix &m1, const boolMatrix &m2)
Definition: boolMatrix.cc:87
#define DEFNDASSIGNOP_OP(name, t1, t2, f, op)
Definition: ops.h:119
octave_value op_add(const octave_value &a1, const octave_value &a2)
Definition: ov.h:1514
#define INSTALL_UNOP(op, t, f)
Definition: ops.h:40
octave_value op_ldiv(const octave_value &a1, const octave_value &a2)
Definition: ov.h:1520
#define DEFNDCMPLXCMPOP_FN(name, t1, t2, e1, e2, f)
Definition: ops.h:305
octave_value op_sub(const octave_value &a1, const octave_value &a2)
Definition: ov.h:1515
boolMatrix mx_el_lt(const boolMatrix &m1, const boolMatrix &m2)
Definition: boolMatrix.cc:90
octave_value op_el_mul(const octave_value &a1, const octave_value &a2)
Definition: ov.h:1529
octave_value op_herm_mul(const octave_value &a1, const octave_value &a2)
Definition: ov.h:1547
#define DEFNDUNOP_OP(name, t, e, op)
Definition: ops.h:184
octave_value op_hermitian(const octave_value &a)
Definition: ov.h:1489
octave_value op_ge(const octave_value &a1, const octave_value &a2)
Definition: ov.h:1525
#define DEFNDBINOP_OP(name, t1, t2, e1, e2, op)
Definition: ops.h:269
#define DEFNDCATOP_FN(name, t1, t2, e1, e2, f)
Definition: ops.h:341
boolMatrix mx_el_eq(const boolMatrix &m1, const boolMatrix &m2)
Definition: boolMatrix.cc:90
octave_value op_uminus(const octave_value &a)
Definition: ov.h:1486
octave_value op_mul(const octave_value &a1, const octave_value &a2)
Definition: ov.h:1516
ComplexColumnVector product_eq(ComplexColumnVector &x, const ComplexColumnVector &y)
Definition: CColVector.h:151
octave_value op_gt(const octave_value &a1, const octave_value &a2)
Definition: ov.h:1526
return octave_value(v1.char_array_value().concat(v2.char_array_value(), ra_idx),((a1.is_sq_string()||a2.is_sq_string())? '\'': '"'))
#define DEFNCUNOP_METHOD(name, t, method)
Definition: ops.h:210