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-m-m.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 
41 DEFNDUNOP_OP (uplus, matrix, array, /* no-op */)
42 DEFNDUNOP_OP (uminus, matrix, array, -)
43 
44 DEFUNOP (transpose, matrix)
45 {
46  const octave_matrix& v = dynamic_cast<const octave_matrix&> (a);
47 
48  if (v.ndims () > 2)
49  error ("transpose not defined for N-D objects");
50 
51  return octave_value (v.matrix_value ().transpose ());
52 }
53 
54 DEFNCUNOP_METHOD (incr, matrix, increment)
55 DEFNCUNOP_METHOD (decr, matrix, decrement)
56 DEFNCUNOP_METHOD (changesign, matrix, changesign)
57 
58 // matrix by matrix ops.
59 
60 DEFNDBINOP_OP (add, matrix, matrix, array, array, +)
61 DEFNDBINOP_OP (sub, matrix, matrix, array, array, -)
62 
63 DEFBINOP_OP (mul, matrix, matrix, *)
64 
65 DEFBINOP (div, matrix, matrix)
66 {
67  const octave_matrix& v1 = dynamic_cast<const octave_matrix&> (a1);
68  const octave_matrix& v2 = dynamic_cast<const octave_matrix&> (a2);
69  MatrixType typ = v2.matrix_type ();
70 
71  Matrix ret = xdiv (v1.matrix_value (), v2.matrix_value (), typ);
72 
73  v2.matrix_type (typ);
74  return ret;
75 }
76 
78 {
79  error ("can't do A ^ B for A and B both matrices");
80 }
81 
83 {
84  const octave_matrix& v1 = dynamic_cast<const octave_matrix&> (a1);
85  const octave_matrix& v2 = dynamic_cast<const octave_matrix&> (a2);
86  MatrixType typ = v1.matrix_type ();
87 
88  Matrix ret = xleftdiv (v1.matrix_value (), v2.matrix_value (), typ);
89 
90  v1.matrix_type (typ);
91  return ret;
92 }
93 
95 {
96  const octave_matrix& v1 = dynamic_cast<const octave_matrix&> (a1);
97  const octave_matrix& v2 = dynamic_cast<const octave_matrix&> (a2);
98  return octave_value(xgemm (v1.matrix_value (), v2.matrix_value (),
100 }
101 
103 {
104  const octave_matrix& v1 = dynamic_cast<const octave_matrix&> (a1);
105  const octave_matrix& v2 = dynamic_cast<const octave_matrix&> (a2);
106  return octave_value(xgemm (v1.matrix_value (), v2.matrix_value (),
108 }
109 
110 DEFBINOP (trans_ldiv, matrix, matrix)
111 {
112  const octave_matrix& v1 = dynamic_cast<const octave_matrix&> (a1);
113  const octave_matrix& v2 = dynamic_cast<const octave_matrix&> (a2);
114  MatrixType typ = v1.matrix_type ();
115 
116  Matrix ret = xleftdiv (v1.matrix_value (), v2.matrix_value (),
117  typ, blas_trans);
118 
119  v1.matrix_type (typ);
120  return ret;
121 }
122 
124 DEFNDBINOP_FN (le, matrix, matrix, array, array, mx_el_le)
125 DEFNDBINOP_FN (eq, matrix, matrix, array, array, mx_el_eq)
126 DEFNDBINOP_FN (ge, matrix, matrix, array, array, mx_el_ge)
127 DEFNDBINOP_FN (gt, matrix, matrix, array, array, mx_el_gt)
128 DEFNDBINOP_FN (ne, matrix, matrix, array, array, mx_el_ne)
129 
130 DEFNDBINOP_FN (el_mul, matrix, matrix, array, array, product)
131 DEFNDBINOP_FN (el_div, matrix, matrix, array, array, quotient)
132 DEFNDBINOP_FN (el_pow, matrix, matrix, array, array, elem_xpow)
133 
134 DEFBINOP (el_ldiv, matrix, matrix)
135 {
136  const octave_matrix& v1 = dynamic_cast<const octave_matrix&> (a1);
137  const octave_matrix& v2 = dynamic_cast<const octave_matrix&> (a2);
138 
139  return octave_value (quotient (v2.array_value (), v1.array_value ()));
140 }
141 
143 DEFNDBINOP_FN (el_or, matrix, matrix, array, array, mx_el_or)
144 DEFNDBINOP_FN (el_not_and, matrix, matrix, array, array, mx_el_not_and)
145 DEFNDBINOP_FN (el_not_or, matrix, matrix, array, array, mx_el_not_or)
146 DEFNDBINOP_FN (el_and_not, matrix, matrix, array, array, mx_el_and_not)
147 DEFNDBINOP_FN (el_or_not, matrix, matrix, array, array, mx_el_or_not)
148 
149 DEFNDCATOP_FN (m_m, matrix, matrix, array, array, concat)
150 
151 DEFNDASSIGNOP_FN (assign, matrix, matrix, array, assign)
152 DEFNDASSIGNOP_FN (sgl_assign, float_matrix, matrix, float_array, assign)
153 
154 DEFNULLASSIGNOP_FN (null_assign, matrix, delete_elements)
155 
156 DEFNDASSIGNOP_OP (assign_add, matrix, matrix, array, +=)
157 DEFNDASSIGNOP_OP (assign_sub, matrix, matrix, array, -=)
158 DEFNDASSIGNOP_FNOP (assign_el_mul, matrix, matrix, array, product_eq)
159 DEFNDASSIGNOP_FNOP (assign_el_div, matrix, matrix, array, quotient_eq)
160 
161 void
163 {
169 
170  INSTALL_NCUNOP (op_incr, octave_matrix, incr);
171  INSTALL_NCUNOP (op_decr, octave_matrix, decr);
172  INSTALL_NCUNOP (op_uminus, octave_matrix, changesign);
173 
192  INSTALL_BINOP (op_el_and_not, octave_matrix, octave_matrix, el_and_not);
193  INSTALL_BINOP (op_el_or_not, octave_matrix, octave_matrix, el_or_not);
194  INSTALL_BINOP (op_el_not_and, octave_matrix, octave_matrix, el_not_and);
195  INSTALL_BINOP (op_el_not_or, octave_matrix, octave_matrix, el_not_or);
200  INSTALL_BINOP (op_trans_ldiv, octave_matrix, octave_matrix, trans_ldiv);
201  INSTALL_BINOP (op_herm_ldiv, octave_matrix, octave_matrix, trans_ldiv);
202 
204 
205  INSTALL_ASSIGNOP (op_asn_eq, octave_matrix, octave_matrix, assign);
206  INSTALL_ASSIGNOP (op_asn_eq, octave_float_matrix, octave_matrix, sgl_assign);
207 
208  INSTALL_ASSIGNOP (op_asn_eq, octave_matrix, octave_null_matrix, null_assign);
209  INSTALL_ASSIGNOP (op_asn_eq, octave_matrix, octave_null_str, null_assign);
210  INSTALL_ASSIGNOP (op_asn_eq, octave_matrix, octave_null_sq_str, null_assign);
211 
212  INSTALL_ASSIGNOP (op_add_eq, octave_matrix, octave_matrix, assign_add);
213  INSTALL_ASSIGNOP (op_sub_eq, octave_matrix, octave_matrix, assign_sub);
214  INSTALL_ASSIGNOP (op_el_mul_eq, octave_matrix, octave_matrix, assign_el_mul);
215  INSTALL_ASSIGNOP (op_el_div_eq, octave_matrix, octave_matrix, assign_el_div);
216 }
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
NDArray array_value(bool=false) const
Definition: ov-re-mat.h:172
#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
#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
Matrix matrix_value(bool=false) const
Definition: ov-re-mat.cc:141
#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)
Matrix transpose(void) const
Definition: dMatrix.h:129
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
Definition: dMatrix.h:37
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
void install_m_m_ops(void)
Definition: op-m-m.cc:162
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
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