Mercurial > octave-nkf
annotate liboctave/array/DiagArray2.cc @ 20574:dd6345fd8a97
use exceptions for better invalid index error reporting (bug #45957)
* lo-array-gripes.h, lo-array-gripes.cc (index_exception):
New base class for indexing errors.
(invalid_index, out_of_range): New classes.
(gripe_index_out_of_range): New overloaded function.
(gripe_invalid_index): New overloaded functions.
Delete version with no arguments.
(gripe_invalid_assignment_size, gripe_assignment_dimension_mismatch):
Delete.
Change uses of gripe functions as needed.
* Cell.cc (Cell::index, Cell::assign, Cell::delete_elements): Use
exceptions to collect error info about and handle indexing errors.
* data.cc (Fnth_element, do_accumarray_sum, F__accumarray_sum__,
do_accumarray_minmax, do_accumarray_minmax_fun, F__accumdim_sum__):
Likewise.
* oct-map.cc (octave_map::index, octave_map::assign,
octave_map::delete_elements): Likewise.
* sparse.cc (Fsparse): Likewise.
* sub2ind.cc (Fsub2ind, Find2sub): Likewise. New tests.
* utils.cc (dims_to_numel): Likewise.
* ov-base-diag.cc (octave_base_diag<DMT, MT>::do_index_op,
octave_base_diag<DMT, MT>::subsasgn): Likewise.
* ov-base-mat.cc (octave_base_matrix<MT>::subsref,
octave_base_matrix<MT>::assign): Likewise.
* ov-base-sparse.cc (octave_base_sparse<T>::do_index_op,
octave_base_sparse<T>::assign,
octave_base_sparse<MT>::delete_elements): Likewise.
* ov-classdef.cc (cdef_object_array::subsref,
cdef_object_array::subsasgn): Likewise.
* ov-java.cc (make_java_index): Likewise.
* ov-perm.cc (octave_perm_matrix::do_index_op): Likewise.
* ov-range.cc (octave_range::do_index_op): Likewise.
* ov-re-diag.cc (octave_diag_matrix::do_index_op): Likewise.
* ov-str-mat.cc (octave_char_matrix_str::do_index_op_internal): Likewise.
* pt-assign.cc (tree_simple_assignment::rvalue1): Likewise.
* pt-idx.cc (tree_index_expression::rvalue,
tree_index_expression::lvalue): Likewise.
* Array-util.cc (sub2ind): Likewise.
* toplev.cc (main_loop): Also catch unhandled index_exception
exceptions.
* ov-base.cc (octave_base_value::index_vector): Improve error message.
* ov-re-sparse.cc (octave_sparse_matrix::index_vector): Likewise.
* ov-complex.cc (complex_index): New class.
(gripe_complex_index): New function.
(octave_complex::index_vector): Use it.
* pt-id.h, pt-id.cc (tree_identifier::is_variable,
tree_black_hole::is_variable): Now const.
* pt-idx.cc (final_index_error): New static function.
(tree_index_expression::rvalue, tree_index_expression::lvalue):
Use it.
* index.tst: New tests.
author | Lachlan Andrew <lachlanbis@gmail.com> |
---|---|
date | Fri, 02 Oct 2015 15:07:37 -0400 |
parents | a9574e3c6e9e |
children |
rev | line source |
---|---|
1993 | 1 // Template array classes |
1988 | 2 /* |
3 | |
19731
4197fc428c7d
maint: Update copyright notices for 2015.
John W. Eaton <jwe@octave.org>
parents:
18145
diff
changeset
|
4 Copyright (C) 1996-2015 John W. Eaton |
10521
4d1fc073fbb7
add some missing copyright stmts
Jaroslav Hajek <highegg@gmail.com>
parents:
10366
diff
changeset
|
5 Copyright (C) 2010 VZLU Prague |
1988 | 6 |
7 This file is part of Octave. | |
8 | |
9 Octave is free software; you can redistribute it and/or modify it | |
10 under the terms of the GNU General Public License as published by the | |
7016 | 11 Free Software Foundation; either version 3 of the License, or (at your |
12 option) any later version. | |
1988 | 13 |
14 Octave is distributed in the hope that it will be useful, but WITHOUT | |
15 ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or | |
16 FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License | |
17 for more details. | |
18 | |
19 You should have received a copy of the GNU General Public License | |
7016 | 20 along with Octave; see the file COPYING. If not, see |
21 <http://www.gnu.org/licenses/>. | |
1988 | 22 |
23 */ | |
24 | |
25 #ifdef HAVE_CONFIG_H | |
26 #include <config.h> | |
27 #endif | |
28 | |
29 #include <cassert> | |
30 | |
3503 | 31 #include <iostream> |
1988 | 32 |
8375
e3c9102431a9
fix design problems of diag & perm matrix classes
Jaroslav Hajek <highegg@gmail.com>
parents:
8366
diff
changeset
|
33 #include <algorithm> |
e3c9102431a9
fix design problems of diag & perm matrix classes
Jaroslav Hajek <highegg@gmail.com>
parents:
8366
diff
changeset
|
34 |
1988 | 35 #include "DiagArray2.h" |
36 | |
37 #include "lo-error.h" | |
38 | |
7789
82be108cc558
First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents:
7017
diff
changeset
|
39 template <class T> |
11574
a83bad07f7e3
attempt better backward compatibility for Array resize functions
John W. Eaton <jwe@octave.org>
parents:
11570
diff
changeset
|
40 DiagArray2<T>::DiagArray2 (const Array<T>& a, octave_idx_type r, |
a83bad07f7e3
attempt better backward compatibility for Array resize functions
John W. Eaton <jwe@octave.org>
parents:
11570
diff
changeset
|
41 octave_idx_type c) |
10363
a0728e81ed25
improve diag matrix interface & implementation
Jaroslav Hajek <highegg@gmail.com>
parents:
10352
diff
changeset
|
42 : Array<T> (a.as_column ()), d1 (r), d2 (c) |
8524
937921654627
clean up Array and DiagArray2
Jaroslav Hajek <highegg@gmail.com>
parents:
8523
diff
changeset
|
43 { |
10363
a0728e81ed25
improve diag matrix interface & implementation
Jaroslav Hajek <highegg@gmail.com>
parents:
10352
diff
changeset
|
44 octave_idx_type rcmin = std::min (r, c); |
20267
a9574e3c6e9e
Deprecate Array::length() and Sparse::length() in favour of ::numel().
Carnë Draug <carandraug@octave.org>
parents:
19731
diff
changeset
|
45 if (rcmin != a.numel ()) |
11574
a83bad07f7e3
attempt better backward compatibility for Array resize functions
John W. Eaton <jwe@octave.org>
parents:
11570
diff
changeset
|
46 Array<T>::resize (dim_vector (rcmin, 1)); |
8524
937921654627
clean up Array and DiagArray2
Jaroslav Hajek <highegg@gmail.com>
parents:
8523
diff
changeset
|
47 } |
937921654627
clean up Array and DiagArray2
Jaroslav Hajek <highegg@gmail.com>
parents:
8523
diff
changeset
|
48 |
937921654627
clean up Array and DiagArray2
Jaroslav Hajek <highegg@gmail.com>
parents:
8523
diff
changeset
|
49 template <class T> |
8375
e3c9102431a9
fix design problems of diag & perm matrix classes
Jaroslav Hajek <highegg@gmail.com>
parents:
8366
diff
changeset
|
50 Array<T> |
15430
21467c7fc08f
Deprecate DiagArray2<T>::diag
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
15429
diff
changeset
|
51 DiagArray2<T>::diag (octave_idx_type k) const |
15428
fd5c0159b588
Fix diag handling of diagvectors (bug #37411)
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
14628
diff
changeset
|
52 { |
15430
21467c7fc08f
Deprecate DiagArray2<T>::diag
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
15429
diff
changeset
|
53 return extract_diag (k); |
15428
fd5c0159b588
Fix diag handling of diagvectors (bug #37411)
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
14628
diff
changeset
|
54 } |
fd5c0159b588
Fix diag handling of diagvectors (bug #37411)
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
14628
diff
changeset
|
55 |
fd5c0159b588
Fix diag handling of diagvectors (bug #37411)
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
14628
diff
changeset
|
56 template <class T> |
fd5c0159b588
Fix diag handling of diagvectors (bug #37411)
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
14628
diff
changeset
|
57 Array<T> |
15430
21467c7fc08f
Deprecate DiagArray2<T>::diag
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
15429
diff
changeset
|
58 DiagArray2<T>::extract_diag (octave_idx_type k) const |
8375
e3c9102431a9
fix design problems of diag & perm matrix classes
Jaroslav Hajek <highegg@gmail.com>
parents:
8366
diff
changeset
|
59 { |
e3c9102431a9
fix design problems of diag & perm matrix classes
Jaroslav Hajek <highegg@gmail.com>
parents:
8366
diff
changeset
|
60 Array<T> d; |
e3c9102431a9
fix design problems of diag & perm matrix classes
Jaroslav Hajek <highegg@gmail.com>
parents:
8366
diff
changeset
|
61 |
e3c9102431a9
fix design problems of diag & perm matrix classes
Jaroslav Hajek <highegg@gmail.com>
parents:
8366
diff
changeset
|
62 if (k == 0) |
8524
937921654627
clean up Array and DiagArray2
Jaroslav Hajek <highegg@gmail.com>
parents:
8523
diff
changeset
|
63 // The main diagonal is shallow-copied. |
937921654627
clean up Array and DiagArray2
Jaroslav Hajek <highegg@gmail.com>
parents:
8523
diff
changeset
|
64 d = *this; |
8375
e3c9102431a9
fix design problems of diag & perm matrix classes
Jaroslav Hajek <highegg@gmail.com>
parents:
8366
diff
changeset
|
65 else if (k > 0 && k < cols ()) |
11570
57632dea2446
attempt better backward compatibility for Array constructors
John W. Eaton <jwe@octave.org>
parents:
11523
diff
changeset
|
66 d = Array<T> (dim_vector (std::min (cols () - k, rows ()), 1), T ()); |
8375
e3c9102431a9
fix design problems of diag & perm matrix classes
Jaroslav Hajek <highegg@gmail.com>
parents:
8366
diff
changeset
|
67 else if (k < 0 && -k < rows ()) |
11570
57632dea2446
attempt better backward compatibility for Array constructors
John W. Eaton <jwe@octave.org>
parents:
11523
diff
changeset
|
68 d = Array<T> (dim_vector (std::min (rows () + k, cols ()), 1), T ()); |
18145
a86d608c413c
Return empty matrix rather than issuing error when requested diagonal is out of range.
Marco Caliari <marco.caliari@univr.it>
parents:
17744
diff
changeset
|
69 else // Matlab returns [] 0x1 for out-of-range diagonal |
a86d608c413c
Return empty matrix rather than issuing error when requested diagonal is out of range.
Marco Caliari <marco.caliari@univr.it>
parents:
17744
diff
changeset
|
70 d.resize (dim_vector (0, 1)); |
8375
e3c9102431a9
fix design problems of diag & perm matrix classes
Jaroslav Hajek <highegg@gmail.com>
parents:
8366
diff
changeset
|
71 |
e3c9102431a9
fix design problems of diag & perm matrix classes
Jaroslav Hajek <highegg@gmail.com>
parents:
8366
diff
changeset
|
72 return d; |
e3c9102431a9
fix design problems of diag & perm matrix classes
Jaroslav Hajek <highegg@gmail.com>
parents:
8366
diff
changeset
|
73 } |
e3c9102431a9
fix design problems of diag & perm matrix classes
Jaroslav Hajek <highegg@gmail.com>
parents:
8366
diff
changeset
|
74 |
e3c9102431a9
fix design problems of diag & perm matrix classes
Jaroslav Hajek <highegg@gmail.com>
parents:
8366
diff
changeset
|
75 template <class T> |
7789
82be108cc558
First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents:
7017
diff
changeset
|
76 DiagArray2<T> |
82be108cc558
First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents:
7017
diff
changeset
|
77 DiagArray2<T>::transpose (void) const |
82be108cc558
First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents:
7017
diff
changeset
|
78 { |
10363
a0728e81ed25
improve diag matrix interface & implementation
Jaroslav Hajek <highegg@gmail.com>
parents:
10352
diff
changeset
|
79 return DiagArray2<T> (*this, d2, d1); |
7789
82be108cc558
First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents:
7017
diff
changeset
|
80 } |
82be108cc558
First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents:
7017
diff
changeset
|
81 |
82be108cc558
First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents:
7017
diff
changeset
|
82 template <class T> |
82be108cc558
First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents:
7017
diff
changeset
|
83 DiagArray2<T> |
82be108cc558
First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents:
7017
diff
changeset
|
84 DiagArray2<T>::hermitian (T (* fcn) (const T&)) const |
82be108cc558
First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents:
7017
diff
changeset
|
85 { |
10363
a0728e81ed25
improve diag matrix interface & implementation
Jaroslav Hajek <highegg@gmail.com>
parents:
10352
diff
changeset
|
86 return DiagArray2<T> (Array<T>::template map<T> (fcn), d2, d1); |
7789
82be108cc558
First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents:
7017
diff
changeset
|
87 } |
82be108cc558
First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents:
7017
diff
changeset
|
88 |
1988 | 89 // A two-dimensional array with diagonal elements only. |
90 | |
91 template <class T> | |
92 void | |
10350
12884915a8e4
merge MArray classes & improve Array interface
Jaroslav Hajek <highegg@gmail.com>
parents:
10158
diff
changeset
|
93 DiagArray2<T>::resize (octave_idx_type r, octave_idx_type c, |
12884915a8e4
merge MArray classes & improve Array interface
Jaroslav Hajek <highegg@gmail.com>
parents:
10158
diff
changeset
|
94 const T& rfv) |
1988 | 95 { |
96 if (r < 0 || c < 0) | |
97 { | |
98 (*current_liboctave_error_handler) ("can't resize to negative dimensions"); | |
99 return; | |
100 } | |
101 | |
8524
937921654627
clean up Array and DiagArray2
Jaroslav Hajek <highegg@gmail.com>
parents:
8523
diff
changeset
|
102 if (r != dim1 () || c != dim2 ()) |
1988 | 103 { |
11574
a83bad07f7e3
attempt better backward compatibility for Array resize functions
John W. Eaton <jwe@octave.org>
parents:
11570
diff
changeset
|
104 Array<T>::resize (dim_vector (std::min (r, c), 1), rfv); |
8524
937921654627
clean up Array and DiagArray2
Jaroslav Hajek <highegg@gmail.com>
parents:
8523
diff
changeset
|
105 d1 = r; d2 = c; |
937921654627
clean up Array and DiagArray2
Jaroslav Hajek <highegg@gmail.com>
parents:
8523
diff
changeset
|
106 } |
937921654627
clean up Array and DiagArray2
Jaroslav Hajek <highegg@gmail.com>
parents:
8523
diff
changeset
|
107 } |
1988 | 108 |
8524
937921654627
clean up Array and DiagArray2
Jaroslav Hajek <highegg@gmail.com>
parents:
8523
diff
changeset
|
109 template <class T> |
11570
57632dea2446
attempt better backward compatibility for Array constructors
John W. Eaton <jwe@octave.org>
parents:
11523
diff
changeset
|
110 Array<T> |
57632dea2446
attempt better backward compatibility for Array constructors
John W. Eaton <jwe@octave.org>
parents:
11523
diff
changeset
|
111 DiagArray2<T>::array_value (void) const |
8524
937921654627
clean up Array and DiagArray2
Jaroslav Hajek <highegg@gmail.com>
parents:
8523
diff
changeset
|
112 { |
11570
57632dea2446
attempt better backward compatibility for Array constructors
John W. Eaton <jwe@octave.org>
parents:
11523
diff
changeset
|
113 Array<T> result (dims (), T (0)); |
57632dea2446
attempt better backward compatibility for Array constructors
John W. Eaton <jwe@octave.org>
parents:
11523
diff
changeset
|
114 |
8524
937921654627
clean up Array and DiagArray2
Jaroslav Hajek <highegg@gmail.com>
parents:
8523
diff
changeset
|
115 for (octave_idx_type i = 0, len = length (); i < len; i++) |
937921654627
clean up Array and DiagArray2
Jaroslav Hajek <highegg@gmail.com>
parents:
8523
diff
changeset
|
116 result.xelem (i, i) = dgelem (i); |
1988 | 117 |
8524
937921654627
clean up Array and DiagArray2
Jaroslav Hajek <highegg@gmail.com>
parents:
8523
diff
changeset
|
118 return result; |
1988 | 119 } |
14628
63ae976ac2e7
preserve DiagArray2 interface for stable release series
John W. Eaton <jwe@octave.org>
parents:
14590
diff
changeset
|
120 |
63ae976ac2e7
preserve DiagArray2 interface for stable release series
John W. Eaton <jwe@octave.org>
parents:
14590
diff
changeset
|
121 template <typename T> |
63ae976ac2e7
preserve DiagArray2 interface for stable release series
John W. Eaton <jwe@octave.org>
parents:
14590
diff
changeset
|
122 bool |
63ae976ac2e7
preserve DiagArray2 interface for stable release series
John W. Eaton <jwe@octave.org>
parents:
14590
diff
changeset
|
123 DiagArray2<T>::check_idx (octave_idx_type r, octave_idx_type c) const |
63ae976ac2e7
preserve DiagArray2 interface for stable release series
John W. Eaton <jwe@octave.org>
parents:
14590
diff
changeset
|
124 { |
63ae976ac2e7
preserve DiagArray2 interface for stable release series
John W. Eaton <jwe@octave.org>
parents:
14590
diff
changeset
|
125 bool ok = true; |
63ae976ac2e7
preserve DiagArray2 interface for stable release series
John W. Eaton <jwe@octave.org>
parents:
14590
diff
changeset
|
126 |
63ae976ac2e7
preserve DiagArray2 interface for stable release series
John W. Eaton <jwe@octave.org>
parents:
14590
diff
changeset
|
127 if (r < 0 || r >= dim1 ()) |
63ae976ac2e7
preserve DiagArray2 interface for stable release series
John W. Eaton <jwe@octave.org>
parents:
14590
diff
changeset
|
128 { |
20574
dd6345fd8a97
use exceptions for better invalid index error reporting (bug #45957)
Lachlan Andrew <lachlanbis@gmail.com>
parents:
20267
diff
changeset
|
129 gripe_index_out_of_range (2, 1, r+1, dim1 (), dims ()); |
14628
63ae976ac2e7
preserve DiagArray2 interface for stable release series
John W. Eaton <jwe@octave.org>
parents:
14590
diff
changeset
|
130 ok = false; |
63ae976ac2e7
preserve DiagArray2 interface for stable release series
John W. Eaton <jwe@octave.org>
parents:
14590
diff
changeset
|
131 } |
63ae976ac2e7
preserve DiagArray2 interface for stable release series
John W. Eaton <jwe@octave.org>
parents:
14590
diff
changeset
|
132 |
63ae976ac2e7
preserve DiagArray2 interface for stable release series
John W. Eaton <jwe@octave.org>
parents:
14590
diff
changeset
|
133 if (c < 0 || c >= dim2 ()) |
63ae976ac2e7
preserve DiagArray2 interface for stable release series
John W. Eaton <jwe@octave.org>
parents:
14590
diff
changeset
|
134 { |
20574
dd6345fd8a97
use exceptions for better invalid index error reporting (bug #45957)
Lachlan Andrew <lachlanbis@gmail.com>
parents:
20267
diff
changeset
|
135 gripe_index_out_of_range (2, 2, c+1, dim2 (), dims ()); |
14628
63ae976ac2e7
preserve DiagArray2 interface for stable release series
John W. Eaton <jwe@octave.org>
parents:
14590
diff
changeset
|
136 ok = false; |
63ae976ac2e7
preserve DiagArray2 interface for stable release series
John W. Eaton <jwe@octave.org>
parents:
14590
diff
changeset
|
137 } |
63ae976ac2e7
preserve DiagArray2 interface for stable release series
John W. Eaton <jwe@octave.org>
parents:
14590
diff
changeset
|
138 |
63ae976ac2e7
preserve DiagArray2 interface for stable release series
John W. Eaton <jwe@octave.org>
parents:
14590
diff
changeset
|
139 return ok; |
63ae976ac2e7
preserve DiagArray2 interface for stable release series
John W. Eaton <jwe@octave.org>
parents:
14590
diff
changeset
|
140 } |