Mercurial > hg > octave-nkf
annotate liboctave/MDiagArray2.cc @ 8920:eb63fbe60fab
update copyright notices
author | John W. Eaton <jwe@octave.org> |
---|---|
date | Sat, 07 Mar 2009 10:41:27 -0500 |
parents | 445d27d79f4e |
children | 66970dd627f6 |
rev | line source |
---|---|
1988 | 1 /* |
2 | |
8920 | 3 Copyright (C) 1996, 1997, 2000, 2002, 2003, 2004, 2005, 2007, 2008 |
7017 | 4 John W. Eaton |
1988 | 5 |
6 This file is part of Octave. | |
7 | |
8 Octave is free software; you can redistribute it and/or modify it | |
9 under the terms of the GNU General Public License as published by the | |
7016 | 10 Free Software Foundation; either version 3 of the License, or (at your |
11 option) any later version. | |
1988 | 12 |
13 Octave is distributed in the hope that it will be useful, but WITHOUT | |
14 ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or | |
15 FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License | |
16 for more details. | |
17 | |
18 You should have received a copy of the GNU General Public License | |
7016 | 19 along with Octave; see the file COPYING. If not, see |
20 <http://www.gnu.org/licenses/>. | |
1988 | 21 |
22 */ | |
23 | |
24 #ifdef HAVE_CONFIG_H | |
25 #include <config.h> | |
26 #endif | |
27 | |
28 #include "MDiagArray2.h" | |
4669 | 29 #include "Array-util.h" |
1988 | 30 #include "lo-error.h" |
31 | |
32 #include "MArray-defs.h" | |
33 | |
8367
445d27d79f4e
support permutation matrix objects
Jaroslav Hajek <highegg@gmail.com>
parents:
7017
diff
changeset
|
34 template <class T> |
445d27d79f4e
support permutation matrix objects
Jaroslav Hajek <highegg@gmail.com>
parents:
7017
diff
changeset
|
35 bool |
445d27d79f4e
support permutation matrix objects
Jaroslav Hajek <highegg@gmail.com>
parents:
7017
diff
changeset
|
36 MDiagArray2<T>::is_multiple_of_identity (T val) const |
445d27d79f4e
support permutation matrix objects
Jaroslav Hajek <highegg@gmail.com>
parents:
7017
diff
changeset
|
37 { |
445d27d79f4e
support permutation matrix objects
Jaroslav Hajek <highegg@gmail.com>
parents:
7017
diff
changeset
|
38 bool retval = this->rows () == this->cols (); |
445d27d79f4e
support permutation matrix objects
Jaroslav Hajek <highegg@gmail.com>
parents:
7017
diff
changeset
|
39 if (retval) |
445d27d79f4e
support permutation matrix objects
Jaroslav Hajek <highegg@gmail.com>
parents:
7017
diff
changeset
|
40 { |
445d27d79f4e
support permutation matrix objects
Jaroslav Hajek <highegg@gmail.com>
parents:
7017
diff
changeset
|
41 octave_idx_type len = this->length (), i = 0; |
445d27d79f4e
support permutation matrix objects
Jaroslav Hajek <highegg@gmail.com>
parents:
7017
diff
changeset
|
42 for (;i < len; i++) |
445d27d79f4e
support permutation matrix objects
Jaroslav Hajek <highegg@gmail.com>
parents:
7017
diff
changeset
|
43 if (DiagArray2<T>::elem (i, i) != val) break; |
445d27d79f4e
support permutation matrix objects
Jaroslav Hajek <highegg@gmail.com>
parents:
7017
diff
changeset
|
44 retval = i == len; |
445d27d79f4e
support permutation matrix objects
Jaroslav Hajek <highegg@gmail.com>
parents:
7017
diff
changeset
|
45 } |
445d27d79f4e
support permutation matrix objects
Jaroslav Hajek <highegg@gmail.com>
parents:
7017
diff
changeset
|
46 |
445d27d79f4e
support permutation matrix objects
Jaroslav Hajek <highegg@gmail.com>
parents:
7017
diff
changeset
|
47 return retval; |
445d27d79f4e
support permutation matrix objects
Jaroslav Hajek <highegg@gmail.com>
parents:
7017
diff
changeset
|
48 } |
445d27d79f4e
support permutation matrix objects
Jaroslav Hajek <highegg@gmail.com>
parents:
7017
diff
changeset
|
49 |
4187 | 50 // Some functions return a reference to this object after a failure. |
51 template <class T> MDiagArray2<T> MDiagArray2<T>::nil_array; | |
52 | |
1988 | 53 // Two dimensional diagonal array with math ops. |
54 | |
55 // Element by element MDiagArray2 by MDiagArray2 ops. | |
56 | |
57 template <class T> | |
58 MDiagArray2<T>& | |
59 operator += (MDiagArray2<T>& a, const MDiagArray2<T>& b) | |
60 { | |
5275 | 61 octave_idx_type r = a.rows (); |
62 octave_idx_type c = a.cols (); | |
2383 | 63 |
5275 | 64 octave_idx_type b_nr = b.rows (); |
65 octave_idx_type b_nc = b.cols (); | |
2383 | 66 |
67 if (r != b_nr || c != b_nc) | |
1988 | 68 { |
2383 | 69 gripe_nonconformant ("operator +=", r, c, b_nr, b_nc); |
4187 | 70 return MDiagArray2<T>::nil_array; |
1988 | 71 } |
72 else | |
73 { | |
5275 | 74 octave_idx_type l = a.length (); |
4646 | 75 DO_VV_OP2 (T, a, +=, b); |
1988 | 76 } |
77 return a; | |
78 } | |
79 | |
80 template <class T> | |
81 MDiagArray2<T>& | |
82 operator -= (MDiagArray2<T>& a, const MDiagArray2<T>& b) | |
83 { | |
5275 | 84 octave_idx_type r = a.rows (); |
85 octave_idx_type c = a.cols (); | |
2383 | 86 |
5275 | 87 octave_idx_type b_nr = b.rows (); |
88 octave_idx_type b_nc = b.cols (); | |
2383 | 89 |
90 if (r != b_nr || c != b_nc) | |
1988 | 91 { |
2383 | 92 gripe_nonconformant ("operator -=", r, c, b_nr, b_nc); |
4187 | 93 return MDiagArray2<T>::nil_array; |
1988 | 94 } |
95 else | |
96 { | |
5275 | 97 octave_idx_type l = a.length (); |
4646 | 98 DO_VV_OP2 (T, a, -=, b); |
1988 | 99 } |
100 return a; | |
101 } | |
102 | |
103 // Element by element MDiagArray2 by scalar ops. | |
104 | |
105 #define MARRAY_DAS_OP(OP) \ | |
106 template <class T> \ | |
107 MDiagArray2<T> \ | |
108 operator OP (const MDiagArray2<T>& a, const T& s) \ | |
109 { \ | |
3504 | 110 MDiagArray2<T> result (a.rows (), a.cols ()); \ |
111 T *r = result.fortran_vec (); \ | |
5275 | 112 octave_idx_type l = a.length (); \ |
3504 | 113 const T *v = a.data (); \ |
114 DO_VS_OP (r, l, v, OP, s); \ | |
115 return result; \ | |
1988 | 116 } |
117 | |
118 MARRAY_DAS_OP (*) | |
119 MARRAY_DAS_OP (/) | |
120 | |
121 // Element by element scalar by MDiagArray2 ops. | |
122 | |
123 template <class T> | |
124 MDiagArray2<T> | |
125 operator * (const T& s, const MDiagArray2<T>& a) | |
126 { | |
3504 | 127 MDiagArray2<T> result (a.rows (), a.cols ()); \ |
128 T *r = result.fortran_vec (); \ | |
5275 | 129 octave_idx_type l = a.length (); \ |
3504 | 130 const T *v = a.data (); \ |
131 DO_SV_OP (r, l, s, *, v); \ | |
132 return result; \ | |
1988 | 133 } |
134 | |
135 // Element by element MDiagArray2 by MDiagArray2 ops. | |
136 | |
2383 | 137 #define MARRAY_DADA_OP(FCN, OP) \ |
1988 | 138 template <class T> \ |
139 MDiagArray2<T> \ | |
140 FCN (const MDiagArray2<T>& a, const MDiagArray2<T>& b) \ | |
141 { \ | |
5275 | 142 octave_idx_type a_nr = a.rows (); \ |
143 octave_idx_type a_nc = a.cols (); \ | |
144 octave_idx_type b_nr = b.rows (); \ | |
145 octave_idx_type b_nc = b.cols (); \ | |
3504 | 146 if (a_nr != b_nr || a_nc != b_nc) \ |
1988 | 147 { \ |
3504 | 148 gripe_nonconformant (#FCN, a_nr, a_nc, b_nr, b_nc); \ |
1988 | 149 return MDiagArray2<T> (); \ |
150 } \ | |
3504 | 151 if (a_nc == 0 || a_nr == 0) \ |
1988 | 152 return MDiagArray2<T> (); \ |
5275 | 153 octave_idx_type l = a.length (); \ |
3504 | 154 MDiagArray2<T> result (a_nr, a_nc); \ |
155 T *r = result.fortran_vec (); \ | |
156 const T *x = a.data (); \ | |
157 const T *y = b.data (); \ | |
158 DO_VV_OP (r, l, x, OP, y); \ | |
159 return result; \ | |
1988 | 160 } |
161 | |
2383 | 162 MARRAY_DADA_OP (operator +, +) |
163 MARRAY_DADA_OP (operator -, -) | |
164 MARRAY_DADA_OP (product, *) | |
1988 | 165 |
166 // Unary MDiagArray2 ops. | |
167 | |
168 template <class T> | |
169 MDiagArray2<T> | |
3580 | 170 operator + (const MDiagArray2<T>& a) |
171 { | |
172 return a; | |
173 } | |
174 | |
175 template <class T> | |
176 MDiagArray2<T> | |
1988 | 177 operator - (const MDiagArray2<T>& a) |
178 { | |
5275 | 179 octave_idx_type l = a.length (); |
3504 | 180 MDiagArray2<T> result (a.rows (), a.cols ()); |
181 T *r = result.fortran_vec (); | |
182 const T *x = a.data (); | |
183 NEG_V (r, l, x); | |
184 return result; | |
1988 | 185 } |
186 | |
187 /* | |
188 ;;; Local Variables: *** | |
189 ;;; mode: C++ *** | |
190 ;;; End: *** | |
191 */ |