Mercurial > octave
annotate liboctave/array/dColVector.cc @ 27919:1891570abac8
update Octave Project Developers copyright for the new year
In files that have the "Octave Project Developers" copyright notice,
update for 2020.
author | John W. Eaton <jwe@octave.org> |
---|---|
date | Mon, 06 Jan 2020 22:29:51 -0500 |
parents | b442ec6dda5c |
children | bd51beb6205e |
rev | line source |
---|---|
458 | 1 /* |
2 | |
27919
1891570abac8
update Octave Project Developers copyright for the new year
John W. Eaton <jwe@octave.org>
parents:
27918
diff
changeset
|
3 Copyright (C) 1994-2020 The Octave Project Developers |
27918
b442ec6dda5c
use centralized file for copyright info for individual contributors
John W. Eaton <jwe@octave.org>
parents:
27180
diff
changeset
|
4 |
b442ec6dda5c
use centralized file for copyright info for individual contributors
John W. Eaton <jwe@octave.org>
parents:
27180
diff
changeset
|
5 See the file COPYRIGHT.md in the top-level directory of this distribution |
b442ec6dda5c
use centralized file for copyright info for individual contributors
John W. Eaton <jwe@octave.org>
parents:
27180
diff
changeset
|
6 or <https://octave.org/COPYRIGHT.html/>. |
b442ec6dda5c
use centralized file for copyright info for individual contributors
John W. Eaton <jwe@octave.org>
parents:
27180
diff
changeset
|
7 |
458 | 8 |
9 This file is part of Octave. | |
10 | |
24534
194eb4bd202b
maint: Update punctuation for GPL v3 license text.
Rik <rik@octave.org>
parents:
23461
diff
changeset
|
11 Octave is free software: you can redistribute it and/or modify it |
22755
3a2b891d0b33
maint: Standardize Copyright formatting.
Rik <rik@octave.org>
parents:
22402
diff
changeset
|
12 under the terms of the GNU General Public License as published by |
24534
194eb4bd202b
maint: Update punctuation for GPL v3 license text.
Rik <rik@octave.org>
parents:
23461
diff
changeset
|
13 the Free Software Foundation, either version 3 of the License, or |
22755
3a2b891d0b33
maint: Standardize Copyright formatting.
Rik <rik@octave.org>
parents:
22402
diff
changeset
|
14 (at your option) any later version. |
458 | 15 |
22755
3a2b891d0b33
maint: Standardize Copyright formatting.
Rik <rik@octave.org>
parents:
22402
diff
changeset
|
16 Octave is distributed in the hope that it will be useful, but |
3a2b891d0b33
maint: Standardize Copyright formatting.
Rik <rik@octave.org>
parents:
22402
diff
changeset
|
17 WITHOUT ANY WARRANTY; without even the implied warranty of |
3a2b891d0b33
maint: Standardize Copyright formatting.
Rik <rik@octave.org>
parents:
22402
diff
changeset
|
18 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
3a2b891d0b33
maint: Standardize Copyright formatting.
Rik <rik@octave.org>
parents:
22402
diff
changeset
|
19 GNU General Public License for more details. |
458 | 20 |
21 You should have received a copy of the GNU General Public License | |
7016 | 22 along with Octave; see the file COPYING. If not, see |
24534
194eb4bd202b
maint: Update punctuation for GPL v3 license text.
Rik <rik@octave.org>
parents:
23461
diff
changeset
|
23 <https://www.gnu.org/licenses/>. |
458 | 24 |
25 */ | |
26 | |
21724
aba2e6293dd8
use "#if ..." consistently instead of "#ifdef" and "#ifndef"
John W. Eaton <jwe@octave.org>
parents:
21301
diff
changeset
|
27 #if defined (HAVE_CONFIG_H) |
21301
40de9f8f23a6
Use '#include "config.h"' rather than <config.h>.
Rik <rik@octave.org>
parents:
21202
diff
changeset
|
28 # include "config.h" |
458 | 29 #endif |
30 | |
25438
cb1606f78f6b
prefer <istream>, <ostream>, or <iosfwd> to <iostream> where possible
John W. Eaton <jwe@octave.org>
parents:
25054
diff
changeset
|
31 #include <istream> |
cb1606f78f6b
prefer <istream>, <ostream>, or <iosfwd> to <iostream> where possible
John W. Eaton <jwe@octave.org>
parents:
25054
diff
changeset
|
32 #include <ostream> |
458 | 33 |
4669 | 34 #include "Array-util.h" |
22322
93b3cdd36854
move most f77 function decls to separate header files
John W. Eaton <jwe@octave.org>
parents:
22133
diff
changeset
|
35 #include "lo-blas-proto.h" |
1368 | 36 #include "lo-error.h" |
458 | 37 #include "mx-base.h" |
38 #include "mx-inlines.cc" | |
1650 | 39 #include "oct-cmplx.h" |
458 | 40 |
1360 | 41 // Column Vector class. |
458 | 42 |
2386 | 43 bool |
458 | 44 ColumnVector::operator == (const ColumnVector& a) const |
45 { | |
20232
a9574e3c6e9e
Deprecate Array::length() and Sparse::length() in favour of ::numel().
Carnë Draug <carandraug@octave.org>
parents:
19697
diff
changeset
|
46 octave_idx_type len = numel (); |
a9574e3c6e9e
Deprecate Array::length() and Sparse::length() in favour of ::numel().
Carnë Draug <carandraug@octave.org>
parents:
19697
diff
changeset
|
47 if (len != a.numel ()) |
458 | 48 return 0; |
9550
3d6a9aea2aea
refactor binary & bool ops in liboctave
Jaroslav Hajek <highegg@gmail.com>
parents:
8999
diff
changeset
|
49 return mx_inline_equal (len, data (), a.data ()); |
458 | 50 } |
51 | |
2386 | 52 bool |
458 | 53 ColumnVector::operator != (const ColumnVector& a) const |
54 { | |
55 return !(*this == a); | |
56 } | |
57 | |
58 ColumnVector& | |
5275 | 59 ColumnVector::insert (const ColumnVector& a, octave_idx_type r) |
458 | 60 { |
20232
a9574e3c6e9e
Deprecate Array::length() and Sparse::length() in favour of ::numel().
Carnë Draug <carandraug@octave.org>
parents:
19697
diff
changeset
|
61 octave_idx_type a_len = a.numel (); |
4316 | 62 |
20232
a9574e3c6e9e
Deprecate Array::length() and Sparse::length() in favour of ::numel().
Carnë Draug <carandraug@octave.org>
parents:
19697
diff
changeset
|
63 if (r < 0 || r + a_len > numel ()) |
21136
7cac4e7458f2
maint: clean up code around calls to current_liboctave_error_handler.
Rik <rik@octave.org>
parents:
21120
diff
changeset
|
64 (*current_liboctave_error_handler) ("range error for insert"); |
458 | 65 |
4316 | 66 if (a_len > 0) |
67 { | |
68 make_unique (); | |
69 | |
5275 | 70 for (octave_idx_type i = 0; i < a_len; i++) |
10314
07ebe522dac2
untabify liboctave C++ sources
John W. Eaton <jwe@octave.org>
parents:
10158
diff
changeset
|
71 xelem (r+i) = a.elem (i); |
4316 | 72 } |
458 | 73 |
74 return *this; | |
75 } | |
76 | |
77 ColumnVector& | |
78 ColumnVector::fill (double val) | |
79 { | |
20232
a9574e3c6e9e
Deprecate Array::length() and Sparse::length() in favour of ::numel().
Carnë Draug <carandraug@octave.org>
parents:
19697
diff
changeset
|
80 octave_idx_type len = numel (); |
4316 | 81 |
458 | 82 if (len > 0) |
4316 | 83 { |
84 make_unique (); | |
85 | |
5275 | 86 for (octave_idx_type i = 0; i < len; i++) |
10314
07ebe522dac2
untabify liboctave C++ sources
John W. Eaton <jwe@octave.org>
parents:
10158
diff
changeset
|
87 xelem (i) = val; |
4316 | 88 } |
89 | |
458 | 90 return *this; |
91 } | |
92 | |
93 ColumnVector& | |
5275 | 94 ColumnVector::fill (double val, octave_idx_type r1, octave_idx_type r2) |
458 | 95 { |
20232
a9574e3c6e9e
Deprecate Array::length() and Sparse::length() in favour of ::numel().
Carnë Draug <carandraug@octave.org>
parents:
19697
diff
changeset
|
96 octave_idx_type len = numel (); |
4316 | 97 |
458 | 98 if (r1 < 0 || r2 < 0 || r1 >= len || r2 >= len) |
21136
7cac4e7458f2
maint: clean up code around calls to current_liboctave_error_handler.
Rik <rik@octave.org>
parents:
21120
diff
changeset
|
99 (*current_liboctave_error_handler) ("range error for fill"); |
458 | 100 |
17663
7975d75f933c
Use std::swap in liboctave instead of temporary variable.
Rik <rik@octave.org>
parents:
15271
diff
changeset
|
101 if (r1 > r2) { std::swap (r1, r2); } |
458 | 102 |
4316 | 103 if (r2 >= r1) |
104 { | |
105 make_unique (); | |
106 | |
5275 | 107 for (octave_idx_type i = r1; i <= r2; i++) |
10314
07ebe522dac2
untabify liboctave C++ sources
John W. Eaton <jwe@octave.org>
parents:
10158
diff
changeset
|
108 xelem (i) = val; |
4316 | 109 } |
458 | 110 |
111 return *this; | |
112 } | |
113 | |
114 ColumnVector | |
115 ColumnVector::stack (const ColumnVector& a) const | |
116 { | |
20232
a9574e3c6e9e
Deprecate Array::length() and Sparse::length() in favour of ::numel().
Carnë Draug <carandraug@octave.org>
parents:
19697
diff
changeset
|
117 octave_idx_type len = numel (); |
5275 | 118 octave_idx_type nr_insert = len; |
20232
a9574e3c6e9e
Deprecate Array::length() and Sparse::length() in favour of ::numel().
Carnë Draug <carandraug@octave.org>
parents:
19697
diff
changeset
|
119 ColumnVector retval (len + a.numel ()); |
458 | 120 retval.insert (*this, 0); |
121 retval.insert (a, nr_insert); | |
122 return retval; | |
123 } | |
124 | |
125 RowVector | |
126 ColumnVector::transpose (void) const | |
127 { | |
14846
460a3c6d8bf1
maint: Use Octave coding convention for cuddled parenthis in function calls with empty argument lists.
Rik <octave@nomad.inbox5.com>
parents:
14394
diff
changeset
|
128 return MArray<double>::transpose (); |
458 | 129 } |
130 | |
1205 | 131 ColumnVector |
10363
a0728e81ed25
improve diag matrix interface & implementation
Jaroslav Hajek <highegg@gmail.com>
parents:
10314
diff
changeset
|
132 ColumnVector::abs (void) const |
a0728e81ed25
improve diag matrix interface & implementation
Jaroslav Hajek <highegg@gmail.com>
parents:
10314
diff
changeset
|
133 { |
a0728e81ed25
improve diag matrix interface & implementation
Jaroslav Hajek <highegg@gmail.com>
parents:
10314
diff
changeset
|
134 return do_mx_unary_map<double, double, std::abs> (*this); |
a0728e81ed25
improve diag matrix interface & implementation
Jaroslav Hajek <highegg@gmail.com>
parents:
10314
diff
changeset
|
135 } |
a0728e81ed25
improve diag matrix interface & implementation
Jaroslav Hajek <highegg@gmail.com>
parents:
10314
diff
changeset
|
136 |
a0728e81ed25
improve diag matrix interface & implementation
Jaroslav Hajek <highegg@gmail.com>
parents:
10314
diff
changeset
|
137 ColumnVector |
1205 | 138 real (const ComplexColumnVector& a) |
139 { | |
10363
a0728e81ed25
improve diag matrix interface & implementation
Jaroslav Hajek <highegg@gmail.com>
parents:
10314
diff
changeset
|
140 return do_mx_unary_op<double, Complex> (a, mx_inline_real); |
1205 | 141 } |
142 | |
143 ColumnVector | |
144 imag (const ComplexColumnVector& a) | |
145 { | |
10363
a0728e81ed25
improve diag matrix interface & implementation
Jaroslav Hajek <highegg@gmail.com>
parents:
10314
diff
changeset
|
146 return do_mx_unary_op<double, Complex> (a, mx_inline_imag); |
1205 | 147 } |
148 | |
458 | 149 // resize is the destructive equivalent for this one |
150 | |
151 ColumnVector | |
5275 | 152 ColumnVector::extract (octave_idx_type r1, octave_idx_type r2) const |
458 | 153 { |
17663
7975d75f933c
Use std::swap in liboctave instead of temporary variable.
Rik <rik@octave.org>
parents:
15271
diff
changeset
|
154 if (r1 > r2) { std::swap (r1, r2); } |
458 | 155 |
5275 | 156 octave_idx_type new_r = r2 - r1 + 1; |
458 | 157 |
158 ColumnVector result (new_r); | |
159 | |
5275 | 160 for (octave_idx_type i = 0; i < new_r; i++) |
4316 | 161 result.xelem (i) = elem (r1+i); |
162 | |
163 return result; | |
164 } | |
165 | |
166 ColumnVector | |
5275 | 167 ColumnVector::extract_n (octave_idx_type r1, octave_idx_type n) const |
4316 | 168 { |
169 ColumnVector result (n); | |
170 | |
5275 | 171 for (octave_idx_type i = 0; i < n; i++) |
4316 | 172 result.xelem (i) = elem (r1+i); |
458 | 173 |
174 return result; | |
175 } | |
176 | |
1205 | 177 // matrix by column vector -> column vector operations |
458 | 178 |
1205 | 179 ColumnVector |
180 operator * (const Matrix& m, const ColumnVector& a) | |
458 | 181 { |
1947 | 182 ColumnVector retval; |
183 | |
22988
cd33c785e80e
put to_f77_int inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
22847
diff
changeset
|
184 F77_INT nr = octave::to_f77_int (m.rows ()); |
cd33c785e80e
put to_f77_int inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
22847
diff
changeset
|
185 F77_INT nc = octave::to_f77_int (m.cols ()); |
1947 | 186 |
22988
cd33c785e80e
put to_f77_int inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
22847
diff
changeset
|
187 F77_INT a_len = octave::to_f77_int (a.numel ()); |
2386 | 188 |
189 if (nc != a_len) | |
22327
d0562b3159c7
move more classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
22323
diff
changeset
|
190 octave::err_nonconformant ("operator *", nr, nc, a_len, 1); |
21120
499b851fbfae
Replace pattern if/err_XXX/else/code with if/err_XXX/ code.
Rik <rik@octave.org>
parents:
21100
diff
changeset
|
191 |
499b851fbfae
Replace pattern if/err_XXX/else/code with if/err_XXX/ code.
Rik <rik@octave.org>
parents:
21100
diff
changeset
|
192 retval.clear (nr); |
499b851fbfae
Replace pattern if/err_XXX/else/code with if/err_XXX/ code.
Rik <rik@octave.org>
parents:
21100
diff
changeset
|
193 |
499b851fbfae
Replace pattern if/err_XXX/else/code with if/err_XXX/ code.
Rik <rik@octave.org>
parents:
21100
diff
changeset
|
194 if (nr != 0) |
458 | 195 { |
21120
499b851fbfae
Replace pattern if/err_XXX/else/code with if/err_XXX/ code.
Rik <rik@octave.org>
parents:
21100
diff
changeset
|
196 if (nc == 0) |
499b851fbfae
Replace pattern if/err_XXX/else/code with if/err_XXX/ code.
Rik <rik@octave.org>
parents:
21100
diff
changeset
|
197 retval.fill (0.0); |
499b851fbfae
Replace pattern if/err_XXX/else/code with if/err_XXX/ code.
Rik <rik@octave.org>
parents:
21100
diff
changeset
|
198 else |
9625
cbabf50315ca
optimize Matrix*ColumnVector
Jaroslav Hajek <highegg@gmail.com>
parents:
9550
diff
changeset
|
199 { |
21120
499b851fbfae
Replace pattern if/err_XXX/else/code with if/err_XXX/ code.
Rik <rik@octave.org>
parents:
21100
diff
changeset
|
200 double *y = retval.fortran_vec (); |
1947 | 201 |
21120
499b851fbfae
Replace pattern if/err_XXX/else/code with if/err_XXX/ code.
Rik <rik@octave.org>
parents:
21100
diff
changeset
|
202 F77_XFCN (dgemv, DGEMV, (F77_CONST_CHAR_ARG2 ("N", 1), |
499b851fbfae
Replace pattern if/err_XXX/else/code with if/err_XXX/ code.
Rik <rik@octave.org>
parents:
21100
diff
changeset
|
203 nr, nc, 1.0, m.data (), nr, |
499b851fbfae
Replace pattern if/err_XXX/else/code with if/err_XXX/ code.
Rik <rik@octave.org>
parents:
21100
diff
changeset
|
204 a.data (), 1, 0.0, y, 1 |
499b851fbfae
Replace pattern if/err_XXX/else/code with if/err_XXX/ code.
Rik <rik@octave.org>
parents:
21100
diff
changeset
|
205 F77_CHAR_ARG_LEN (1))); |
9625
cbabf50315ca
optimize Matrix*ColumnVector
Jaroslav Hajek <highegg@gmail.com>
parents:
9550
diff
changeset
|
206 } |
458 | 207 } |
208 | |
1947 | 209 return retval; |
458 | 210 } |
211 | |
1205 | 212 // diagonal matrix by column vector -> column vector operations |
213 | |
214 ColumnVector | |
215 operator * (const DiagMatrix& m, const ColumnVector& a) | |
458 | 216 { |
1947 | 217 ColumnVector retval; |
218 | |
22988
cd33c785e80e
put to_f77_int inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
22847
diff
changeset
|
219 F77_INT nr = octave::to_f77_int (m.rows ()); |
cd33c785e80e
put to_f77_int inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
22847
diff
changeset
|
220 F77_INT nc = octave::to_f77_int (m.cols ()); |
1947 | 221 |
22988
cd33c785e80e
put to_f77_int inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
22847
diff
changeset
|
222 F77_INT a_len = octave::to_f77_int (a.numel ()); |
1947 | 223 |
1205 | 224 if (nc != a_len) |
22327
d0562b3159c7
move more classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
22323
diff
changeset
|
225 octave::err_nonconformant ("operator *", nr, nc, a_len, 1); |
21120
499b851fbfae
Replace pattern if/err_XXX/else/code with if/err_XXX/ code.
Rik <rik@octave.org>
parents:
21100
diff
changeset
|
226 |
499b851fbfae
Replace pattern if/err_XXX/else/code with if/err_XXX/ code.
Rik <rik@octave.org>
parents:
21100
diff
changeset
|
227 if (nr == 0 || nc == 0) |
499b851fbfae
Replace pattern if/err_XXX/else/code with if/err_XXX/ code.
Rik <rik@octave.org>
parents:
21100
diff
changeset
|
228 retval.resize (nr, 0.0); |
1947 | 229 else |
458 | 230 { |
21120
499b851fbfae
Replace pattern if/err_XXX/else/code with if/err_XXX/ code.
Rik <rik@octave.org>
parents:
21100
diff
changeset
|
231 retval.resize (nr); |
1947 | 232 |
21120
499b851fbfae
Replace pattern if/err_XXX/else/code with if/err_XXX/ code.
Rik <rik@octave.org>
parents:
21100
diff
changeset
|
233 for (octave_idx_type i = 0; i < a_len; i++) |
499b851fbfae
Replace pattern if/err_XXX/else/code with if/err_XXX/ code.
Rik <rik@octave.org>
parents:
21100
diff
changeset
|
234 retval.elem (i) = a.elem (i) * m.elem (i, i); |
1947 | 235 |
21120
499b851fbfae
Replace pattern if/err_XXX/else/code with if/err_XXX/ code.
Rik <rik@octave.org>
parents:
21100
diff
changeset
|
236 for (octave_idx_type i = a_len; i < nr; i++) |
499b851fbfae
Replace pattern if/err_XXX/else/code with if/err_XXX/ code.
Rik <rik@octave.org>
parents:
21100
diff
changeset
|
237 retval.elem (i) = 0.0; |
458 | 238 } |
239 | |
1947 | 240 return retval; |
458 | 241 } |
242 | |
243 // other operations | |
244 | |
245 double | |
246 ColumnVector::min (void) const | |
247 { | |
20232
a9574e3c6e9e
Deprecate Array::length() and Sparse::length() in favour of ::numel().
Carnë Draug <carandraug@octave.org>
parents:
19697
diff
changeset
|
248 octave_idx_type len = numel (); |
458 | 249 if (len == 0) |
250 return 0.0; | |
251 | |
252 double res = elem (0); | |
253 | |
5275 | 254 for (octave_idx_type i = 1; i < len; i++) |
458 | 255 if (elem (i) < res) |
256 res = elem (i); | |
257 | |
258 return res; | |
259 } | |
260 | |
261 double | |
262 ColumnVector::max (void) const | |
263 { | |
20232
a9574e3c6e9e
Deprecate Array::length() and Sparse::length() in favour of ::numel().
Carnë Draug <carandraug@octave.org>
parents:
19697
diff
changeset
|
264 octave_idx_type len = numel (); |
458 | 265 if (len == 0) |
266 return 0.0; | |
267 | |
268 double res = elem (0); | |
269 | |
5275 | 270 for (octave_idx_type i = 1; i < len; i++) |
458 | 271 if (elem (i) > res) |
272 res = elem (i); | |
273 | |
274 return res; | |
275 } | |
276 | |
3504 | 277 std::ostream& |
278 operator << (std::ostream& os, const ColumnVector& a) | |
458 | 279 { |
280 // int field_width = os.precision () + 7; | |
20232
a9574e3c6e9e
Deprecate Array::length() and Sparse::length() in favour of ::numel().
Carnë Draug <carandraug@octave.org>
parents:
19697
diff
changeset
|
281 for (octave_idx_type i = 0; i < a.numel (); i++) |
458 | 282 os << /* setw (field_width) << */ a.elem (i) << "\n"; |
283 return os; | |
284 } | |
285 | |
3504 | 286 std::istream& |
287 operator >> (std::istream& is, ColumnVector& a) | |
458 | 288 { |
20232
a9574e3c6e9e
Deprecate Array::length() and Sparse::length() in favour of ::numel().
Carnë Draug <carandraug@octave.org>
parents:
19697
diff
changeset
|
289 octave_idx_type len = a.numel (); |
458 | 290 |
8999
dc07bc4157b8
allow empty matrices in stream input operators
Jaroslav Hajek <highegg@gmail.com>
parents:
8920
diff
changeset
|
291 if (len > 0) |
458 | 292 { |
293 double tmp; | |
5275 | 294 for (octave_idx_type i = 0; i < len; i++) |
458 | 295 { |
296 is >> tmp; | |
297 if (is) | |
298 a.elem (i) = tmp; | |
299 else | |
300 break; | |
301 } | |
302 } | |
532 | 303 return is; |
458 | 304 } |