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-fm-fm.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-re-mat.h"
31 #include "ov-flt-re-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 // matrix unary ops.
39 
40 DEFNDUNOP_OP (not, float_matrix, float_array, !)
41 DEFNDUNOP_OP (uplus, float_matrix, float_array, /* no-op */)
42 DEFNDUNOP_OP (uminus, float_matrix, float_array, -)
43 
44 DEFUNOP (transpose, float_matrix)
45 {
46  const octave_float_matrix& v = dynamic_cast<const octave_float_matrix&> (a);
47 
48  if (v.ndims () > 2)
49  error ("transpose not defined for N-D objects");
50 
51  return octave_value (v.float_matrix_value ().transpose ());
52 }
53 
54 DEFNCUNOP_METHOD (incr, float_matrix, increment)
55 DEFNCUNOP_METHOD (decr, float_matrix, decrement)
56 DEFNCUNOP_METHOD (changesign, float_matrix, changesign)
57 
58 // matrix by matrix ops.
59 
60 DEFNDBINOP_OP (add, float_matrix, float_matrix, float_array, float_array, +)
61 DEFNDBINOP_OP (sub, float_matrix, float_matrix, float_array, float_array, -)
62 
63 DEFBINOP_OP (mul, float_matrix, float_matrix, *)
64 
65 DEFBINOP (div, float_matrix, float_matrix)
66 {
67  const octave_float_matrix& v1 = dynamic_cast<const octave_float_matrix&> (a1);
68  const octave_float_matrix& v2 = dynamic_cast<const octave_float_matrix&> (a2);
69  MatrixType typ = v2.matrix_type ();
70 
71  FloatMatrix ret = xdiv (v1.float_matrix_value (),
72  v2.float_matrix_value (), typ);
73 
74  v2.matrix_type (typ);
75  return ret;
76 }
77 
78 DEFBINOPX (pow, float_matrix, float_matrix)
79 {
80  error ("can't do A ^ B for A and B both matrices");
81 }
82 
83 DEFBINOP (ldiv, float_matrix, float_matrix)
84 {
85  const octave_float_matrix& v1 = dynamic_cast<const octave_float_matrix&> (a1);
86  const octave_float_matrix& v2 = dynamic_cast<const octave_float_matrix&> (a2);
87  MatrixType typ = v1.matrix_type ();
88 
90  v2.float_matrix_value (), typ);
91 
92  v1.matrix_type (typ);
93  return ret;
94 }
95 
96 DEFBINOP (trans_mul, float_matrix, float_matrix)
97 {
98  const octave_float_matrix& v1 = dynamic_cast<const octave_float_matrix&> (a1);
99  const octave_float_matrix& v2 = dynamic_cast<const octave_float_matrix&> (a2);
100  return octave_value(xgemm (v1.float_matrix_value (),
101  v2.float_matrix_value (),
103 }
104 
105 DEFBINOP (mul_trans, float_matrix, float_matrix)
106 {
107  const octave_float_matrix& v1 = dynamic_cast<const octave_float_matrix&> (a1);
108  const octave_float_matrix& v2 = dynamic_cast<const octave_float_matrix&> (a2);
109  return octave_value(xgemm (v1.float_matrix_value (),
110  v2.float_matrix_value (),
112 }
113 
114 DEFBINOP (trans_ldiv, float_matrix, float_matrix)
115 {
116  const octave_float_matrix& v1 = dynamic_cast<const octave_float_matrix&> (a1);
117  const octave_float_matrix& v2 = dynamic_cast<const octave_float_matrix&> (a2);
118  MatrixType typ = v1.matrix_type ();
119 
121  v2.float_matrix_value (), typ, blas_trans);
122 
123  v1.matrix_type (typ);
124  return ret;
125 }
126 
127 DEFNDBINOP_FN (lt, float_matrix, float_matrix, float_array,
128  float_array, mx_el_lt)
129 DEFNDBINOP_FN (le, float_matrix, float_matrix, float_array,
130  float_array, mx_el_le)
131 DEFNDBINOP_FN (eq, float_matrix, float_matrix, float_array,
132  float_array, mx_el_eq)
133 DEFNDBINOP_FN (ge, float_matrix, float_matrix, float_array,
134  float_array, mx_el_ge)
135 DEFNDBINOP_FN (gt, float_matrix, float_matrix, float_array,
136  float_array, mx_el_gt)
137 DEFNDBINOP_FN (ne, float_matrix, float_matrix, float_array,
138  float_array, mx_el_ne)
139 
140 DEFNDBINOP_FN (el_mul, float_matrix, float_matrix, float_array,
141  float_array, product)
142 DEFNDBINOP_FN (el_div, float_matrix, float_matrix, float_array,
143  float_array, quotient)
144 DEFNDBINOP_FN (el_pow, float_matrix, float_matrix, float_array,
145  float_array, elem_xpow)
146 
147 DEFBINOP (el_ldiv, float_matrix, float_matrix)
148 {
149  const octave_float_matrix& v1 = dynamic_cast<const octave_float_matrix&> (a1);
150  const octave_float_matrix& v2 = dynamic_cast<const octave_float_matrix&> (a2);
151 
152  return octave_value (quotient (v2.float_array_value (),
153  v1.float_array_value ()));
154 }
155 
156 DEFNDBINOP_FN (el_and, float_matrix, float_matrix, float_array,
157  float_array, mx_el_and)
158 DEFNDBINOP_FN (el_or, float_matrix, float_matrix, float_array,
159  float_array, mx_el_or)
160 DEFNDBINOP_FN (el_not_and, float_matrix, float_matrix, float_array,
161  float_array, mx_el_not_and)
162 DEFNDBINOP_FN (el_not_or, float_matrix, float_matrix, float_array,
163  float_array, mx_el_not_or)
164 DEFNDBINOP_FN (el_and_not, float_matrix, float_matrix, float_array,
165  float_array, mx_el_and_not)
166 DEFNDBINOP_FN (el_or_not, float_matrix, float_matrix, float_array,
167  float_array, mx_el_or_not)
168 
169 DEFNDCATOP_FN (fm_fm, float_matrix, float_matrix, float_array,
170  float_array, concat)
171 
172 DEFNDCATOP_FN (m_fm, matrix, float_matrix, float_array, float_array, concat)
173 
174 DEFNDCATOP_FN (fm_m, float_matrix, matrix, float_array, float_array, concat)
175 
176 DEFNDASSIGNOP_FN (assign, float_matrix, float_matrix, float_array, assign)
177 
178 DEFNDASSIGNOP_FN (dbl_assign, matrix, float_matrix, array, assign)
179 
180 DEFNULLASSIGNOP_FN (null_assign, float_matrix, delete_elements)
181 
182 DEFNDASSIGNOP_OP (assign_add, float_matrix, float_matrix, float_array, +=)
183 DEFNDASSIGNOP_OP (assign_sub, float_matrix, float_matrix, float_array, -=)
184 DEFNDASSIGNOP_FNOP (assign_el_mul, float_matrix, float_matrix, float_array,
186 DEFNDASSIGNOP_FNOP (assign_el_div, float_matrix, float_matrix, float_array,
188 
189 void
191 {
197 
198  INSTALL_NCUNOP (op_incr, octave_float_matrix, incr);
199  INSTALL_NCUNOP (op_decr, octave_float_matrix, decr);
201 
221  el_and_not);
223  el_or_not);
225  el_not_and);
227  el_not_or);
229  trans_mul);
231  mul_trans);
233  trans_mul);
235  mul_trans);
237  trans_ldiv);
239  trans_ldiv);
240 
244 
246  octave_float_matrix, assign);
247  INSTALL_ASSIGNOP (op_asn_eq, octave_matrix,
248  octave_float_matrix, dbl_assign);
249 
251  null_assign);
253  null_assign);
255  null_assign);
256 
258  assign_add);
260  assign_sub);
262  assign_el_mul);
264  assign_el_div);
265 }
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
boolNDArray mx_el_and_not(const boolNDArray &m1, const boolNDArray &m2)
Definition: boolNDArray.cc:136
#define DEFNDASSIGNOP_FNOP(name, t1, t2, f, fnop)
Definition: ops.h:134
boolNDArray mx_el_not_or(const boolNDArray &m1, const boolNDArray &m2)
Definition: boolNDArray.cc:136
FloatMatrix transpose(void) const
Definition: fMatrix.h:133
#define DEFNULLASSIGNOP_FN(name, t, f)
Definition: ops.h:93
boolNDArray mx_el_not_and(const boolNDArray &m1, const boolNDArray &m2)
Definition: boolNDArray.cc:136
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
FloatMatrix float_matrix_value(bool=false) const
#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
octave_value op_not(const octave_value &a)
Definition: ov.h:1484
boolMatrix mx_el_gt(const boolMatrix &m1, const boolMatrix &m2)
Definition: boolMatrix.cc:90
then the function must return scalars which will be concatenated into the return array(s).If code
Definition: cellfun.cc:398
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
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)
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
FloatNDArray float_array_value(bool=false) const
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
boolNDArray mx_el_or_not(const boolNDArray &m1, const boolNDArray &m2)
Definition: boolNDArray.cc:136
#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
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
void install_fm_fm_ops(void)
Definition: op-fm-fm.cc:190
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