Mercurial > octave
annotate liboctave/array/CMatrix.cc @ 22204:469c817eb256
svd: reduce code duplication with more use of template and macro.
* liboctave/numeric/svd.cc, liboctave/numeric/svd.h: remove unused
constructor with reference for int (info). This allows to move all
of the constructor into a single template, so remove init(). Two
new methods, gesvd and gesdd, are fully specialized but the main
hunck of code are the long list of arguments. Scope type and drive
enums to the svd class for clarity, and rename member names. Add
a new member for the drive used.
* libinterp/corefcn/svd.cc: fix typenames for the svd enums which
are now scoped.
* CMatrix.cc, dMatrix.cc, fCMatrix.cc, fMatrix.cc: fix typenames
for the svd enums which are now scoped.
author | Carnë Draug <carandraug@octave.org> |
---|---|
date | Thu, 04 Aug 2016 20:20:27 +0100 |
parents | e43d83253e28 |
children | 77c4d43e06d1 |
rev | line source |
---|---|
1993 | 1 // Matrix manipulations. |
458 | 2 /* |
3 | |
19697
4197fc428c7d
maint: Update copyright notices for 2015.
John W. Eaton <jwe@octave.org>
parents:
19457
diff
changeset
|
4 Copyright (C) 1994-2015 John W. Eaton |
11523 | 5 Copyright (C) 2008-2009 Jaroslav Hajek |
9601
a9b37bae1802
add a couple of missing copyright statements
Jaroslav Hajek <highegg@gmail.com>
parents:
9578
diff
changeset
|
6 Copyright (C) 2009 VZLU Prague, a.s. |
458 | 7 |
8 This file is part of Octave. | |
9 | |
10 Octave is free software; you can redistribute it and/or modify it | |
11 under the terms of the GNU General Public License as published by the | |
7016 | 12 Free Software Foundation; either version 3 of the License, or (at your |
13 option) any later version. | |
458 | 14 |
15 Octave is distributed in the hope that it will be useful, but WITHOUT | |
16 ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or | |
17 FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License | |
18 for more details. | |
19 | |
20 You should have received a copy of the GNU General Public License | |
7016 | 21 along with Octave; see the file COPYING. If not, see |
22 <http://www.gnu.org/licenses/>. | |
458 | 23 |
24 */ | |
25 | |
21724
aba2e6293dd8
use "#if ..." consistently instead of "#ifdef" and "#ifndef"
John W. Eaton <jwe@octave.org>
parents:
21723
diff
changeset
|
26 #if defined (HAVE_CONFIG_H) |
21301
40de9f8f23a6
Use '#include "config.h"' rather than <config.h>.
Rik <rik@octave.org>
parents:
21273
diff
changeset
|
27 # include "config.h" |
458 | 28 #endif |
29 | |
1367 | 30 #include <cfloat> |
31 | |
3503 | 32 #include <iostream> |
6209 | 33 #include <vector> |
1367 | 34 |
5775 | 35 // FIXME |
2443 | 36 #include <sys/types.h> |
458 | 37 |
4669 | 38 #include "Array-util.h" |
19269
65554f5847ac
don't include oct-locbuf.h in header files unnecessarily
John W. Eaton <jwe@octave.org>
parents:
19065
diff
changeset
|
39 #include "boolMatrix.h" |
65554f5847ac
don't include oct-locbuf.h in header files unnecessarily
John W. Eaton <jwe@octave.org>
parents:
19065
diff
changeset
|
40 #include "chMatrix.h" |
21269
3c8a3d35661a
better use of templates for Cholesky factorization
John W. Eaton <jwe@octave.org>
parents:
21266
diff
changeset
|
41 #include "chol.h" |
19269
65554f5847ac
don't include oct-locbuf.h in header files unnecessarily
John W. Eaton <jwe@octave.org>
parents:
19065
diff
changeset
|
42 #include "dMatrix.h" |
2828 | 43 #include "CMatrix.h" |
19320
d0c73e23a505
Change inheritance tree so that <T>Matrix inherit from <T>NDArray.
Carnë Draug <carandraug@octave.org>
parents:
19269
diff
changeset
|
44 #include "CNDArray.h" |
19269
65554f5847ac
don't include oct-locbuf.h in header files unnecessarily
John W. Eaton <jwe@octave.org>
parents:
19065
diff
changeset
|
45 #include "CRowVector.h" |
65554f5847ac
don't include oct-locbuf.h in header files unnecessarily
John W. Eaton <jwe@octave.org>
parents:
19065
diff
changeset
|
46 #include "dRowVector.h" |
65554f5847ac
don't include oct-locbuf.h in header files unnecessarily
John W. Eaton <jwe@octave.org>
parents:
19065
diff
changeset
|
47 #include "CDiagMatrix.h" |
65554f5847ac
don't include oct-locbuf.h in header files unnecessarily
John W. Eaton <jwe@octave.org>
parents:
19065
diff
changeset
|
48 #include "dDiagMatrix.h" |
21266
e69eaee28737
make better use of templates for Schur decomposition
John W. Eaton <jwe@octave.org>
parents:
21202
diff
changeset
|
49 #include "schur.h" |
21273
cbced1c09916
better use of templates for svd classes
John W. Eaton <jwe@octave.org>
parents:
21269
diff
changeset
|
50 #include "svd.h" |
9523
0ce82753dd72
more configure changes for libraries
John W. Eaton <jwe@octave.org>
parents:
9469
diff
changeset
|
51 #include "DET.h" |
1847 | 52 #include "f77-fcn.h" |
7503
8c32f95c2639
convert mapper functions to new format
David Bateman <dbateman@free.fr>
parents:
7488
diff
changeset
|
53 #include "functor.h" |
458 | 54 #include "lo-error.h" |
2354 | 55 #include "lo-ieee.h" |
56 #include "lo-mappers.h" | |
1968 | 57 #include "lo-utils.h" |
2828 | 58 #include "mx-cm-dm.h" |
9523
0ce82753dd72
more configure changes for libraries
John W. Eaton <jwe@octave.org>
parents:
9469
diff
changeset
|
59 #include "mx-cm-s.h" |
3176 | 60 #include "mx-dm-cm.h" |
1367 | 61 #include "mx-inlines.cc" |
8774
b756ce0002db
split implementation and interface in mx-op-defs and MArray-defs
Jaroslav Hajek <highegg@gmail.com>
parents:
8743
diff
changeset
|
62 #include "mx-op-defs.h" |
1650 | 63 #include "oct-cmplx.h" |
9523
0ce82753dd72
more configure changes for libraries
John W. Eaton <jwe@octave.org>
parents:
9469
diff
changeset
|
64 #include "oct-fftw.h" |
0ce82753dd72
more configure changes for libraries
John W. Eaton <jwe@octave.org>
parents:
9469
diff
changeset
|
65 #include "oct-locbuf.h" |
8336
9813c07ca946
make det take advantage of matrix type
Jaroslav Hajek <highegg@gmail.com>
parents:
8335
diff
changeset
|
66 #include "oct-norm.h" |
458 | 67 |
68 // Fortran functions we call. | |
69 | |
70 extern "C" | |
71 { | |
7477 | 72 F77_RET_T |
22133
59cadee1c74b
new macros for F77 data types
John W. Eaton <jwe@octave.org>
parents:
22085
diff
changeset
|
73 F77_FUNC (xilaenv, XILAENV) (const F77_INT&, |
11518 | 74 F77_CONST_CHAR_ARG_DECL, |
10314
07ebe522dac2
untabify liboctave C++ sources
John W. Eaton <jwe@octave.org>
parents:
10213
diff
changeset
|
75 F77_CONST_CHAR_ARG_DECL, |
22133
59cadee1c74b
new macros for F77 data types
John W. Eaton <jwe@octave.org>
parents:
22085
diff
changeset
|
76 const F77_INT&, const F77_INT&, |
59cadee1c74b
new macros for F77 data types
John W. Eaton <jwe@octave.org>
parents:
22085
diff
changeset
|
77 const F77_INT&, const F77_INT&, |
59cadee1c74b
new macros for F77 data types
John W. Eaton <jwe@octave.org>
parents:
22085
diff
changeset
|
78 F77_INT& |
11518 | 79 F77_CHAR_ARG_LEN_DECL |
80 F77_CHAR_ARG_LEN_DECL); | |
7476 | 81 |
4552 | 82 F77_RET_T |
83 F77_FUNC (zgebal, ZGEBAL) (F77_CONST_CHAR_ARG_DECL, | |
22133
59cadee1c74b
new macros for F77 data types
John W. Eaton <jwe@octave.org>
parents:
22085
diff
changeset
|
84 const F77_INT&, F77_DBLE_CMPLX*, |
59cadee1c74b
new macros for F77 data types
John W. Eaton <jwe@octave.org>
parents:
22085
diff
changeset
|
85 const F77_INT&, F77_INT&, |
59cadee1c74b
new macros for F77 data types
John W. Eaton <jwe@octave.org>
parents:
22085
diff
changeset
|
86 F77_INT&, F77_DBLE*, F77_INT& |
10314
07ebe522dac2
untabify liboctave C++ sources
John W. Eaton <jwe@octave.org>
parents:
10213
diff
changeset
|
87 F77_CHAR_ARG_LEN_DECL); |
4552 | 88 |
89 F77_RET_T | |
90 F77_FUNC (dgebak, DGEBAK) (F77_CONST_CHAR_ARG_DECL, | |
10314
07ebe522dac2
untabify liboctave C++ sources
John W. Eaton <jwe@octave.org>
parents:
10213
diff
changeset
|
91 F77_CONST_CHAR_ARG_DECL, |
22133
59cadee1c74b
new macros for F77 data types
John W. Eaton <jwe@octave.org>
parents:
22085
diff
changeset
|
92 const F77_INT&, const F77_INT&, |
59cadee1c74b
new macros for F77 data types
John W. Eaton <jwe@octave.org>
parents:
22085
diff
changeset
|
93 const F77_INT&, F77_DBLE*, |
59cadee1c74b
new macros for F77 data types
John W. Eaton <jwe@octave.org>
parents:
22085
diff
changeset
|
94 const F77_INT&, F77_DBLE*, |
59cadee1c74b
new macros for F77 data types
John W. Eaton <jwe@octave.org>
parents:
22085
diff
changeset
|
95 const F77_INT&, F77_INT& |
10314
07ebe522dac2
untabify liboctave C++ sources
John W. Eaton <jwe@octave.org>
parents:
10213
diff
changeset
|
96 F77_CHAR_ARG_LEN_DECL |
07ebe522dac2
untabify liboctave C++ sources
John W. Eaton <jwe@octave.org>
parents:
10213
diff
changeset
|
97 F77_CHAR_ARG_LEN_DECL); |
4552 | 98 |
99 F77_RET_T | |
100 F77_FUNC (zgemm, ZGEMM) (F77_CONST_CHAR_ARG_DECL, | |
10314
07ebe522dac2
untabify liboctave C++ sources
John W. Eaton <jwe@octave.org>
parents:
10213
diff
changeset
|
101 F77_CONST_CHAR_ARG_DECL, |
22133
59cadee1c74b
new macros for F77 data types
John W. Eaton <jwe@octave.org>
parents:
22085
diff
changeset
|
102 const F77_INT&, const F77_INT&, |
59cadee1c74b
new macros for F77 data types
John W. Eaton <jwe@octave.org>
parents:
22085
diff
changeset
|
103 const F77_INT&, const F77_DBLE_CMPLX&, |
59cadee1c74b
new macros for F77 data types
John W. Eaton <jwe@octave.org>
parents:
22085
diff
changeset
|
104 const F77_DBLE_CMPLX*, const F77_INT&, |
59cadee1c74b
new macros for F77 data types
John W. Eaton <jwe@octave.org>
parents:
22085
diff
changeset
|
105 const F77_DBLE_CMPLX*, const F77_INT&, |
59cadee1c74b
new macros for F77 data types
John W. Eaton <jwe@octave.org>
parents:
22085
diff
changeset
|
106 const F77_DBLE_CMPLX&, F77_DBLE_CMPLX*, const F77_INT& |
10314
07ebe522dac2
untabify liboctave C++ sources
John W. Eaton <jwe@octave.org>
parents:
10213
diff
changeset
|
107 F77_CHAR_ARG_LEN_DECL |
07ebe522dac2
untabify liboctave C++ sources
John W. Eaton <jwe@octave.org>
parents:
10213
diff
changeset
|
108 F77_CHAR_ARG_LEN_DECL); |
4552 | 109 |
110 F77_RET_T | |
5983 | 111 F77_FUNC (zgemv, ZGEMV) (F77_CONST_CHAR_ARG_DECL, |
22133
59cadee1c74b
new macros for F77 data types
John W. Eaton <jwe@octave.org>
parents:
22085
diff
changeset
|
112 const F77_INT&, const F77_INT&, |
59cadee1c74b
new macros for F77 data types
John W. Eaton <jwe@octave.org>
parents:
22085
diff
changeset
|
113 const F77_DBLE_CMPLX&, const F77_DBLE_CMPLX*, |
59cadee1c74b
new macros for F77 data types
John W. Eaton <jwe@octave.org>
parents:
22085
diff
changeset
|
114 const F77_INT&, const F77_DBLE_CMPLX*, |
59cadee1c74b
new macros for F77 data types
John W. Eaton <jwe@octave.org>
parents:
22085
diff
changeset
|
115 const F77_INT&, const F77_DBLE_CMPLX&, |
59cadee1c74b
new macros for F77 data types
John W. Eaton <jwe@octave.org>
parents:
22085
diff
changeset
|
116 F77_DBLE_CMPLX*, const F77_INT& |
5983 | 117 F77_CHAR_ARG_LEN_DECL); |
118 | |
119 F77_RET_T | |
22133
59cadee1c74b
new macros for F77 data types
John W. Eaton <jwe@octave.org>
parents:
22085
diff
changeset
|
120 F77_FUNC (xzdotu, XZDOTU) (const F77_INT&, const F77_DBLE_CMPLX*, |
59cadee1c74b
new macros for F77 data types
John W. Eaton <jwe@octave.org>
parents:
22085
diff
changeset
|
121 const F77_INT&, const F77_DBLE_CMPLX*, |
22135
407c66ae1e20
reduce warnings from GCC's link-time optimization feature (bug #48531)
John W. Eaton <jwe@octave.org>
parents:
22133
diff
changeset
|
122 const F77_INT&, F77_DBLE_CMPLX*); |
5983 | 123 |
124 F77_RET_T | |
22133
59cadee1c74b
new macros for F77 data types
John W. Eaton <jwe@octave.org>
parents:
22085
diff
changeset
|
125 F77_FUNC (xzdotc, XZDOTC) (const F77_INT&, const F77_DBLE_CMPLX*, |
59cadee1c74b
new macros for F77 data types
John W. Eaton <jwe@octave.org>
parents:
22085
diff
changeset
|
126 const F77_INT&, const F77_DBLE_CMPLX*, |
22135
407c66ae1e20
reduce warnings from GCC's link-time optimization feature (bug #48531)
John W. Eaton <jwe@octave.org>
parents:
22133
diff
changeset
|
127 const F77_INT&, F77_DBLE_CMPLX*); |
7800
5861b95e9879
support for compound operators, implement trans_mul, mul_trans, herm_mul and mul_herm
Jaroslav Hajek <highegg@gmail.com>
parents:
7789
diff
changeset
|
128 |
5861b95e9879
support for compound operators, implement trans_mul, mul_trans, herm_mul and mul_herm
Jaroslav Hajek <highegg@gmail.com>
parents:
7789
diff
changeset
|
129 F77_RET_T |
7801
776791438957
map symmetric cases to xHERK, xSYRK
Jaroslav Hajek <highegg@gmail.com>
parents:
7800
diff
changeset
|
130 F77_FUNC (zsyrk, ZSYRK) (F77_CONST_CHAR_ARG_DECL, |
10314
07ebe522dac2
untabify liboctave C++ sources
John W. Eaton <jwe@octave.org>
parents:
10213
diff
changeset
|
131 F77_CONST_CHAR_ARG_DECL, |
22133
59cadee1c74b
new macros for F77 data types
John W. Eaton <jwe@octave.org>
parents:
22085
diff
changeset
|
132 const F77_INT&, const F77_INT&, |
59cadee1c74b
new macros for F77 data types
John W. Eaton <jwe@octave.org>
parents:
22085
diff
changeset
|
133 const F77_DBLE_CMPLX&, const F77_DBLE_CMPLX*, |
59cadee1c74b
new macros for F77 data types
John W. Eaton <jwe@octave.org>
parents:
22085
diff
changeset
|
134 const F77_INT&, const F77_DBLE_CMPLX&, |
59cadee1c74b
new macros for F77 data types
John W. Eaton <jwe@octave.org>
parents:
22085
diff
changeset
|
135 F77_DBLE_CMPLX*, const F77_INT& |
10314
07ebe522dac2
untabify liboctave C++ sources
John W. Eaton <jwe@octave.org>
parents:
10213
diff
changeset
|
136 F77_CHAR_ARG_LEN_DECL |
07ebe522dac2
untabify liboctave C++ sources
John W. Eaton <jwe@octave.org>
parents:
10213
diff
changeset
|
137 F77_CHAR_ARG_LEN_DECL); |
7801
776791438957
map symmetric cases to xHERK, xSYRK
Jaroslav Hajek <highegg@gmail.com>
parents:
7800
diff
changeset
|
138 |
776791438957
map symmetric cases to xHERK, xSYRK
Jaroslav Hajek <highegg@gmail.com>
parents:
7800
diff
changeset
|
139 F77_RET_T |
776791438957
map symmetric cases to xHERK, xSYRK
Jaroslav Hajek <highegg@gmail.com>
parents:
7800
diff
changeset
|
140 F77_FUNC (zherk, ZHERK) (F77_CONST_CHAR_ARG_DECL, |
10314
07ebe522dac2
untabify liboctave C++ sources
John W. Eaton <jwe@octave.org>
parents:
10213
diff
changeset
|
141 F77_CONST_CHAR_ARG_DECL, |
22133
59cadee1c74b
new macros for F77 data types
John W. Eaton <jwe@octave.org>
parents:
22085
diff
changeset
|
142 const F77_INT&, const F77_INT&, |
59cadee1c74b
new macros for F77 data types
John W. Eaton <jwe@octave.org>
parents:
22085
diff
changeset
|
143 const F77_DBLE&, const F77_DBLE_CMPLX*, |
59cadee1c74b
new macros for F77 data types
John W. Eaton <jwe@octave.org>
parents:
22085
diff
changeset
|
144 const F77_INT&, const F77_DBLE&, F77_DBLE_CMPLX*, |
59cadee1c74b
new macros for F77 data types
John W. Eaton <jwe@octave.org>
parents:
22085
diff
changeset
|
145 const F77_INT& |
10314
07ebe522dac2
untabify liboctave C++ sources
John W. Eaton <jwe@octave.org>
parents:
10213
diff
changeset
|
146 F77_CHAR_ARG_LEN_DECL |
07ebe522dac2
untabify liboctave C++ sources
John W. Eaton <jwe@octave.org>
parents:
10213
diff
changeset
|
147 F77_CHAR_ARG_LEN_DECL); |
7801
776791438957
map symmetric cases to xHERK, xSYRK
Jaroslav Hajek <highegg@gmail.com>
parents:
7800
diff
changeset
|
148 |
776791438957
map symmetric cases to xHERK, xSYRK
Jaroslav Hajek <highegg@gmail.com>
parents:
7800
diff
changeset
|
149 F77_RET_T |
22133
59cadee1c74b
new macros for F77 data types
John W. Eaton <jwe@octave.org>
parents:
22085
diff
changeset
|
150 F77_FUNC (zgetrf, ZGETRF) (const F77_INT&, const F77_INT&, |
59cadee1c74b
new macros for F77 data types
John W. Eaton <jwe@octave.org>
parents:
22085
diff
changeset
|
151 F77_DBLE_CMPLX*, const F77_INT&, |
59cadee1c74b
new macros for F77 data types
John W. Eaton <jwe@octave.org>
parents:
22085
diff
changeset
|
152 F77_INT*, F77_INT&); |
4552 | 153 |
154 F77_RET_T | |
155 F77_FUNC (zgetrs, ZGETRS) (F77_CONST_CHAR_ARG_DECL, | |
22133
59cadee1c74b
new macros for F77 data types
John W. Eaton <jwe@octave.org>
parents:
22085
diff
changeset
|
156 const F77_INT&, const F77_INT&, |
59cadee1c74b
new macros for F77 data types
John W. Eaton <jwe@octave.org>
parents:
22085
diff
changeset
|
157 F77_DBLE_CMPLX*, const F77_INT&, |
59cadee1c74b
new macros for F77 data types
John W. Eaton <jwe@octave.org>
parents:
22085
diff
changeset
|
158 const F77_INT*, F77_DBLE_CMPLX*, |
59cadee1c74b
new macros for F77 data types
John W. Eaton <jwe@octave.org>
parents:
22085
diff
changeset
|
159 const F77_INT&, F77_INT& |
10314
07ebe522dac2
untabify liboctave C++ sources
John W. Eaton <jwe@octave.org>
parents:
10213
diff
changeset
|
160 F77_CHAR_ARG_LEN_DECL); |
4552 | 161 |
162 F77_RET_T | |
22133
59cadee1c74b
new macros for F77 data types
John W. Eaton <jwe@octave.org>
parents:
22085
diff
changeset
|
163 F77_FUNC (zgetri, ZGETRI) (const F77_INT&, F77_DBLE_CMPLX*, |
59cadee1c74b
new macros for F77 data types
John W. Eaton <jwe@octave.org>
parents:
22085
diff
changeset
|
164 const F77_INT&, const F77_INT*, |
59cadee1c74b
new macros for F77 data types
John W. Eaton <jwe@octave.org>
parents:
22085
diff
changeset
|
165 F77_DBLE_CMPLX*, const F77_INT&, |
59cadee1c74b
new macros for F77 data types
John W. Eaton <jwe@octave.org>
parents:
22085
diff
changeset
|
166 F77_INT&); |
4552 | 167 |
168 F77_RET_T | |
169 F77_FUNC (zgecon, ZGECON) (F77_CONST_CHAR_ARG_DECL, | |
22133
59cadee1c74b
new macros for F77 data types
John W. Eaton <jwe@octave.org>
parents:
22085
diff
changeset
|
170 const F77_INT&, F77_DBLE_CMPLX*, |
59cadee1c74b
new macros for F77 data types
John W. Eaton <jwe@octave.org>
parents:
22085
diff
changeset
|
171 const F77_INT&, const F77_DBLE&, F77_DBLE&, |
59cadee1c74b
new macros for F77 data types
John W. Eaton <jwe@octave.org>
parents:
22085
diff
changeset
|
172 F77_DBLE_CMPLX*, F77_DBLE*, F77_INT& |
10314
07ebe522dac2
untabify liboctave C++ sources
John W. Eaton <jwe@octave.org>
parents:
10213
diff
changeset
|
173 F77_CHAR_ARG_LEN_DECL); |
4552 | 174 |
175 F77_RET_T | |
22133
59cadee1c74b
new macros for F77 data types
John W. Eaton <jwe@octave.org>
parents:
22085
diff
changeset
|
176 F77_FUNC (zgelsy, ZGELSY) (const F77_INT&, const F77_INT&, |
59cadee1c74b
new macros for F77 data types
John W. Eaton <jwe@octave.org>
parents:
22085
diff
changeset
|
177 const F77_INT&, F77_DBLE_CMPLX*, |
59cadee1c74b
new macros for F77 data types
John W. Eaton <jwe@octave.org>
parents:
22085
diff
changeset
|
178 const F77_INT&, F77_DBLE_CMPLX*, |
59cadee1c74b
new macros for F77 data types
John W. Eaton <jwe@octave.org>
parents:
22085
diff
changeset
|
179 const F77_INT&, F77_INT*, |
59cadee1c74b
new macros for F77 data types
John W. Eaton <jwe@octave.org>
parents:
22085
diff
changeset
|
180 F77_DBLE&, F77_INT&, F77_DBLE_CMPLX*, |
59cadee1c74b
new macros for F77 data types
John W. Eaton <jwe@octave.org>
parents:
22085
diff
changeset
|
181 const F77_INT&, F77_DBLE*, |
59cadee1c74b
new macros for F77 data types
John W. Eaton <jwe@octave.org>
parents:
22085
diff
changeset
|
182 F77_INT&); |
7072 | 183 |
184 F77_RET_T | |
22133
59cadee1c74b
new macros for F77 data types
John W. Eaton <jwe@octave.org>
parents:
22085
diff
changeset
|
185 F77_FUNC (zgelsd, ZGELSD) (const F77_INT&, const F77_INT&, |
59cadee1c74b
new macros for F77 data types
John W. Eaton <jwe@octave.org>
parents:
22085
diff
changeset
|
186 const F77_INT&, F77_DBLE_CMPLX*, |
59cadee1c74b
new macros for F77 data types
John W. Eaton <jwe@octave.org>
parents:
22085
diff
changeset
|
187 const F77_INT&, F77_DBLE_CMPLX*, |
59cadee1c74b
new macros for F77 data types
John W. Eaton <jwe@octave.org>
parents:
22085
diff
changeset
|
188 const F77_INT&, F77_DBLE*, F77_DBLE&, |
59cadee1c74b
new macros for F77 data types
John W. Eaton <jwe@octave.org>
parents:
22085
diff
changeset
|
189 F77_INT&, F77_DBLE_CMPLX*, |
59cadee1c74b
new macros for F77 data types
John W. Eaton <jwe@octave.org>
parents:
22085
diff
changeset
|
190 const F77_INT&, F77_DBLE*, |
59cadee1c74b
new macros for F77 data types
John W. Eaton <jwe@octave.org>
parents:
22085
diff
changeset
|
191 F77_INT*, F77_INT&); |
458 | 192 |
5785 | 193 F77_RET_T |
11518 | 194 F77_FUNC (zpotrf, ZPOTRF) (F77_CONST_CHAR_ARG_DECL, |
22133
59cadee1c74b
new macros for F77 data types
John W. Eaton <jwe@octave.org>
parents:
22085
diff
changeset
|
195 const F77_INT&, F77_DBLE_CMPLX*, |
59cadee1c74b
new macros for F77 data types
John W. Eaton <jwe@octave.org>
parents:
22085
diff
changeset
|
196 const F77_INT&, F77_INT& |
10314
07ebe522dac2
untabify liboctave C++ sources
John W. Eaton <jwe@octave.org>
parents:
10213
diff
changeset
|
197 F77_CHAR_ARG_LEN_DECL); |
5785 | 198 |
199 F77_RET_T | |
11518 | 200 F77_FUNC (zpocon, ZPOCON) (F77_CONST_CHAR_ARG_DECL, |
22133
59cadee1c74b
new macros for F77 data types
John W. Eaton <jwe@octave.org>
parents:
22085
diff
changeset
|
201 const F77_INT&, F77_DBLE_CMPLX*, |
59cadee1c74b
new macros for F77 data types
John W. Eaton <jwe@octave.org>
parents:
22085
diff
changeset
|
202 const F77_INT&, const F77_DBLE&, |
59cadee1c74b
new macros for F77 data types
John W. Eaton <jwe@octave.org>
parents:
22085
diff
changeset
|
203 F77_DBLE&, F77_DBLE_CMPLX*, F77_DBLE*, F77_INT& |
11518 | 204 F77_CHAR_ARG_LEN_DECL); |
205 | |
206 F77_RET_T | |
207 F77_FUNC (zpotrs, ZPOTRS) (F77_CONST_CHAR_ARG_DECL, | |
22133
59cadee1c74b
new macros for F77 data types
John W. Eaton <jwe@octave.org>
parents:
22085
diff
changeset
|
208 const F77_INT&, const F77_INT&, |
59cadee1c74b
new macros for F77 data types
John W. Eaton <jwe@octave.org>
parents:
22085
diff
changeset
|
209 const F77_DBLE_CMPLX*, const F77_INT&, F77_DBLE_CMPLX*, |
59cadee1c74b
new macros for F77 data types
John W. Eaton <jwe@octave.org>
parents:
22085
diff
changeset
|
210 const F77_INT&, F77_INT& |
11518 | 211 F77_CHAR_ARG_LEN_DECL); |
212 | |
213 F77_RET_T | |
214 F77_FUNC (ztrtri, ZTRTRI) (F77_CONST_CHAR_ARG_DECL, | |
11586
12df7854fa7c
strip trailing whitespace from source files
John W. Eaton <jwe@octave.org>
parents:
11574
diff
changeset
|
215 F77_CONST_CHAR_ARG_DECL, |
22133
59cadee1c74b
new macros for F77 data types
John W. Eaton <jwe@octave.org>
parents:
22085
diff
changeset
|
216 const F77_INT&, const F77_DBLE_CMPLX*, |
59cadee1c74b
new macros for F77 data types
John W. Eaton <jwe@octave.org>
parents:
22085
diff
changeset
|
217 const F77_INT&, F77_INT& |
10314
07ebe522dac2
untabify liboctave C++ sources
John W. Eaton <jwe@octave.org>
parents:
10213
diff
changeset
|
218 F77_CHAR_ARG_LEN_DECL |
07ebe522dac2
untabify liboctave C++ sources
John W. Eaton <jwe@octave.org>
parents:
10213
diff
changeset
|
219 F77_CHAR_ARG_LEN_DECL); |
6207 | 220 |
221 F77_RET_T | |
11518 | 222 F77_FUNC (ztrcon, ZTRCON) (F77_CONST_CHAR_ARG_DECL, |
11586
12df7854fa7c
strip trailing whitespace from source files
John W. Eaton <jwe@octave.org>
parents:
11574
diff
changeset
|
223 F77_CONST_CHAR_ARG_DECL, |
11518 | 224 F77_CONST_CHAR_ARG_DECL, |
22133
59cadee1c74b
new macros for F77 data types
John W. Eaton <jwe@octave.org>
parents:
22085
diff
changeset
|
225 const F77_INT&, const F77_DBLE_CMPLX*, |
59cadee1c74b
new macros for F77 data types
John W. Eaton <jwe@octave.org>
parents:
22085
diff
changeset
|
226 const F77_INT&, F77_DBLE&, |
59cadee1c74b
new macros for F77 data types
John W. Eaton <jwe@octave.org>
parents:
22085
diff
changeset
|
227 F77_DBLE_CMPLX*, F77_DBLE*, F77_INT& |
10314
07ebe522dac2
untabify liboctave C++ sources
John W. Eaton <jwe@octave.org>
parents:
10213
diff
changeset
|
228 F77_CHAR_ARG_LEN_DECL |
07ebe522dac2
untabify liboctave C++ sources
John W. Eaton <jwe@octave.org>
parents:
10213
diff
changeset
|
229 F77_CHAR_ARG_LEN_DECL |
07ebe522dac2
untabify liboctave C++ sources
John W. Eaton <jwe@octave.org>
parents:
10213
diff
changeset
|
230 F77_CHAR_ARG_LEN_DECL); |
5785 | 231 |
232 F77_RET_T | |
11518 | 233 F77_FUNC (ztrtrs, ZTRTRS) (F77_CONST_CHAR_ARG_DECL, |
234 F77_CONST_CHAR_ARG_DECL, | |
235 F77_CONST_CHAR_ARG_DECL, | |
22133
59cadee1c74b
new macros for F77 data types
John W. Eaton <jwe@octave.org>
parents:
22085
diff
changeset
|
236 const F77_INT&, const F77_INT&, |
59cadee1c74b
new macros for F77 data types
John W. Eaton <jwe@octave.org>
parents:
22085
diff
changeset
|
237 const F77_DBLE_CMPLX*, const F77_INT&, F77_DBLE_CMPLX*, |
59cadee1c74b
new macros for F77 data types
John W. Eaton <jwe@octave.org>
parents:
22085
diff
changeset
|
238 const F77_INT&, F77_INT& |
10314
07ebe522dac2
untabify liboctave C++ sources
John W. Eaton <jwe@octave.org>
parents:
10213
diff
changeset
|
239 F77_CHAR_ARG_LEN_DECL |
07ebe522dac2
untabify liboctave C++ sources
John W. Eaton <jwe@octave.org>
parents:
10213
diff
changeset
|
240 F77_CHAR_ARG_LEN_DECL |
07ebe522dac2
untabify liboctave C++ sources
John W. Eaton <jwe@octave.org>
parents:
10213
diff
changeset
|
241 F77_CHAR_ARG_LEN_DECL); |
5785 | 242 |
4552 | 243 F77_RET_T |
22135
407c66ae1e20
reduce warnings from GCC's link-time optimization feature (bug #48531)
John W. Eaton <jwe@octave.org>
parents:
22133
diff
changeset
|
244 F77_FUNC (zlartg, ZLARTG) (const F77_DBLE_CMPLX*, const F77_DBLE_CMPLX*, F77_DBLE&, |
407c66ae1e20
reduce warnings from GCC's link-time optimization feature (bug #48531)
John W. Eaton <jwe@octave.org>
parents:
22133
diff
changeset
|
245 F77_DBLE_CMPLX*, F77_DBLE_CMPLX*); |
4552 | 246 |
247 F77_RET_T | |
248 F77_FUNC (ztrsyl, ZTRSYL) (F77_CONST_CHAR_ARG_DECL, | |
10314
07ebe522dac2
untabify liboctave C++ sources
John W. Eaton <jwe@octave.org>
parents:
10213
diff
changeset
|
249 F77_CONST_CHAR_ARG_DECL, |
22133
59cadee1c74b
new macros for F77 data types
John W. Eaton <jwe@octave.org>
parents:
22085
diff
changeset
|
250 const F77_INT&, const F77_INT&, |
59cadee1c74b
new macros for F77 data types
John W. Eaton <jwe@octave.org>
parents:
22085
diff
changeset
|
251 const F77_INT&, const F77_DBLE_CMPLX*, |
59cadee1c74b
new macros for F77 data types
John W. Eaton <jwe@octave.org>
parents:
22085
diff
changeset
|
252 const F77_INT&, const F77_DBLE_CMPLX*, |
59cadee1c74b
new macros for F77 data types
John W. Eaton <jwe@octave.org>
parents:
22085
diff
changeset
|
253 const F77_INT&, const F77_DBLE_CMPLX*, |
59cadee1c74b
new macros for F77 data types
John W. Eaton <jwe@octave.org>
parents:
22085
diff
changeset
|
254 const F77_INT&, F77_DBLE&, F77_INT& |
10314
07ebe522dac2
untabify liboctave C++ sources
John W. Eaton <jwe@octave.org>
parents:
10213
diff
changeset
|
255 F77_CHAR_ARG_LEN_DECL |
07ebe522dac2
untabify liboctave C++ sources
John W. Eaton <jwe@octave.org>
parents:
10213
diff
changeset
|
256 F77_CHAR_ARG_LEN_DECL); |
4552 | 257 |
258 F77_RET_T | |
259 F77_FUNC (xzlange, XZLANGE) (F77_CONST_CHAR_ARG_DECL, | |
22133
59cadee1c74b
new macros for F77 data types
John W. Eaton <jwe@octave.org>
parents:
22085
diff
changeset
|
260 const F77_INT&, const F77_INT&, |
59cadee1c74b
new macros for F77 data types
John W. Eaton <jwe@octave.org>
parents:
22085
diff
changeset
|
261 const F77_DBLE_CMPLX*, const F77_INT&, |
59cadee1c74b
new macros for F77 data types
John W. Eaton <jwe@octave.org>
parents:
22085
diff
changeset
|
262 F77_DBLE*, F77_DBLE& |
10314
07ebe522dac2
untabify liboctave C++ sources
John W. Eaton <jwe@octave.org>
parents:
10213
diff
changeset
|
263 F77_CHAR_ARG_LEN_DECL); |
458 | 264 } |
265 | |
22085
bf5fbf347aaf
Avoid segfault with complex matrices using LAPACK (bug #46330).
Kai T. Ohlhus <k.ohlhus@gmail.com>
parents:
22044
diff
changeset
|
266 static const Complex Complex_NaN_result (octave::numeric_limits<double>::NaN (), |
bf5fbf347aaf
Avoid segfault with complex matrices using LAPACK (bug #46330).
Kai T. Ohlhus <k.ohlhus@gmail.com>
parents:
22044
diff
changeset
|
267 octave::numeric_limits<double>::NaN ()); |
2354 | 268 |
1360 | 269 // Complex Matrix class |
458 | 270 |
271 ComplexMatrix::ComplexMatrix (const Matrix& a) | |
19320
d0c73e23a505
Change inheritance tree so that <T>Matrix inherit from <T>NDArray.
Carnë Draug <carandraug@octave.org>
parents:
19269
diff
changeset
|
272 : ComplexNDArray (a) |
458 | 273 { |
274 } | |
275 | |
2349 | 276 ComplexMatrix::ComplexMatrix (const RowVector& rv) |
19320
d0c73e23a505
Change inheritance tree so that <T>Matrix inherit from <T>NDArray.
Carnë Draug <carandraug@octave.org>
parents:
19269
diff
changeset
|
277 : ComplexNDArray (rv) |
2349 | 278 { |
279 } | |
280 | |
281 ComplexMatrix::ComplexMatrix (const ColumnVector& cv) | |
19320
d0c73e23a505
Change inheritance tree so that <T>Matrix inherit from <T>NDArray.
Carnë Draug <carandraug@octave.org>
parents:
19269
diff
changeset
|
282 : ComplexNDArray (cv) |
2349 | 283 { |
284 } | |
285 | |
458 | 286 ComplexMatrix::ComplexMatrix (const DiagMatrix& a) |
19320
d0c73e23a505
Change inheritance tree so that <T>Matrix inherit from <T>NDArray.
Carnë Draug <carandraug@octave.org>
parents:
19269
diff
changeset
|
287 : ComplexNDArray (a.dims (), 0.0) |
458 | 288 { |
5275 | 289 for (octave_idx_type i = 0; i < a.length (); i++) |
458 | 290 elem (i, i) = a.elem (i, i); |
291 } | |
292 | |
19391
385499581a5e
allow disabling of permutation and diagonal matrices
John W. Eaton <jwe@octave.org>
parents:
19340
diff
changeset
|
293 ComplexMatrix::ComplexMatrix (const MDiagArray2<double>& a) |
385499581a5e
allow disabling of permutation and diagonal matrices
John W. Eaton <jwe@octave.org>
parents:
19340
diff
changeset
|
294 : ComplexNDArray (a.dims (), 0.0) |
385499581a5e
allow disabling of permutation and diagonal matrices
John W. Eaton <jwe@octave.org>
parents:
19340
diff
changeset
|
295 { |
385499581a5e
allow disabling of permutation and diagonal matrices
John W. Eaton <jwe@octave.org>
parents:
19340
diff
changeset
|
296 for (octave_idx_type i = 0; i < a.length (); i++) |
385499581a5e
allow disabling of permutation and diagonal matrices
John W. Eaton <jwe@octave.org>
parents:
19340
diff
changeset
|
297 elem (i, i) = a.elem (i, i); |
385499581a5e
allow disabling of permutation and diagonal matrices
John W. Eaton <jwe@octave.org>
parents:
19340
diff
changeset
|
298 } |
385499581a5e
allow disabling of permutation and diagonal matrices
John W. Eaton <jwe@octave.org>
parents:
19340
diff
changeset
|
299 |
385499581a5e
allow disabling of permutation and diagonal matrices
John W. Eaton <jwe@octave.org>
parents:
19340
diff
changeset
|
300 ComplexMatrix::ComplexMatrix (const DiagArray2<double>& a) |
385499581a5e
allow disabling of permutation and diagonal matrices
John W. Eaton <jwe@octave.org>
parents:
19340
diff
changeset
|
301 : ComplexNDArray (a.dims (), 0.0) |
385499581a5e
allow disabling of permutation and diagonal matrices
John W. Eaton <jwe@octave.org>
parents:
19340
diff
changeset
|
302 { |
385499581a5e
allow disabling of permutation and diagonal matrices
John W. Eaton <jwe@octave.org>
parents:
19340
diff
changeset
|
303 for (octave_idx_type i = 0; i < a.length (); i++) |
385499581a5e
allow disabling of permutation and diagonal matrices
John W. Eaton <jwe@octave.org>
parents:
19340
diff
changeset
|
304 elem (i, i) = a.elem (i, i); |
385499581a5e
allow disabling of permutation and diagonal matrices
John W. Eaton <jwe@octave.org>
parents:
19340
diff
changeset
|
305 } |
385499581a5e
allow disabling of permutation and diagonal matrices
John W. Eaton <jwe@octave.org>
parents:
19340
diff
changeset
|
306 |
2349 | 307 ComplexMatrix::ComplexMatrix (const ComplexRowVector& rv) |
19320
d0c73e23a505
Change inheritance tree so that <T>Matrix inherit from <T>NDArray.
Carnë Draug <carandraug@octave.org>
parents:
19269
diff
changeset
|
308 : ComplexNDArray (rv) |
2349 | 309 { |
310 } | |
311 | |
312 ComplexMatrix::ComplexMatrix (const ComplexColumnVector& cv) | |
19320
d0c73e23a505
Change inheritance tree so that <T>Matrix inherit from <T>NDArray.
Carnë Draug <carandraug@octave.org>
parents:
19269
diff
changeset
|
313 : ComplexNDArray (cv) |
2349 | 314 { |
315 } | |
316 | |
458 | 317 ComplexMatrix::ComplexMatrix (const ComplexDiagMatrix& a) |
19320
d0c73e23a505
Change inheritance tree so that <T>Matrix inherit from <T>NDArray.
Carnë Draug <carandraug@octave.org>
parents:
19269
diff
changeset
|
318 : ComplexNDArray (a.dims (), 0.0) |
458 | 319 { |
5275 | 320 for (octave_idx_type i = 0; i < a.length (); i++) |
458 | 321 elem (i, i) = a.elem (i, i); |
322 } | |
323 | |
19391
385499581a5e
allow disabling of permutation and diagonal matrices
John W. Eaton <jwe@octave.org>
parents:
19340
diff
changeset
|
324 ComplexMatrix::ComplexMatrix (const MDiagArray2<Complex>& a) |
385499581a5e
allow disabling of permutation and diagonal matrices
John W. Eaton <jwe@octave.org>
parents:
19340
diff
changeset
|
325 : ComplexNDArray (a.dims (), 0.0) |
385499581a5e
allow disabling of permutation and diagonal matrices
John W. Eaton <jwe@octave.org>
parents:
19340
diff
changeset
|
326 { |
385499581a5e
allow disabling of permutation and diagonal matrices
John W. Eaton <jwe@octave.org>
parents:
19340
diff
changeset
|
327 for (octave_idx_type i = 0; i < a.length (); i++) |
385499581a5e
allow disabling of permutation and diagonal matrices
John W. Eaton <jwe@octave.org>
parents:
19340
diff
changeset
|
328 elem (i, i) = a.elem (i, i); |
385499581a5e
allow disabling of permutation and diagonal matrices
John W. Eaton <jwe@octave.org>
parents:
19340
diff
changeset
|
329 } |
385499581a5e
allow disabling of permutation and diagonal matrices
John W. Eaton <jwe@octave.org>
parents:
19340
diff
changeset
|
330 |
385499581a5e
allow disabling of permutation and diagonal matrices
John W. Eaton <jwe@octave.org>
parents:
19340
diff
changeset
|
331 ComplexMatrix::ComplexMatrix (const DiagArray2<Complex>& a) |
385499581a5e
allow disabling of permutation and diagonal matrices
John W. Eaton <jwe@octave.org>
parents:
19340
diff
changeset
|
332 : ComplexNDArray (a.dims (), 0.0) |
385499581a5e
allow disabling of permutation and diagonal matrices
John W. Eaton <jwe@octave.org>
parents:
19340
diff
changeset
|
333 { |
385499581a5e
allow disabling of permutation and diagonal matrices
John W. Eaton <jwe@octave.org>
parents:
19340
diff
changeset
|
334 for (octave_idx_type i = 0; i < a.length (); i++) |
385499581a5e
allow disabling of permutation and diagonal matrices
John W. Eaton <jwe@octave.org>
parents:
19340
diff
changeset
|
335 elem (i, i) = a.elem (i, i); |
385499581a5e
allow disabling of permutation and diagonal matrices
John W. Eaton <jwe@octave.org>
parents:
19340
diff
changeset
|
336 } |
385499581a5e
allow disabling of permutation and diagonal matrices
John W. Eaton <jwe@octave.org>
parents:
19340
diff
changeset
|
337 |
17769
49a5a4be04a1
maint: Use GNU style coding conventions for code in liboctave/
Rik <rik@octave.org>
parents:
17744
diff
changeset
|
338 // FIXME: could we use a templated mixed-type copy function here? |
1574 | 339 |
2828 | 340 ComplexMatrix::ComplexMatrix (const boolMatrix& a) |
19320
d0c73e23a505
Change inheritance tree so that <T>Matrix inherit from <T>NDArray.
Carnë Draug <carandraug@octave.org>
parents:
19269
diff
changeset
|
341 : ComplexNDArray (a) |
2828 | 342 { |
343 } | |
344 | |
1574 | 345 ComplexMatrix::ComplexMatrix (const charMatrix& a) |
19320
d0c73e23a505
Change inheritance tree so that <T>Matrix inherit from <T>NDArray.
Carnë Draug <carandraug@octave.org>
parents:
19269
diff
changeset
|
346 : ComplexNDArray (a.dims (), 0.0) |
1574 | 347 { |
5275 | 348 for (octave_idx_type i = 0; i < a.rows (); i++) |
349 for (octave_idx_type j = 0; j < a.cols (); j++) | |
8956
d91fa4b20bbb
ensure nonnegative char -> real conversion
Jaroslav Hajek <highegg@gmail.com>
parents:
8920
diff
changeset
|
350 elem (i, j) = static_cast<unsigned char> (a.elem (i, j)); |
1574 | 351 } |
352 | |
9663
7e5b4de5fbfe
improve mixed real x complex ops
Jaroslav Hajek <highegg@gmail.com>
parents:
9661
diff
changeset
|
353 ComplexMatrix::ComplexMatrix (const Matrix& re, const Matrix& im) |
19320
d0c73e23a505
Change inheritance tree so that <T>Matrix inherit from <T>NDArray.
Carnë Draug <carandraug@octave.org>
parents:
19269
diff
changeset
|
354 : ComplexNDArray (re.dims ()) |
9663
7e5b4de5fbfe
improve mixed real x complex ops
Jaroslav Hajek <highegg@gmail.com>
parents:
9661
diff
changeset
|
355 { |
7e5b4de5fbfe
improve mixed real x complex ops
Jaroslav Hajek <highegg@gmail.com>
parents:
9661
diff
changeset
|
356 if (im.rows () != rows () || im.cols () != cols ()) |
7e5b4de5fbfe
improve mixed real x complex ops
Jaroslav Hajek <highegg@gmail.com>
parents:
9661
diff
changeset
|
357 (*current_liboctave_error_handler) ("complex: internal error"); |
7e5b4de5fbfe
improve mixed real x complex ops
Jaroslav Hajek <highegg@gmail.com>
parents:
9661
diff
changeset
|
358 |
7e5b4de5fbfe
improve mixed real x complex ops
Jaroslav Hajek <highegg@gmail.com>
parents:
9661
diff
changeset
|
359 octave_idx_type nel = numel (); |
7e5b4de5fbfe
improve mixed real x complex ops
Jaroslav Hajek <highegg@gmail.com>
parents:
9661
diff
changeset
|
360 for (octave_idx_type i = 0; i < nel; i++) |
7e5b4de5fbfe
improve mixed real x complex ops
Jaroslav Hajek <highegg@gmail.com>
parents:
9661
diff
changeset
|
361 xelem (i) = Complex (re(i), im(i)); |
7e5b4de5fbfe
improve mixed real x complex ops
Jaroslav Hajek <highegg@gmail.com>
parents:
9661
diff
changeset
|
362 } |
7e5b4de5fbfe
improve mixed real x complex ops
Jaroslav Hajek <highegg@gmail.com>
parents:
9661
diff
changeset
|
363 |
2384 | 364 bool |
458 | 365 ComplexMatrix::operator == (const ComplexMatrix& a) const |
366 { | |
367 if (rows () != a.rows () || cols () != a.cols ()) | |
2384 | 368 return false; |
458 | 369 |
20232
a9574e3c6e9e
Deprecate Array::length() and Sparse::length() in favour of ::numel().
Carnë Draug <carandraug@octave.org>
parents:
20218
diff
changeset
|
370 return mx_inline_equal (numel (), data (), a.data ()); |
458 | 371 } |
372 | |
2384 | 373 bool |
458 | 374 ComplexMatrix::operator != (const ComplexMatrix& a) const |
375 { | |
376 return !(*this == a); | |
377 } | |
378 | |
2815 | 379 bool |
380 ComplexMatrix::is_hermitian (void) const | |
381 { | |
5275 | 382 octave_idx_type nr = rows (); |
383 octave_idx_type nc = cols (); | |
2815 | 384 |
385 if (is_square () && nr > 0) | |
386 { | |
5275 | 387 for (octave_idx_type i = 0; i < nr; i++) |
10314
07ebe522dac2
untabify liboctave C++ sources
John W. Eaton <jwe@octave.org>
parents:
10213
diff
changeset
|
388 for (octave_idx_type j = i; j < nc; j++) |
07ebe522dac2
untabify liboctave C++ sources
John W. Eaton <jwe@octave.org>
parents:
10213
diff
changeset
|
389 if (elem (i, j) != conj (elem (j, i))) |
07ebe522dac2
untabify liboctave C++ sources
John W. Eaton <jwe@octave.org>
parents:
10213
diff
changeset
|
390 return false; |
2815 | 391 |
392 return true; | |
393 } | |
394 | |
395 return false; | |
396 } | |
397 | |
458 | 398 // destructive insert/delete/reorder operations |
399 | |
400 ComplexMatrix& | |
5275 | 401 ComplexMatrix::insert (const Matrix& a, octave_idx_type r, octave_idx_type c) |
458 | 402 { |
5275 | 403 octave_idx_type a_nr = a.rows (); |
404 octave_idx_type a_nc = a.cols (); | |
1699 | 405 |
406 if (r < 0 || r + a_nr > rows () || c < 0 || c + a_nc > cols ()) | |
21136
7cac4e7458f2
maint: clean up code around calls to current_liboctave_error_handler.
Rik <rik@octave.org>
parents:
21129
diff
changeset
|
407 (*current_liboctave_error_handler) ("range error for insert"); |
458 | 408 |
4316 | 409 if (a_nr >0 && a_nc > 0) |
410 { | |
411 make_unique (); | |
412 | |
5275 | 413 for (octave_idx_type j = 0; j < a_nc; j++) |
10314
07ebe522dac2
untabify liboctave C++ sources
John W. Eaton <jwe@octave.org>
parents:
10213
diff
changeset
|
414 for (octave_idx_type i = 0; i < a_nr; i++) |
07ebe522dac2
untabify liboctave C++ sources
John W. Eaton <jwe@octave.org>
parents:
10213
diff
changeset
|
415 xelem (r+i, c+j) = a.elem (i, j); |
4316 | 416 } |
458 | 417 |
418 return *this; | |
419 } | |
420 | |
421 ComplexMatrix& | |
5275 | 422 ComplexMatrix::insert (const RowVector& a, octave_idx_type r, octave_idx_type c) |
458 | 423 { |
20232
a9574e3c6e9e
Deprecate Array::length() and Sparse::length() in favour of ::numel().
Carnë Draug <carandraug@octave.org>
parents:
20218
diff
changeset
|
424 octave_idx_type a_len = a.numel (); |
4316 | 425 |
1699 | 426 if (r < 0 || r >= rows () || c < 0 || c + a_len > cols ()) |
21136
7cac4e7458f2
maint: clean up code around calls to current_liboctave_error_handler.
Rik <rik@octave.org>
parents:
21129
diff
changeset
|
427 (*current_liboctave_error_handler) ("range error for insert"); |
458 | 428 |
4316 | 429 if (a_len > 0) |
430 { | |
431 make_unique (); | |
432 | |
5275 | 433 for (octave_idx_type i = 0; i < a_len; i++) |
10314
07ebe522dac2
untabify liboctave C++ sources
John W. Eaton <jwe@octave.org>
parents:
10213
diff
changeset
|
434 xelem (r, c+i) = a.elem (i); |
4316 | 435 } |
458 | 436 |
437 return *this; | |
438 } | |
439 | |
440 ComplexMatrix& | |
17769
49a5a4be04a1
maint: Use GNU style coding conventions for code in liboctave/
Rik <rik@octave.org>
parents:
17744
diff
changeset
|
441 ComplexMatrix::insert (const ColumnVector& a, |
49a5a4be04a1
maint: Use GNU style coding conventions for code in liboctave/
Rik <rik@octave.org>
parents:
17744
diff
changeset
|
442 octave_idx_type r, octave_idx_type c) |
458 | 443 { |
20232
a9574e3c6e9e
Deprecate Array::length() and Sparse::length() in favour of ::numel().
Carnë Draug <carandraug@octave.org>
parents:
20218
diff
changeset
|
444 octave_idx_type a_len = a.numel (); |
4316 | 445 |
1699 | 446 if (r < 0 || r + a_len > rows () || c < 0 || c >= cols ()) |
21136
7cac4e7458f2
maint: clean up code around calls to current_liboctave_error_handler.
Rik <rik@octave.org>
parents:
21129
diff
changeset
|
447 (*current_liboctave_error_handler) ("range error for insert"); |
458 | 448 |
4316 | 449 if (a_len > 0) |
450 { | |
451 make_unique (); | |
452 | |
5275 | 453 for (octave_idx_type i = 0; i < a_len; i++) |
10314
07ebe522dac2
untabify liboctave C++ sources
John W. Eaton <jwe@octave.org>
parents:
10213
diff
changeset
|
454 xelem (r+i, c) = a.elem (i); |
4316 | 455 } |
458 | 456 |
457 return *this; | |
458 } | |
459 | |
460 ComplexMatrix& | |
17769
49a5a4be04a1
maint: Use GNU style coding conventions for code in liboctave/
Rik <rik@octave.org>
parents:
17744
diff
changeset
|
461 ComplexMatrix::insert (const DiagMatrix& a, |
49a5a4be04a1
maint: Use GNU style coding conventions for code in liboctave/
Rik <rik@octave.org>
parents:
17744
diff
changeset
|
462 octave_idx_type r, octave_idx_type c) |
458 | 463 { |
5275 | 464 octave_idx_type a_nr = a.rows (); |
465 octave_idx_type a_nc = a.cols (); | |
1699 | 466 |
467 if (r < 0 || r + a_nr > rows () || c < 0 || c + a_nc > cols ()) | |
21136
7cac4e7458f2
maint: clean up code around calls to current_liboctave_error_handler.
Rik <rik@octave.org>
parents:
21129
diff
changeset
|
468 (*current_liboctave_error_handler) ("range error for insert"); |
458 | 469 |
1699 | 470 fill (0.0, r, c, r + a_nr - 1, c + a_nc - 1); |
471 | |
5275 | 472 octave_idx_type a_len = a.length (); |
4316 | 473 |
474 if (a_len > 0) | |
475 { | |
476 make_unique (); | |
477 | |
5275 | 478 for (octave_idx_type i = 0; i < a_len; i++) |
10314
07ebe522dac2
untabify liboctave C++ sources
John W. Eaton <jwe@octave.org>
parents:
10213
diff
changeset
|
479 xelem (r+i, c+i) = a.elem (i, i); |
4316 | 480 } |
458 | 481 |
482 return *this; | |
483 } | |
484 | |
485 ComplexMatrix& | |
17769
49a5a4be04a1
maint: Use GNU style coding conventions for code in liboctave/
Rik <rik@octave.org>
parents:
17744
diff
changeset
|
486 ComplexMatrix::insert (const ComplexMatrix& a, |
49a5a4be04a1
maint: Use GNU style coding conventions for code in liboctave/
Rik <rik@octave.org>
parents:
17744
diff
changeset
|
487 octave_idx_type r, octave_idx_type c) |
458 | 488 { |
19320
d0c73e23a505
Change inheritance tree so that <T>Matrix inherit from <T>NDArray.
Carnë Draug <carandraug@octave.org>
parents:
19269
diff
changeset
|
489 ComplexNDArray::insert (a, r, c); |
458 | 490 return *this; |
491 } | |
492 | |
493 ComplexMatrix& | |
17769
49a5a4be04a1
maint: Use GNU style coding conventions for code in liboctave/
Rik <rik@octave.org>
parents:
17744
diff
changeset
|
494 ComplexMatrix::insert (const ComplexRowVector& a, |
49a5a4be04a1
maint: Use GNU style coding conventions for code in liboctave/
Rik <rik@octave.org>
parents:
17744
diff
changeset
|
495 octave_idx_type r, octave_idx_type c) |
458 | 496 { |
20232
a9574e3c6e9e
Deprecate Array::length() and Sparse::length() in favour of ::numel().
Carnë Draug <carandraug@octave.org>
parents:
20218
diff
changeset
|
497 octave_idx_type a_len = a.numel (); |
1699 | 498 if (r < 0 || r >= rows () || c < 0 || c + a_len > cols ()) |
21136
7cac4e7458f2
maint: clean up code around calls to current_liboctave_error_handler.
Rik <rik@octave.org>
parents:
21129
diff
changeset
|
499 (*current_liboctave_error_handler) ("range error for insert"); |
458 | 500 |
5275 | 501 for (octave_idx_type i = 0; i < a_len; i++) |
458 | 502 elem (r, c+i) = a.elem (i); |
503 | |
504 return *this; | |
505 } | |
506 | |
507 ComplexMatrix& | |
17769
49a5a4be04a1
maint: Use GNU style coding conventions for code in liboctave/
Rik <rik@octave.org>
parents:
17744
diff
changeset
|
508 ComplexMatrix::insert (const ComplexColumnVector& a, |
49a5a4be04a1
maint: Use GNU style coding conventions for code in liboctave/
Rik <rik@octave.org>
parents:
17744
diff
changeset
|
509 octave_idx_type r, octave_idx_type c) |
458 | 510 { |
20232
a9574e3c6e9e
Deprecate Array::length() and Sparse::length() in favour of ::numel().
Carnë Draug <carandraug@octave.org>
parents:
20218
diff
changeset
|
511 octave_idx_type a_len = a.numel (); |
4316 | 512 |
1699 | 513 if (r < 0 || r + a_len > rows () || c < 0 || c >= cols ()) |
21136
7cac4e7458f2
maint: clean up code around calls to current_liboctave_error_handler.
Rik <rik@octave.org>
parents:
21129
diff
changeset
|
514 (*current_liboctave_error_handler) ("range error for insert"); |
458 | 515 |
4316 | 516 if (a_len > 0) |
517 { | |
518 make_unique (); | |
519 | |
5275 | 520 for (octave_idx_type i = 0; i < a_len; i++) |
10314
07ebe522dac2
untabify liboctave C++ sources
John W. Eaton <jwe@octave.org>
parents:
10213
diff
changeset
|
521 xelem (r+i, c) = a.elem (i); |
4316 | 522 } |
458 | 523 |
524 return *this; | |
525 } | |
526 | |
527 ComplexMatrix& | |
17769
49a5a4be04a1
maint: Use GNU style coding conventions for code in liboctave/
Rik <rik@octave.org>
parents:
17744
diff
changeset
|
528 ComplexMatrix::insert (const ComplexDiagMatrix& a, |
49a5a4be04a1
maint: Use GNU style coding conventions for code in liboctave/
Rik <rik@octave.org>
parents:
17744
diff
changeset
|
529 octave_idx_type r, octave_idx_type c) |
458 | 530 { |
5275 | 531 octave_idx_type a_nr = a.rows (); |
532 octave_idx_type a_nc = a.cols (); | |
1699 | 533 |
534 if (r < 0 || r + a_nr > rows () || c < 0 || c + a_nc > cols ()) | |
21136
7cac4e7458f2
maint: clean up code around calls to current_liboctave_error_handler.
Rik <rik@octave.org>
parents:
21129
diff
changeset
|
535 (*current_liboctave_error_handler) ("range error for insert"); |
458 | 536 |
1699 | 537 fill (0.0, r, c, r + a_nr - 1, c + a_nc - 1); |
538 | |
5275 | 539 octave_idx_type a_len = a.length (); |
4316 | 540 |
541 if (a_len > 0) | |
542 { | |
543 make_unique (); | |
544 | |
5275 | 545 for (octave_idx_type i = 0; i < a_len; i++) |
10314
07ebe522dac2
untabify liboctave C++ sources
John W. Eaton <jwe@octave.org>
parents:
10213
diff
changeset
|
546 xelem (r+i, c+i) = a.elem (i, i); |
4316 | 547 } |
458 | 548 |
549 return *this; | |
550 } | |
551 | |
552 ComplexMatrix& | |
553 ComplexMatrix::fill (double val) | |
554 { | |
5275 | 555 octave_idx_type nr = rows (); |
556 octave_idx_type nc = cols (); | |
4316 | 557 |
458 | 558 if (nr > 0 && nc > 0) |
4316 | 559 { |
560 make_unique (); | |
561 | |
5275 | 562 for (octave_idx_type j = 0; j < nc; j++) |
10314
07ebe522dac2
untabify liboctave C++ sources
John W. Eaton <jwe@octave.org>
parents:
10213
diff
changeset
|
563 for (octave_idx_type i = 0; i < nr; i++) |
07ebe522dac2
untabify liboctave C++ sources
John W. Eaton <jwe@octave.org>
parents:
10213
diff
changeset
|
564 xelem (i, j) = val; |
4316 | 565 } |
458 | 566 |
567 return *this; | |
568 } | |
569 | |
570 ComplexMatrix& | |
571 ComplexMatrix::fill (const Complex& val) | |
572 { | |
5275 | 573 octave_idx_type nr = rows (); |
574 octave_idx_type nc = cols (); | |
4316 | 575 |
458 | 576 if (nr > 0 && nc > 0) |
4316 | 577 { |
578 make_unique (); | |
579 | |
5275 | 580 for (octave_idx_type j = 0; j < nc; j++) |
10314
07ebe522dac2
untabify liboctave C++ sources
John W. Eaton <jwe@octave.org>
parents:
10213
diff
changeset
|
581 for (octave_idx_type i = 0; i < nr; i++) |
07ebe522dac2
untabify liboctave C++ sources
John W. Eaton <jwe@octave.org>
parents:
10213
diff
changeset
|
582 xelem (i, j) = val; |
4316 | 583 } |
458 | 584 |
585 return *this; | |
586 } | |
587 | |
588 ComplexMatrix& | |
17769
49a5a4be04a1
maint: Use GNU style coding conventions for code in liboctave/
Rik <rik@octave.org>
parents:
17744
diff
changeset
|
589 ComplexMatrix::fill (double val, octave_idx_type r1, octave_idx_type c1, |
49a5a4be04a1
maint: Use GNU style coding conventions for code in liboctave/
Rik <rik@octave.org>
parents:
17744
diff
changeset
|
590 octave_idx_type r2, octave_idx_type c2) |
458 | 591 { |
5275 | 592 octave_idx_type nr = rows (); |
593 octave_idx_type nc = cols (); | |
4316 | 594 |
458 | 595 if (r1 < 0 || r2 < 0 || c1 < 0 || c2 < 0 |
596 || r1 >= nr || r2 >= nr || c1 >= nc || c2 >= nc) | |
21136
7cac4e7458f2
maint: clean up code around calls to current_liboctave_error_handler.
Rik <rik@octave.org>
parents:
21129
diff
changeset
|
597 (*current_liboctave_error_handler) ("range error for fill"); |
458 | 598 |
17663
7975d75f933c
Use std::swap in liboctave instead of temporary variable.
Rik <rik@octave.org>
parents:
16300
diff
changeset
|
599 if (r1 > r2) { std::swap (r1, r2); } |
7975d75f933c
Use std::swap in liboctave instead of temporary variable.
Rik <rik@octave.org>
parents:
16300
diff
changeset
|
600 if (c1 > c2) { std::swap (c1, c2); } |
458 | 601 |
4316 | 602 if (r2 >= r1 && c2 >= c1) |
603 { | |
604 make_unique (); | |
605 | |
5275 | 606 for (octave_idx_type j = c1; j <= c2; j++) |
10314
07ebe522dac2
untabify liboctave C++ sources
John W. Eaton <jwe@octave.org>
parents:
10213
diff
changeset
|
607 for (octave_idx_type i = r1; i <= r2; i++) |
07ebe522dac2
untabify liboctave C++ sources
John W. Eaton <jwe@octave.org>
parents:
10213
diff
changeset
|
608 xelem (i, j) = val; |
4316 | 609 } |
458 | 610 |
611 return *this; | |
612 } | |
613 | |
614 ComplexMatrix& | |
17769
49a5a4be04a1
maint: Use GNU style coding conventions for code in liboctave/
Rik <rik@octave.org>
parents:
17744
diff
changeset
|
615 ComplexMatrix::fill (const Complex& val, octave_idx_type r1, octave_idx_type c1, |
49a5a4be04a1
maint: Use GNU style coding conventions for code in liboctave/
Rik <rik@octave.org>
parents:
17744
diff
changeset
|
616 octave_idx_type r2, octave_idx_type c2) |
458 | 617 { |
5275 | 618 octave_idx_type nr = rows (); |
619 octave_idx_type nc = cols (); | |
4316 | 620 |
458 | 621 if (r1 < 0 || r2 < 0 || c1 < 0 || c2 < 0 |
622 || r1 >= nr || r2 >= nr || c1 >= nc || c2 >= nc) | |
21136
7cac4e7458f2
maint: clean up code around calls to current_liboctave_error_handler.
Rik <rik@octave.org>
parents:
21129
diff
changeset
|
623 (*current_liboctave_error_handler) ("range error for fill"); |
458 | 624 |
17663
7975d75f933c
Use std::swap in liboctave instead of temporary variable.
Rik <rik@octave.org>
parents:
16300
diff
changeset
|
625 if (r1 > r2) { std::swap (r1, r2); } |
7975d75f933c
Use std::swap in liboctave instead of temporary variable.
Rik <rik@octave.org>
parents:
16300
diff
changeset
|
626 if (c1 > c2) { std::swap (c1, c2); } |
458 | 627 |
4316 | 628 if (r2 >= r1 && c2 >=c1) |
629 { | |
630 make_unique (); | |
631 | |
5275 | 632 for (octave_idx_type j = c1; j <= c2; j++) |
10314
07ebe522dac2
untabify liboctave C++ sources
John W. Eaton <jwe@octave.org>
parents:
10213
diff
changeset
|
633 for (octave_idx_type i = r1; i <= r2; i++) |
07ebe522dac2
untabify liboctave C++ sources
John W. Eaton <jwe@octave.org>
parents:
10213
diff
changeset
|
634 xelem (i, j) = val; |
4316 | 635 } |
458 | 636 |
637 return *this; | |
638 } | |
639 | |
640 ComplexMatrix | |
641 ComplexMatrix::append (const Matrix& a) const | |
642 { | |
5275 | 643 octave_idx_type nr = rows (); |
644 octave_idx_type nc = cols (); | |
458 | 645 if (nr != a.rows ()) |
21136
7cac4e7458f2
maint: clean up code around calls to current_liboctave_error_handler.
Rik <rik@octave.org>
parents:
21129
diff
changeset
|
646 (*current_liboctave_error_handler) ("row dimension mismatch for append"); |
458 | 647 |
5275 | 648 octave_idx_type nc_insert = nc; |
458 | 649 ComplexMatrix retval (nr, nc + a.cols ()); |
650 retval.insert (*this, 0, 0); | |
651 retval.insert (a, 0, nc_insert); | |
652 return retval; | |
653 } | |
654 | |
655 ComplexMatrix | |
656 ComplexMatrix::append (const RowVector& a) const | |
657 { | |
5275 | 658 octave_idx_type nr = rows (); |
659 octave_idx_type nc = cols (); | |
458 | 660 if (nr != 1) |
21136
7cac4e7458f2
maint: clean up code around calls to current_liboctave_error_handler.
Rik <rik@octave.org>
parents:
21129
diff
changeset
|
661 (*current_liboctave_error_handler) ("row dimension mismatch for append"); |
458 | 662 |
5275 | 663 octave_idx_type nc_insert = nc; |
20232
a9574e3c6e9e
Deprecate Array::length() and Sparse::length() in favour of ::numel().
Carnë Draug <carandraug@octave.org>
parents:
20218
diff
changeset
|
664 ComplexMatrix retval (nr, nc + a.numel ()); |
458 | 665 retval.insert (*this, 0, 0); |
666 retval.insert (a, 0, nc_insert); | |
667 return retval; | |
668 } | |
669 | |
670 ComplexMatrix | |
671 ComplexMatrix::append (const ColumnVector& a) const | |
672 { | |
5275 | 673 octave_idx_type nr = rows (); |
674 octave_idx_type nc = cols (); | |
20232
a9574e3c6e9e
Deprecate Array::length() and Sparse::length() in favour of ::numel().
Carnë Draug <carandraug@octave.org>
parents:
20218
diff
changeset
|
675 if (nr != a.numel ()) |
21136
7cac4e7458f2
maint: clean up code around calls to current_liboctave_error_handler.
Rik <rik@octave.org>
parents:
21129
diff
changeset
|
676 (*current_liboctave_error_handler) ("row dimension mismatch for append"); |
458 | 677 |
5275 | 678 octave_idx_type nc_insert = nc; |
458 | 679 ComplexMatrix retval (nr, nc + 1); |
680 retval.insert (*this, 0, 0); | |
681 retval.insert (a, 0, nc_insert); | |
682 return retval; | |
683 } | |
684 | |
685 ComplexMatrix | |
686 ComplexMatrix::append (const DiagMatrix& a) const | |
687 { | |
5275 | 688 octave_idx_type nr = rows (); |
689 octave_idx_type nc = cols (); | |
458 | 690 if (nr != a.rows ()) |
21136
7cac4e7458f2
maint: clean up code around calls to current_liboctave_error_handler.
Rik <rik@octave.org>
parents:
21129
diff
changeset
|
691 (*current_liboctave_error_handler) ("row dimension mismatch for append"); |
458 | 692 |
5275 | 693 octave_idx_type nc_insert = nc; |
458 | 694 ComplexMatrix retval (nr, nc + a.cols ()); |
695 retval.insert (*this, 0, 0); | |
696 retval.insert (a, 0, nc_insert); | |
697 return retval; | |
698 } | |
699 | |
700 ComplexMatrix | |
701 ComplexMatrix::append (const ComplexMatrix& a) const | |
702 { | |
5275 | 703 octave_idx_type nr = rows (); |
704 octave_idx_type nc = cols (); | |
458 | 705 if (nr != a.rows ()) |
21136
7cac4e7458f2
maint: clean up code around calls to current_liboctave_error_handler.
Rik <rik@octave.org>
parents:
21129
diff
changeset
|
706 (*current_liboctave_error_handler) ("row dimension mismatch for append"); |
458 | 707 |
5275 | 708 octave_idx_type nc_insert = nc; |
458 | 709 ComplexMatrix retval (nr, nc + a.cols ()); |
710 retval.insert (*this, 0, 0); | |
711 retval.insert (a, 0, nc_insert); | |
712 return retval; | |
713 } | |
714 | |
715 ComplexMatrix | |
716 ComplexMatrix::append (const ComplexRowVector& a) const | |
717 { | |
5275 | 718 octave_idx_type nr = rows (); |
719 octave_idx_type nc = cols (); | |
458 | 720 if (nr != 1) |
21136
7cac4e7458f2
maint: clean up code around calls to current_liboctave_error_handler.
Rik <rik@octave.org>
parents:
21129
diff
changeset
|
721 (*current_liboctave_error_handler) ("row dimension mismatch for append"); |
458 | 722 |
5275 | 723 octave_idx_type nc_insert = nc; |
20232
a9574e3c6e9e
Deprecate Array::length() and Sparse::length() in favour of ::numel().
Carnë Draug <carandraug@octave.org>
parents:
20218
diff
changeset
|
724 ComplexMatrix retval (nr, nc + a.numel ()); |
458 | 725 retval.insert (*this, 0, 0); |
726 retval.insert (a, 0, nc_insert); | |
727 return retval; | |
728 } | |
729 | |
730 ComplexMatrix | |
731 ComplexMatrix::append (const ComplexColumnVector& a) const | |
732 { | |
5275 | 733 octave_idx_type nr = rows (); |
734 octave_idx_type nc = cols (); | |
20232
a9574e3c6e9e
Deprecate Array::length() and Sparse::length() in favour of ::numel().
Carnë Draug <carandraug@octave.org>
parents:
20218
diff
changeset
|
735 if (nr != a.numel ()) |
21136
7cac4e7458f2
maint: clean up code around calls to current_liboctave_error_handler.
Rik <rik@octave.org>
parents:
21129
diff
changeset
|
736 (*current_liboctave_error_handler) ("row dimension mismatch for append"); |
458 | 737 |
5275 | 738 octave_idx_type nc_insert = nc; |
458 | 739 ComplexMatrix retval (nr, nc + 1); |
740 retval.insert (*this, 0, 0); | |
741 retval.insert (a, 0, nc_insert); | |
742 return retval; | |
743 } | |
744 | |
745 ComplexMatrix | |
746 ComplexMatrix::append (const ComplexDiagMatrix& a) const | |
747 { | |
5275 | 748 octave_idx_type nr = rows (); |
749 octave_idx_type nc = cols (); | |
458 | 750 if (nr != a.rows ()) |
21136
7cac4e7458f2
maint: clean up code around calls to current_liboctave_error_handler.
Rik <rik@octave.org>
parents:
21129
diff
changeset
|
751 (*current_liboctave_error_handler) ("row dimension mismatch for append"); |
458 | 752 |
5275 | 753 octave_idx_type nc_insert = nc; |
458 | 754 ComplexMatrix retval (nr, nc + a.cols ()); |
755 retval.insert (*this, 0, 0); | |
756 retval.insert (a, 0, nc_insert); | |
757 return retval; | |
758 } | |
759 | |
760 ComplexMatrix | |
761 ComplexMatrix::stack (const Matrix& a) const | |
762 { | |
5275 | 763 octave_idx_type nr = rows (); |
764 octave_idx_type nc = cols (); | |
458 | 765 if (nc != a.cols ()) |
21136
7cac4e7458f2
maint: clean up code around calls to current_liboctave_error_handler.
Rik <rik@octave.org>
parents:
21129
diff
changeset
|
766 (*current_liboctave_error_handler) ("column dimension mismatch for stack"); |
458 | 767 |
5275 | 768 octave_idx_type nr_insert = nr; |
458 | 769 ComplexMatrix retval (nr + a.rows (), nc); |
770 retval.insert (*this, 0, 0); | |
771 retval.insert (a, nr_insert, 0); | |
772 return retval; | |
773 } | |
774 | |
775 ComplexMatrix | |
776 ComplexMatrix::stack (const RowVector& a) const | |
777 { | |
5275 | 778 octave_idx_type nr = rows (); |
779 octave_idx_type nc = cols (); | |
20232
a9574e3c6e9e
Deprecate Array::length() and Sparse::length() in favour of ::numel().
Carnë Draug <carandraug@octave.org>
parents:
20218
diff
changeset
|
780 if (nc != a.numel ()) |
21136
7cac4e7458f2
maint: clean up code around calls to current_liboctave_error_handler.
Rik <rik@octave.org>
parents:
21129
diff
changeset
|
781 (*current_liboctave_error_handler) ("column dimension mismatch for stack"); |
458 | 782 |
5275 | 783 octave_idx_type nr_insert = nr; |
458 | 784 ComplexMatrix retval (nr + 1, nc); |
785 retval.insert (*this, 0, 0); | |
786 retval.insert (a, nr_insert, 0); | |
787 return retval; | |
788 } | |
789 | |
790 ComplexMatrix | |
791 ComplexMatrix::stack (const ColumnVector& a) const | |
792 { | |
5275 | 793 octave_idx_type nr = rows (); |
794 octave_idx_type nc = cols (); | |
458 | 795 if (nc != 1) |
21136
7cac4e7458f2
maint: clean up code around calls to current_liboctave_error_handler.
Rik <rik@octave.org>
parents:
21129
diff
changeset
|
796 (*current_liboctave_error_handler) ("column dimension mismatch for stack"); |
458 | 797 |
5275 | 798 octave_idx_type nr_insert = nr; |
20232
a9574e3c6e9e
Deprecate Array::length() and Sparse::length() in favour of ::numel().
Carnë Draug <carandraug@octave.org>
parents:
20218
diff
changeset
|
799 ComplexMatrix retval (nr + a.numel (), nc); |
458 | 800 retval.insert (*this, 0, 0); |
801 retval.insert (a, nr_insert, 0); | |
802 return retval; | |
803 } | |
804 | |
805 ComplexMatrix | |
806 ComplexMatrix::stack (const DiagMatrix& a) const | |
807 { | |
5275 | 808 octave_idx_type nr = rows (); |
809 octave_idx_type nc = cols (); | |
458 | 810 if (nc != a.cols ()) |
21136
7cac4e7458f2
maint: clean up code around calls to current_liboctave_error_handler.
Rik <rik@octave.org>
parents:
21129
diff
changeset
|
811 (*current_liboctave_error_handler) ("column dimension mismatch for stack"); |
458 | 812 |
5275 | 813 octave_idx_type nr_insert = nr; |
458 | 814 ComplexMatrix retval (nr + a.rows (), nc); |
815 retval.insert (*this, 0, 0); | |
816 retval.insert (a, nr_insert, 0); | |
817 return retval; | |
818 } | |
819 | |
820 ComplexMatrix | |
821 ComplexMatrix::stack (const ComplexMatrix& a) const | |
822 { | |
5275 | 823 octave_idx_type nr = rows (); |
824 octave_idx_type nc = cols (); | |
458 | 825 if (nc != a.cols ()) |
21136
7cac4e7458f2
maint: clean up code around calls to current_liboctave_error_handler.
Rik <rik@octave.org>
parents:
21129
diff
changeset
|
826 (*current_liboctave_error_handler) ("column dimension mismatch for stack"); |
458 | 827 |
5275 | 828 octave_idx_type nr_insert = nr; |
458 | 829 ComplexMatrix retval (nr + a.rows (), nc); |
830 retval.insert (*this, 0, 0); | |
831 retval.insert (a, nr_insert, 0); | |
832 return retval; | |
833 } | |
834 | |
835 ComplexMatrix | |
836 ComplexMatrix::stack (const ComplexRowVector& a) const | |
837 { | |
5275 | 838 octave_idx_type nr = rows (); |
839 octave_idx_type nc = cols (); | |
20232
a9574e3c6e9e
Deprecate Array::length() and Sparse::length() in favour of ::numel().
Carnë Draug <carandraug@octave.org>
parents:
20218
diff
changeset
|
840 if (nc != a.numel ()) |
21136
7cac4e7458f2
maint: clean up code around calls to current_liboctave_error_handler.
Rik <rik@octave.org>
parents:
21129
diff
changeset
|
841 (*current_liboctave_error_handler) ("column dimension mismatch for stack"); |
458 | 842 |
5275 | 843 octave_idx_type nr_insert = nr; |
458 | 844 ComplexMatrix retval (nr + 1, nc); |
845 retval.insert (*this, 0, 0); | |
846 retval.insert (a, nr_insert, 0); | |
847 return retval; | |
848 } | |
849 | |
850 ComplexMatrix | |
851 ComplexMatrix::stack (const ComplexColumnVector& a) const | |
852 { | |
5275 | 853 octave_idx_type nr = rows (); |
854 octave_idx_type nc = cols (); | |
458 | 855 if (nc != 1) |
21136
7cac4e7458f2
maint: clean up code around calls to current_liboctave_error_handler.
Rik <rik@octave.org>
parents:
21129
diff
changeset
|
856 (*current_liboctave_error_handler) ("column dimension mismatch for stack"); |
458 | 857 |
5275 | 858 octave_idx_type nr_insert = nr; |
20232
a9574e3c6e9e
Deprecate Array::length() and Sparse::length() in favour of ::numel().
Carnë Draug <carandraug@octave.org>
parents:
20218
diff
changeset
|
859 ComplexMatrix retval (nr + a.numel (), nc); |
458 | 860 retval.insert (*this, 0, 0); |
861 retval.insert (a, nr_insert, 0); | |
862 return retval; | |
863 } | |
864 | |
865 ComplexMatrix | |
866 ComplexMatrix::stack (const ComplexDiagMatrix& a) const | |
867 { | |
5275 | 868 octave_idx_type nr = rows (); |
869 octave_idx_type nc = cols (); | |
458 | 870 if (nc != a.cols ()) |
21136
7cac4e7458f2
maint: clean up code around calls to current_liboctave_error_handler.
Rik <rik@octave.org>
parents:
21129
diff
changeset
|
871 (*current_liboctave_error_handler) ("column dimension mismatch for stack"); |
458 | 872 |
5275 | 873 octave_idx_type nr_insert = nr; |
458 | 874 ComplexMatrix retval (nr + a.rows (), nc); |
875 retval.insert (*this, 0, 0); | |
876 retval.insert (a, nr_insert, 0); | |
877 return retval; | |
878 } | |
879 | |
880 ComplexMatrix | |
881 conj (const ComplexMatrix& a) | |
882 { | |
13107
353c71c76f22
maint: fix compilation problem with g++ -std=c++0x option
Júlio Hoffimann <julio.hoffimann@gmail.com>
parents:
11596
diff
changeset
|
883 return do_mx_unary_map<Complex, Complex, std::conj<double> > (a); |
458 | 884 } |
885 | |
886 // resize is the destructive equivalent for this one | |
887 | |
888 ComplexMatrix | |
17769
49a5a4be04a1
maint: Use GNU style coding conventions for code in liboctave/
Rik <rik@octave.org>
parents:
17744
diff
changeset
|
889 ComplexMatrix::extract (octave_idx_type r1, octave_idx_type c1, |
49a5a4be04a1
maint: Use GNU style coding conventions for code in liboctave/
Rik <rik@octave.org>
parents:
17744
diff
changeset
|
890 octave_idx_type r2, octave_idx_type c2) const |
458 | 891 { |
17663
7975d75f933c
Use std::swap in liboctave instead of temporary variable.
Rik <rik@octave.org>
parents:
16300
diff
changeset
|
892 if (r1 > r2) { std::swap (r1, r2); } |
7975d75f933c
Use std::swap in liboctave instead of temporary variable.
Rik <rik@octave.org>
parents:
16300
diff
changeset
|
893 if (c1 > c2) { std::swap (c1, c2); } |
5275 | 894 |
10805
8c858a1a2079
simplify Matrix::extract
Jaroslav Hajek <highegg@gmail.com>
parents:
10779
diff
changeset
|
895 return index (idx_vector (r1, r2+1), idx_vector (c1, c2+1)); |
4316 | 896 } |
897 | |
898 ComplexMatrix | |
17769
49a5a4be04a1
maint: Use GNU style coding conventions for code in liboctave/
Rik <rik@octave.org>
parents:
17744
diff
changeset
|
899 ComplexMatrix::extract_n (octave_idx_type r1, octave_idx_type c1, |
49a5a4be04a1
maint: Use GNU style coding conventions for code in liboctave/
Rik <rik@octave.org>
parents:
17744
diff
changeset
|
900 octave_idx_type nr, octave_idx_type nc) const |
4316 | 901 { |
10806
7c542263a92a
omissions from last two patches
Jaroslav Hajek <highegg@gmail.com>
parents:
10805
diff
changeset
|
902 return index (idx_vector (r1, r1 + nr), idx_vector (c1, c1 + nc)); |
458 | 903 } |
904 | |
905 // extract row or column i. | |
906 | |
907 ComplexRowVector | |
5275 | 908 ComplexMatrix::row (octave_idx_type i) const |
458 | 909 { |
10350
12884915a8e4
merge MArray classes & improve Array interface
Jaroslav Hajek <highegg@gmail.com>
parents:
10314
diff
changeset
|
910 return index (idx_vector (i), idx_vector::colon); |
458 | 911 } |
912 | |
913 ComplexColumnVector | |
5275 | 914 ComplexMatrix::column (octave_idx_type i) const |
458 | 915 { |
10350
12884915a8e4
merge MArray classes & improve Array interface
Jaroslav Hajek <highegg@gmail.com>
parents:
10314
diff
changeset
|
916 return index (idx_vector::colon, idx_vector (i)); |
458 | 917 } |
918 | |
919 ComplexMatrix | |
920 ComplexMatrix::inverse (void) const | |
921 { | |
5275 | 922 octave_idx_type info; |
7788 | 923 double rcon; |
6207 | 924 MatrixType mattype (*this); |
7788 | 925 return inverse (mattype, info, rcon, 0, 0); |
6207 | 926 } |
927 | |
928 ComplexMatrix | |
6479 | 929 ComplexMatrix::inverse (octave_idx_type& info) const |
930 { | |
7788 | 931 double rcon; |
6479 | 932 MatrixType mattype (*this); |
7788 | 933 return inverse (mattype, info, rcon, 0, 0); |
6479 | 934 } |
935 | |
936 ComplexMatrix | |
21719
ff054947d132
use bool instead of int for some logical flags
John W. Eaton <jwe@octave.org>
parents:
21317
diff
changeset
|
937 ComplexMatrix::inverse (octave_idx_type& info, double& rcon, bool force, |
ff054947d132
use bool instead of int for some logical flags
John W. Eaton <jwe@octave.org>
parents:
21317
diff
changeset
|
938 bool calc_cond) const |
6479 | 939 { |
940 MatrixType mattype (*this); | |
7788 | 941 return inverse (mattype, info, rcon, force, calc_cond); |
6479 | 942 } |
943 | |
944 ComplexMatrix | |
6207 | 945 ComplexMatrix::inverse (MatrixType &mattype) const |
946 { | |
947 octave_idx_type info; | |
7788 | 948 double rcon; |
949 return inverse (mattype, info, rcon, 0, 0); | |
6207 | 950 } |
951 | |
952 ComplexMatrix | |
953 ComplexMatrix::inverse (MatrixType &mattype, octave_idx_type& info) const | |
954 { | |
7788 | 955 double rcon; |
956 return inverse (mattype, info, rcon, 0, 0); | |
458 | 957 } |
958 | |
959 ComplexMatrix | |
6207 | 960 ComplexMatrix::tinverse (MatrixType &mattype, octave_idx_type& info, |
21719
ff054947d132
use bool instead of int for some logical flags
John W. Eaton <jwe@octave.org>
parents:
21317
diff
changeset
|
961 double& rcon, bool force, bool calc_cond) const |
458 | 962 { |
6207 | 963 ComplexMatrix retval; |
964 | |
965 octave_idx_type nr = rows (); | |
966 octave_idx_type nc = cols (); | |
967 | |
968 if (nr != nc || nr == 0 || nc == 0) | |
969 (*current_liboctave_error_handler) ("inverse requires square matrix"); | |
21136
7cac4e7458f2
maint: clean up code around calls to current_liboctave_error_handler.
Rik <rik@octave.org>
parents:
21129
diff
changeset
|
970 |
7cac4e7458f2
maint: clean up code around calls to current_liboctave_error_handler.
Rik <rik@octave.org>
parents:
21129
diff
changeset
|
971 int typ = mattype.type (); |
7cac4e7458f2
maint: clean up code around calls to current_liboctave_error_handler.
Rik <rik@octave.org>
parents:
21129
diff
changeset
|
972 char uplo = (typ == MatrixType::Lower ? 'L' : 'U'); |
7cac4e7458f2
maint: clean up code around calls to current_liboctave_error_handler.
Rik <rik@octave.org>
parents:
21129
diff
changeset
|
973 char udiag = 'N'; |
7cac4e7458f2
maint: clean up code around calls to current_liboctave_error_handler.
Rik <rik@octave.org>
parents:
21129
diff
changeset
|
974 retval = *this; |
7cac4e7458f2
maint: clean up code around calls to current_liboctave_error_handler.
Rik <rik@octave.org>
parents:
21129
diff
changeset
|
975 Complex *tmp_data = retval.fortran_vec (); |
7cac4e7458f2
maint: clean up code around calls to current_liboctave_error_handler.
Rik <rik@octave.org>
parents:
21129
diff
changeset
|
976 |
22135
407c66ae1e20
reduce warnings from GCC's link-time optimization feature (bug #48531)
John W. Eaton <jwe@octave.org>
parents:
22133
diff
changeset
|
977 F77_XFCN (ztrtri, ZTRTRI,(F77_CONST_CHAR_ARG2 (&uplo, 1), |
407c66ae1e20
reduce warnings from GCC's link-time optimization feature (bug #48531)
John W. Eaton <jwe@octave.org>
parents:
22133
diff
changeset
|
978 F77_CONST_CHAR_ARG2 (&udiag, 1), |
407c66ae1e20
reduce warnings from GCC's link-time optimization feature (bug #48531)
John W. Eaton <jwe@octave.org>
parents:
22133
diff
changeset
|
979 nr, F77_DBLE_CMPLX_ARG (tmp_data), nr, info |
407c66ae1e20
reduce warnings from GCC's link-time optimization feature (bug #48531)
John W. Eaton <jwe@octave.org>
parents:
22133
diff
changeset
|
980 F77_CHAR_ARG_LEN (1) |
407c66ae1e20
reduce warnings from GCC's link-time optimization feature (bug #48531)
John W. Eaton <jwe@octave.org>
parents:
22133
diff
changeset
|
981 F77_CHAR_ARG_LEN (1))); |
21136
7cac4e7458f2
maint: clean up code around calls to current_liboctave_error_handler.
Rik <rik@octave.org>
parents:
21129
diff
changeset
|
982 |
7cac4e7458f2
maint: clean up code around calls to current_liboctave_error_handler.
Rik <rik@octave.org>
parents:
21129
diff
changeset
|
983 // Throw-away extra info LAPACK gives so as to not change output. |
7cac4e7458f2
maint: clean up code around calls to current_liboctave_error_handler.
Rik <rik@octave.org>
parents:
21129
diff
changeset
|
984 rcon = 0.0; |
7cac4e7458f2
maint: clean up code around calls to current_liboctave_error_handler.
Rik <rik@octave.org>
parents:
21129
diff
changeset
|
985 if (info != 0) |
7cac4e7458f2
maint: clean up code around calls to current_liboctave_error_handler.
Rik <rik@octave.org>
parents:
21129
diff
changeset
|
986 info = -1; |
7cac4e7458f2
maint: clean up code around calls to current_liboctave_error_handler.
Rik <rik@octave.org>
parents:
21129
diff
changeset
|
987 else if (calc_cond) |
6207 | 988 { |
21136
7cac4e7458f2
maint: clean up code around calls to current_liboctave_error_handler.
Rik <rik@octave.org>
parents:
21129
diff
changeset
|
989 octave_idx_type ztrcon_info = 0; |
7cac4e7458f2
maint: clean up code around calls to current_liboctave_error_handler.
Rik <rik@octave.org>
parents:
21129
diff
changeset
|
990 char job = '1'; |
7cac4e7458f2
maint: clean up code around calls to current_liboctave_error_handler.
Rik <rik@octave.org>
parents:
21129
diff
changeset
|
991 |
7cac4e7458f2
maint: clean up code around calls to current_liboctave_error_handler.
Rik <rik@octave.org>
parents:
21129
diff
changeset
|
992 OCTAVE_LOCAL_BUFFER (Complex, cwork, 2*nr); |
7cac4e7458f2
maint: clean up code around calls to current_liboctave_error_handler.
Rik <rik@octave.org>
parents:
21129
diff
changeset
|
993 OCTAVE_LOCAL_BUFFER (double, rwork, nr); |
7cac4e7458f2
maint: clean up code around calls to current_liboctave_error_handler.
Rik <rik@octave.org>
parents:
21129
diff
changeset
|
994 |
7cac4e7458f2
maint: clean up code around calls to current_liboctave_error_handler.
Rik <rik@octave.org>
parents:
21129
diff
changeset
|
995 F77_XFCN (ztrcon, ZTRCON, (F77_CONST_CHAR_ARG2 (&job, 1), |
7cac4e7458f2
maint: clean up code around calls to current_liboctave_error_handler.
Rik <rik@octave.org>
parents:
21129
diff
changeset
|
996 F77_CONST_CHAR_ARG2 (&uplo, 1), |
10314
07ebe522dac2
untabify liboctave C++ sources
John W. Eaton <jwe@octave.org>
parents:
10213
diff
changeset
|
997 F77_CONST_CHAR_ARG2 (&udiag, 1), |
22135
407c66ae1e20
reduce warnings from GCC's link-time optimization feature (bug #48531)
John W. Eaton <jwe@octave.org>
parents:
22133
diff
changeset
|
998 nr, F77_DBLE_CMPLX_ARG (tmp_data), nr, rcon, |
407c66ae1e20
reduce warnings from GCC's link-time optimization feature (bug #48531)
John W. Eaton <jwe@octave.org>
parents:
22133
diff
changeset
|
999 F77_DBLE_CMPLX_ARG (cwork), rwork, ztrcon_info |
21136
7cac4e7458f2
maint: clean up code around calls to current_liboctave_error_handler.
Rik <rik@octave.org>
parents:
21129
diff
changeset
|
1000 F77_CHAR_ARG_LEN (1) |
10314
07ebe522dac2
untabify liboctave C++ sources
John W. Eaton <jwe@octave.org>
parents:
10213
diff
changeset
|
1001 F77_CHAR_ARG_LEN (1) |
07ebe522dac2
untabify liboctave C++ sources
John W. Eaton <jwe@octave.org>
parents:
10213
diff
changeset
|
1002 F77_CHAR_ARG_LEN (1))); |
6207 | 1003 |
21136
7cac4e7458f2
maint: clean up code around calls to current_liboctave_error_handler.
Rik <rik@octave.org>
parents:
21129
diff
changeset
|
1004 if (ztrcon_info != 0) |
10314
07ebe522dac2
untabify liboctave C++ sources
John W. Eaton <jwe@octave.org>
parents:
10213
diff
changeset
|
1005 info = -1; |
6207 | 1006 } |
1007 | |
21136
7cac4e7458f2
maint: clean up code around calls to current_liboctave_error_handler.
Rik <rik@octave.org>
parents:
21129
diff
changeset
|
1008 if (info == -1 && ! force) |
7cac4e7458f2
maint: clean up code around calls to current_liboctave_error_handler.
Rik <rik@octave.org>
parents:
21129
diff
changeset
|
1009 retval = *this; // Restore matrix contents. |
7cac4e7458f2
maint: clean up code around calls to current_liboctave_error_handler.
Rik <rik@octave.org>
parents:
21129
diff
changeset
|
1010 |
6207 | 1011 return retval; |
458 | 1012 } |
1013 | |
1014 ComplexMatrix | |
6207 | 1015 ComplexMatrix::finverse (MatrixType &mattype, octave_idx_type& info, |
21719
ff054947d132
use bool instead of int for some logical flags
John W. Eaton <jwe@octave.org>
parents:
21317
diff
changeset
|
1016 double& rcon, bool force, bool calc_cond) const |
458 | 1017 { |
1948 | 1018 ComplexMatrix retval; |
1019 | |
5275 | 1020 octave_idx_type nr = rows (); |
1021 octave_idx_type nc = cols (); | |
1948 | 1022 |
458 | 1023 if (nr != nc) |
1948 | 1024 (*current_liboctave_error_handler) ("inverse requires square matrix"); |
21136
7cac4e7458f2
maint: clean up code around calls to current_liboctave_error_handler.
Rik <rik@octave.org>
parents:
21129
diff
changeset
|
1025 |
7cac4e7458f2
maint: clean up code around calls to current_liboctave_error_handler.
Rik <rik@octave.org>
parents:
21129
diff
changeset
|
1026 Array<octave_idx_type> ipvt (dim_vector (nr, 1)); |
7cac4e7458f2
maint: clean up code around calls to current_liboctave_error_handler.
Rik <rik@octave.org>
parents:
21129
diff
changeset
|
1027 octave_idx_type *pipvt = ipvt.fortran_vec (); |
7cac4e7458f2
maint: clean up code around calls to current_liboctave_error_handler.
Rik <rik@octave.org>
parents:
21129
diff
changeset
|
1028 |
7cac4e7458f2
maint: clean up code around calls to current_liboctave_error_handler.
Rik <rik@octave.org>
parents:
21129
diff
changeset
|
1029 retval = *this; |
7cac4e7458f2
maint: clean up code around calls to current_liboctave_error_handler.
Rik <rik@octave.org>
parents:
21129
diff
changeset
|
1030 Complex *tmp_data = retval.fortran_vec (); |
7cac4e7458f2
maint: clean up code around calls to current_liboctave_error_handler.
Rik <rik@octave.org>
parents:
21129
diff
changeset
|
1031 |
7cac4e7458f2
maint: clean up code around calls to current_liboctave_error_handler.
Rik <rik@octave.org>
parents:
21129
diff
changeset
|
1032 Array<Complex> z (dim_vector (1, 1)); |
7cac4e7458f2
maint: clean up code around calls to current_liboctave_error_handler.
Rik <rik@octave.org>
parents:
21129
diff
changeset
|
1033 octave_idx_type lwork = -1; |
7cac4e7458f2
maint: clean up code around calls to current_liboctave_error_handler.
Rik <rik@octave.org>
parents:
21129
diff
changeset
|
1034 |
7cac4e7458f2
maint: clean up code around calls to current_liboctave_error_handler.
Rik <rik@octave.org>
parents:
21129
diff
changeset
|
1035 // Query the optimum work array size. |
7cac4e7458f2
maint: clean up code around calls to current_liboctave_error_handler.
Rik <rik@octave.org>
parents:
21129
diff
changeset
|
1036 |
22135
407c66ae1e20
reduce warnings from GCC's link-time optimization feature (bug #48531)
John W. Eaton <jwe@octave.org>
parents:
22133
diff
changeset
|
1037 F77_XFCN (zgetri, ZGETRI, (nc, F77_DBLE_CMPLX_ARG (tmp_data), nr, pipvt, |
407c66ae1e20
reduce warnings from GCC's link-time optimization feature (bug #48531)
John W. Eaton <jwe@octave.org>
parents:
22133
diff
changeset
|
1038 F77_DBLE_CMPLX_ARG (z.fortran_vec ()), lwork, info)); |
21136
7cac4e7458f2
maint: clean up code around calls to current_liboctave_error_handler.
Rik <rik@octave.org>
parents:
21129
diff
changeset
|
1039 |
7cac4e7458f2
maint: clean up code around calls to current_liboctave_error_handler.
Rik <rik@octave.org>
parents:
21129
diff
changeset
|
1040 lwork = static_cast<octave_idx_type> (std::real (z(0))); |
7cac4e7458f2
maint: clean up code around calls to current_liboctave_error_handler.
Rik <rik@octave.org>
parents:
21129
diff
changeset
|
1041 lwork = (lwork < 2 *nc ? 2*nc : lwork); |
7cac4e7458f2
maint: clean up code around calls to current_liboctave_error_handler.
Rik <rik@octave.org>
parents:
21129
diff
changeset
|
1042 z.resize (dim_vector (lwork, 1)); |
7cac4e7458f2
maint: clean up code around calls to current_liboctave_error_handler.
Rik <rik@octave.org>
parents:
21129
diff
changeset
|
1043 Complex *pz = z.fortran_vec (); |
7cac4e7458f2
maint: clean up code around calls to current_liboctave_error_handler.
Rik <rik@octave.org>
parents:
21129
diff
changeset
|
1044 |
7cac4e7458f2
maint: clean up code around calls to current_liboctave_error_handler.
Rik <rik@octave.org>
parents:
21129
diff
changeset
|
1045 info = 0; |
7cac4e7458f2
maint: clean up code around calls to current_liboctave_error_handler.
Rik <rik@octave.org>
parents:
21129
diff
changeset
|
1046 |
22085
bf5fbf347aaf
Avoid segfault with complex matrices using LAPACK (bug #46330).
Kai T. Ohlhus <k.ohlhus@gmail.com>
parents:
22044
diff
changeset
|
1047 // Calculate (always, see bug #45577) the norm of the matrix, for later use. |
bf5fbf347aaf
Avoid segfault with complex matrices using LAPACK (bug #46330).
Kai T. Ohlhus <k.ohlhus@gmail.com>
parents:
22044
diff
changeset
|
1048 double anorm = |
bf5fbf347aaf
Avoid segfault with complex matrices using LAPACK (bug #46330).
Kai T. Ohlhus <k.ohlhus@gmail.com>
parents:
22044
diff
changeset
|
1049 retval.abs ().sum ().row (static_cast<octave_idx_type>(0)).max (); |
21136
7cac4e7458f2
maint: clean up code around calls to current_liboctave_error_handler.
Rik <rik@octave.org>
parents:
21129
diff
changeset
|
1050 |
7cac4e7458f2
maint: clean up code around calls to current_liboctave_error_handler.
Rik <rik@octave.org>
parents:
21129
diff
changeset
|
1051 // Work around bug #45577, LAPACK crashes Octave if norm is NaN |
22044
571b42508e1e
Avoid segfault with matrices containing Inf & NaN (bug #46330).
Lachlan Andrew <lachlanbis@gmail.com>
parents:
22022
diff
changeset
|
1052 // and bug #46330, segfault with matrices containing Inf & NaN |
571b42508e1e
Avoid segfault with matrices containing Inf & NaN (bug #46330).
Lachlan Andrew <lachlanbis@gmail.com>
parents:
22022
diff
changeset
|
1053 if (octave::math::isnan (anorm) || octave::math::isinf (anorm)) |
21136
7cac4e7458f2
maint: clean up code around calls to current_liboctave_error_handler.
Rik <rik@octave.org>
parents:
21129
diff
changeset
|
1054 info = -1; |
7cac4e7458f2
maint: clean up code around calls to current_liboctave_error_handler.
Rik <rik@octave.org>
parents:
21129
diff
changeset
|
1055 else |
22135
407c66ae1e20
reduce warnings from GCC's link-time optimization feature (bug #48531)
John W. Eaton <jwe@octave.org>
parents:
22133
diff
changeset
|
1056 F77_XFCN (zgetrf, ZGETRF, (nc, nc, F77_DBLE_CMPLX_ARG (tmp_data), nr, pipvt, info)); |
21136
7cac4e7458f2
maint: clean up code around calls to current_liboctave_error_handler.
Rik <rik@octave.org>
parents:
21129
diff
changeset
|
1057 |
7cac4e7458f2
maint: clean up code around calls to current_liboctave_error_handler.
Rik <rik@octave.org>
parents:
21129
diff
changeset
|
1058 // Throw-away extra info LAPACK gives so as to not change output. |
7cac4e7458f2
maint: clean up code around calls to current_liboctave_error_handler.
Rik <rik@octave.org>
parents:
21129
diff
changeset
|
1059 rcon = 0.0; |
7cac4e7458f2
maint: clean up code around calls to current_liboctave_error_handler.
Rik <rik@octave.org>
parents:
21129
diff
changeset
|
1060 if (info != 0) |
7cac4e7458f2
maint: clean up code around calls to current_liboctave_error_handler.
Rik <rik@octave.org>
parents:
21129
diff
changeset
|
1061 info = -1; |
7cac4e7458f2
maint: clean up code around calls to current_liboctave_error_handler.
Rik <rik@octave.org>
parents:
21129
diff
changeset
|
1062 else if (calc_cond) |
7cac4e7458f2
maint: clean up code around calls to current_liboctave_error_handler.
Rik <rik@octave.org>
parents:
21129
diff
changeset
|
1063 { |
7cac4e7458f2
maint: clean up code around calls to current_liboctave_error_handler.
Rik <rik@octave.org>
parents:
21129
diff
changeset
|
1064 // Now calculate the condition number for non-singular matrix. |
7cac4e7458f2
maint: clean up code around calls to current_liboctave_error_handler.
Rik <rik@octave.org>
parents:
21129
diff
changeset
|
1065 octave_idx_type zgecon_info = 0; |
7cac4e7458f2
maint: clean up code around calls to current_liboctave_error_handler.
Rik <rik@octave.org>
parents:
21129
diff
changeset
|
1066 char job = '1'; |
7cac4e7458f2
maint: clean up code around calls to current_liboctave_error_handler.
Rik <rik@octave.org>
parents:
21129
diff
changeset
|
1067 Array<double> rz (dim_vector (2 * nc, 1)); |
7cac4e7458f2
maint: clean up code around calls to current_liboctave_error_handler.
Rik <rik@octave.org>
parents:
21129
diff
changeset
|
1068 double *prz = rz.fortran_vec (); |
7cac4e7458f2
maint: clean up code around calls to current_liboctave_error_handler.
Rik <rik@octave.org>
parents:
21129
diff
changeset
|
1069 F77_XFCN (zgecon, ZGECON, (F77_CONST_CHAR_ARG2 (&job, 1), |
22135
407c66ae1e20
reduce warnings from GCC's link-time optimization feature (bug #48531)
John W. Eaton <jwe@octave.org>
parents:
22133
diff
changeset
|
1070 nc, F77_DBLE_CMPLX_ARG (tmp_data), nr, anorm, |
407c66ae1e20
reduce warnings from GCC's link-time optimization feature (bug #48531)
John W. Eaton <jwe@octave.org>
parents:
22133
diff
changeset
|
1071 rcon, F77_DBLE_CMPLX_ARG (pz), prz, zgecon_info |
21136
7cac4e7458f2
maint: clean up code around calls to current_liboctave_error_handler.
Rik <rik@octave.org>
parents:
21129
diff
changeset
|
1072 F77_CHAR_ARG_LEN (1))); |
7cac4e7458f2
maint: clean up code around calls to current_liboctave_error_handler.
Rik <rik@octave.org>
parents:
21129
diff
changeset
|
1073 |
7cac4e7458f2
maint: clean up code around calls to current_liboctave_error_handler.
Rik <rik@octave.org>
parents:
21129
diff
changeset
|
1074 if (zgecon_info != 0) |
7cac4e7458f2
maint: clean up code around calls to current_liboctave_error_handler.
Rik <rik@octave.org>
parents:
21129
diff
changeset
|
1075 info = -1; |
7cac4e7458f2
maint: clean up code around calls to current_liboctave_error_handler.
Rik <rik@octave.org>
parents:
21129
diff
changeset
|
1076 } |
7cac4e7458f2
maint: clean up code around calls to current_liboctave_error_handler.
Rik <rik@octave.org>
parents:
21129
diff
changeset
|
1077 |
22044
571b42508e1e
Avoid segfault with matrices containing Inf & NaN (bug #46330).
Lachlan Andrew <lachlanbis@gmail.com>
parents:
22022
diff
changeset
|
1078 if ((info == -1 && ! force) || octave::math::isinf (anorm)) |
21136
7cac4e7458f2
maint: clean up code around calls to current_liboctave_error_handler.
Rik <rik@octave.org>
parents:
21129
diff
changeset
|
1079 retval = *this; // Restore contents. |
458 | 1080 else |
1081 { | |
21136
7cac4e7458f2
maint: clean up code around calls to current_liboctave_error_handler.
Rik <rik@octave.org>
parents:
21129
diff
changeset
|
1082 octave_idx_type zgetri_info = 0; |
4329 | 1083 |
22135
407c66ae1e20
reduce warnings from GCC's link-time optimization feature (bug #48531)
John W. Eaton <jwe@octave.org>
parents:
22133
diff
changeset
|
1084 F77_XFCN (zgetri, ZGETRI, (nc, F77_DBLE_CMPLX_ARG (tmp_data), nr, pipvt, |
407c66ae1e20
reduce warnings from GCC's link-time optimization feature (bug #48531)
John W. Eaton <jwe@octave.org>
parents:
22133
diff
changeset
|
1085 F77_DBLE_CMPLX_ARG (pz), lwork, zgetri_info)); |
21136
7cac4e7458f2
maint: clean up code around calls to current_liboctave_error_handler.
Rik <rik@octave.org>
parents:
21129
diff
changeset
|
1086 |
7cac4e7458f2
maint: clean up code around calls to current_liboctave_error_handler.
Rik <rik@octave.org>
parents:
21129
diff
changeset
|
1087 if (zgetri_info != 0) |
10314
07ebe522dac2
untabify liboctave C++ sources
John W. Eaton <jwe@octave.org>
parents:
10213
diff
changeset
|
1088 info = -1; |
458 | 1089 } |
11586
12df7854fa7c
strip trailing whitespace from source files
John W. Eaton <jwe@octave.org>
parents:
11574
diff
changeset
|
1090 |
21136
7cac4e7458f2
maint: clean up code around calls to current_liboctave_error_handler.
Rik <rik@octave.org>
parents:
21129
diff
changeset
|
1091 if (info != 0) |
7cac4e7458f2
maint: clean up code around calls to current_liboctave_error_handler.
Rik <rik@octave.org>
parents:
21129
diff
changeset
|
1092 mattype.mark_as_rectangular (); |
7cac4e7458f2
maint: clean up code around calls to current_liboctave_error_handler.
Rik <rik@octave.org>
parents:
21129
diff
changeset
|
1093 |
1948 | 1094 return retval; |
458 | 1095 } |
1096 | |
1097 ComplexMatrix | |
6207 | 1098 ComplexMatrix::inverse (MatrixType &mattype, octave_idx_type& info, |
21719
ff054947d132
use bool instead of int for some logical flags
John W. Eaton <jwe@octave.org>
parents:
21317
diff
changeset
|
1099 double& rcon, bool force, bool calc_cond) const |
6207 | 1100 { |
1101 int typ = mattype.type (false); | |
1102 ComplexMatrix ret; | |
1103 | |
1104 if (typ == MatrixType::Unknown) | |
1105 typ = mattype.type (*this); | |
1106 | |
1107 if (typ == MatrixType::Upper || typ == MatrixType::Lower) | |
7788 | 1108 ret = tinverse (mattype, info, rcon, force, calc_cond); |
6840 | 1109 else |
6207 | 1110 { |
1111 if (mattype.is_hermitian ()) | |
10314
07ebe522dac2
untabify liboctave C++ sources
John W. Eaton <jwe@octave.org>
parents:
10213
diff
changeset
|
1112 { |
21269
3c8a3d35661a
better use of templates for Cholesky factorization
John W. Eaton <jwe@octave.org>
parents:
21266
diff
changeset
|
1113 chol<ComplexMatrix> chol (*this, info, true, calc_cond); |
10314
07ebe522dac2
untabify liboctave C++ sources
John W. Eaton <jwe@octave.org>
parents:
10213
diff
changeset
|
1114 if (info == 0) |
07ebe522dac2
untabify liboctave C++ sources
John W. Eaton <jwe@octave.org>
parents:
10213
diff
changeset
|
1115 { |
07ebe522dac2
untabify liboctave C++ sources
John W. Eaton <jwe@octave.org>
parents:
10213
diff
changeset
|
1116 if (calc_cond) |
14846
460a3c6d8bf1
maint: Use Octave coding convention for cuddled parenthis in function calls with empty argument lists.
Rik <octave@nomad.inbox5.com>
parents:
14557
diff
changeset
|
1117 rcon = chol.rcond (); |
10314
07ebe522dac2
untabify liboctave C++ sources
John W. Eaton <jwe@octave.org>
parents:
10213
diff
changeset
|
1118 else |
07ebe522dac2
untabify liboctave C++ sources
John W. Eaton <jwe@octave.org>
parents:
10213
diff
changeset
|
1119 rcon = 1.0; |
07ebe522dac2
untabify liboctave C++ sources
John W. Eaton <jwe@octave.org>
parents:
10213
diff
changeset
|
1120 ret = chol.inverse (); |
07ebe522dac2
untabify liboctave C++ sources
John W. Eaton <jwe@octave.org>
parents:
10213
diff
changeset
|
1121 } |
07ebe522dac2
untabify liboctave C++ sources
John W. Eaton <jwe@octave.org>
parents:
10213
diff
changeset
|
1122 else |
07ebe522dac2
untabify liboctave C++ sources
John W. Eaton <jwe@octave.org>
parents:
10213
diff
changeset
|
1123 mattype.mark_as_unsymmetric (); |
07ebe522dac2
untabify liboctave C++ sources
John W. Eaton <jwe@octave.org>
parents:
10213
diff
changeset
|
1124 } |
6207 | 1125 |
20955
77f5591878bf
maint: Use '! expr' rather than '!expr' to conform to coding guidelines.
Rik <rik@octave.org>
parents:
20715
diff
changeset
|
1126 if (! mattype.is_hermitian ()) |
15018
3d8ace26c5b4
maint: Use Octave coding conventions for cuddled parentheses in liboctave/.
Rik <rik@octave.org>
parents:
14846
diff
changeset
|
1127 ret = finverse (mattype, info, rcon, force, calc_cond); |
7788 | 1128 |
1129 if ((mattype.is_hermitian () || calc_cond) && rcon == 0.) | |
22085
bf5fbf347aaf
Avoid segfault with complex matrices using LAPACK (bug #46330).
Kai T. Ohlhus <k.ohlhus@gmail.com>
parents:
22044
diff
changeset
|
1130 ret = ComplexMatrix (rows (), columns (), |
bf5fbf347aaf
Avoid segfault with complex matrices using LAPACK (bug #46330).
Kai T. Ohlhus <k.ohlhus@gmail.com>
parents:
22044
diff
changeset
|
1131 Complex (octave::numeric_limits<double>::Inf (), 0.)); |
6207 | 1132 } |
1133 | |
1134 return ret; | |
1135 } | |
1136 | |
1137 ComplexMatrix | |
4384 | 1138 ComplexMatrix::pseudo_inverse (double tol) const |
740 | 1139 { |
1549 | 1140 ComplexMatrix retval; |
1141 | |
22204
469c817eb256
svd: reduce code duplication with more use of template and macro.
Carnë Draug <carandraug@octave.org>
parents:
22197
diff
changeset
|
1142 svd<ComplexMatrix> result (*this, svd<ComplexMatrix>::Type::economy); |
740 | 1143 |
1144 DiagMatrix S = result.singular_values (); | |
1145 ComplexMatrix U = result.left_singular_matrix (); | |
1146 ComplexMatrix V = result.right_singular_matrix (); | |
1147 | |
15448
0a0912a9ab6e
Replace deprecated DiagArray2<T>::diag calls with DiagArray2<T>::extract_diag
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
15383
diff
changeset
|
1148 ColumnVector sigma = S.extract_diag (); |
740 | 1149 |
20232
a9574e3c6e9e
Deprecate Array::length() and Sparse::length() in favour of ::numel().
Carnë Draug <carandraug@octave.org>
parents:
20218
diff
changeset
|
1150 octave_idx_type r = sigma.numel () - 1; |
5275 | 1151 octave_idx_type nr = rows (); |
1152 octave_idx_type nc = cols (); | |
740 | 1153 |
1154 if (tol <= 0.0) | |
1155 { | |
1156 if (nr > nc) | |
15220
61822c866ba1
use std::numeric_limits<T>::epsilon in C++ code
John W. Eaton <jwe@octave.org>
parents:
15212
diff
changeset
|
1157 tol = nr * sigma.elem (0) * std::numeric_limits<double>::epsilon (); |
740 | 1158 else |
15220
61822c866ba1
use std::numeric_limits<T>::epsilon in C++ code
John W. Eaton <jwe@octave.org>
parents:
15212
diff
changeset
|
1159 tol = nc * sigma.elem (0) * std::numeric_limits<double>::epsilon (); |
740 | 1160 } |
1161 | |
1162 while (r >= 0 && sigma.elem (r) < tol) | |
1163 r--; | |
1164 | |
1165 if (r < 0) | |
1549 | 1166 retval = ComplexMatrix (nc, nr, 0.0); |
740 | 1167 else |
1168 { | |
1169 ComplexMatrix Ur = U.extract (0, 0, nr-1, r); | |
21751
b571fc85953f
maint: Use two spaces after period to indicate sentence break.
Rik <rik@octave.org>
parents:
21724
diff
changeset
|
1170 DiagMatrix D = DiagMatrix (sigma.extract (0, r)).inverse (); |
740 | 1171 ComplexMatrix Vr = V.extract (0, 0, nc-1, r); |
1549 | 1172 retval = Vr * D * Ur.hermitian (); |
740 | 1173 } |
1549 | 1174 |
1175 return retval; | |
740 | 1176 } |
1177 | |
9523
0ce82753dd72
more configure changes for libraries
John W. Eaton <jwe@octave.org>
parents:
9469
diff
changeset
|
1178 #if defined (HAVE_FFTW) |
3827 | 1179 |
1180 ComplexMatrix | |
1181 ComplexMatrix::fourier (void) const | |
1182 { | |
1183 size_t nr = rows (); | |
1184 size_t nc = cols (); | |
1185 | |
1186 ComplexMatrix retval (nr, nc); | |
1187 | |
1188 size_t npts, nsamples; | |
1189 | |
1190 if (nr == 1 || nc == 1) | |
1191 { | |
1192 npts = nr > nc ? nr : nc; | |
1193 nsamples = 1; | |
1194 } | |
1195 else | |
1196 { | |
1197 npts = nr; | |
1198 nsamples = nc; | |
1199 } | |
1200 | |
1201 const Complex *in (data ()); | |
1202 Complex *out (retval.fortran_vec ()); | |
1203 | |
11586
12df7854fa7c
strip trailing whitespace from source files
John W. Eaton <jwe@octave.org>
parents:
11574
diff
changeset
|
1204 octave_fftw::fft (in, out, npts, nsamples); |
3827 | 1205 |
1206 return retval; | |
1207 } | |
1208 | |
1209 ComplexMatrix | |
1210 ComplexMatrix::ifourier (void) const | |
1211 { | |
1212 size_t nr = rows (); | |
1213 size_t nc = cols (); | |
1214 | |
1215 ComplexMatrix retval (nr, nc); | |
1216 | |
1217 size_t npts, nsamples; | |
1218 | |
1219 if (nr == 1 || nc == 1) | |
1220 { | |
1221 npts = nr > nc ? nr : nc; | |
1222 nsamples = 1; | |
1223 } | |
1224 else | |
1225 { | |
1226 npts = nr; | |
1227 nsamples = nc; | |
1228 } | |
1229 | |
1230 const Complex *in (data ()); | |
1231 Complex *out (retval.fortran_vec ()); | |
1232 | |
11586
12df7854fa7c
strip trailing whitespace from source files
John W. Eaton <jwe@octave.org>
parents:
11574
diff
changeset
|
1233 octave_fftw::ifft (in, out, npts, nsamples); |
3827 | 1234 |
1235 return retval; | |
1236 } | |
1237 | |
1238 ComplexMatrix | |
1239 ComplexMatrix::fourier2d (void) const | |
1240 { | |
20218
b2100e1659ac
maint: Use cuddled parentheses when indexing dimension_vectors.
Rik <rik@octave.org>
parents:
19864
diff
changeset
|
1241 dim_vector dv (rows (), cols ()); |
4773 | 1242 |
1243 ComplexMatrix retval (rows (), cols ()); | |
1244 const Complex *in (data ()); | |
1245 Complex *out (retval.fortran_vec ()); | |
1246 | |
1247 octave_fftw::fftNd (in, out, 2, dv); | |
3827 | 1248 |
1249 return retval; | |
1250 } | |
1251 | |
1252 ComplexMatrix | |
1253 ComplexMatrix::ifourier2d (void) const | |
1254 { | |
20218
b2100e1659ac
maint: Use cuddled parentheses when indexing dimension_vectors.
Rik <rik@octave.org>
parents:
19864
diff
changeset
|
1255 dim_vector dv (rows (), cols ()); |
4773 | 1256 |
1257 ComplexMatrix retval (rows (), cols ()); | |
1258 const Complex *in (data ()); | |
1259 Complex *out (retval.fortran_vec ()); | |
1260 | |
1261 octave_fftw::ifftNd (in, out, 2, dv); | |
3827 | 1262 |
1263 return retval; | |
1264 } | |
1265 | |
1266 #else | |
1267 | |
9523
0ce82753dd72
more configure changes for libraries
John W. Eaton <jwe@octave.org>
parents:
9469
diff
changeset
|
1268 extern "C" |
0ce82753dd72
more configure changes for libraries
John W. Eaton <jwe@octave.org>
parents:
9469
diff
changeset
|
1269 { |
0ce82753dd72
more configure changes for libraries
John W. Eaton <jwe@octave.org>
parents:
9469
diff
changeset
|
1270 // Note that the original complex fft routines were not written for |
0ce82753dd72
more configure changes for libraries
John W. Eaton <jwe@octave.org>
parents:
9469
diff
changeset
|
1271 // double complex arguments. They have been modified by adding an |
0ce82753dd72
more configure changes for libraries
John W. Eaton <jwe@octave.org>
parents:
9469
diff
changeset
|
1272 // implicit double precision (a-h,o-z) statement at the beginning of |
0ce82753dd72
more configure changes for libraries
John W. Eaton <jwe@octave.org>
parents:
9469
diff
changeset
|
1273 // each subroutine. |
0ce82753dd72
more configure changes for libraries
John W. Eaton <jwe@octave.org>
parents:
9469
diff
changeset
|
1274 |
0ce82753dd72
more configure changes for libraries
John W. Eaton <jwe@octave.org>
parents:
9469
diff
changeset
|
1275 F77_RET_T |
22133
59cadee1c74b
new macros for F77 data types
John W. Eaton <jwe@octave.org>
parents:
22085
diff
changeset
|
1276 F77_FUNC (zffti, ZFFTI) (const F77_INT&, F77_DBLE_CMPLX*); |
9523
0ce82753dd72
more configure changes for libraries
John W. Eaton <jwe@octave.org>
parents:
9469
diff
changeset
|
1277 |
0ce82753dd72
more configure changes for libraries
John W. Eaton <jwe@octave.org>
parents:
9469
diff
changeset
|
1278 F77_RET_T |
22133
59cadee1c74b
new macros for F77 data types
John W. Eaton <jwe@octave.org>
parents:
22085
diff
changeset
|
1279 F77_FUNC (zfftf, ZFFTF) (const F77_INT&, F77_DBLE_CMPLX*, F77_DBLE_CMPLX*); |
9523
0ce82753dd72
more configure changes for libraries
John W. Eaton <jwe@octave.org>
parents:
9469
diff
changeset
|
1280 |
0ce82753dd72
more configure changes for libraries
John W. Eaton <jwe@octave.org>
parents:
9469
diff
changeset
|
1281 F77_RET_T |
22133
59cadee1c74b
new macros for F77 data types
John W. Eaton <jwe@octave.org>
parents:
22085
diff
changeset
|
1282 F77_FUNC (zfftb, ZFFTB) (const F77_INT&, F77_DBLE_CMPLX*, F77_DBLE_CMPLX*); |
9523
0ce82753dd72
more configure changes for libraries
John W. Eaton <jwe@octave.org>
parents:
9469
diff
changeset
|
1283 } |
0ce82753dd72
more configure changes for libraries
John W. Eaton <jwe@octave.org>
parents:
9469
diff
changeset
|
1284 |
740 | 1285 ComplexMatrix |
458 | 1286 ComplexMatrix::fourier (void) const |
1287 { | |
1948 | 1288 ComplexMatrix retval; |
1289 | |
5275 | 1290 octave_idx_type nr = rows (); |
1291 octave_idx_type nc = cols (); | |
1292 | |
1293 octave_idx_type npts, nsamples; | |
1948 | 1294 |
458 | 1295 if (nr == 1 || nc == 1) |
1296 { | |
1297 npts = nr > nc ? nr : nc; | |
1298 nsamples = 1; | |
1299 } | |
1300 else | |
1301 { | |
1302 npts = nr; | |
1303 nsamples = nc; | |
1304 } | |
1305 | |
5275 | 1306 octave_idx_type nn = 4*npts+15; |
1948 | 1307 |
19340
fcd9e1198847
CMatrix.cc: Use undeprecated Array constructor (bug #43646).
Kai T. Ohlhus <k.ohlhus@gmail.com>
parents:
19321
diff
changeset
|
1308 Array<Complex> wsave (dim_vector (nn, 1)); |
1948 | 1309 Complex *pwsave = wsave.fortran_vec (); |
1310 | |
1311 retval = *this; | |
1312 Complex *tmp_data = retval.fortran_vec (); | |
1313 | |
7789
82be108cc558
First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents:
7788
diff
changeset
|
1314 F77_FUNC (zffti, ZFFTI) (npts, pwsave); |
458 | 1315 |
5275 | 1316 for (octave_idx_type j = 0; j < nsamples; j++) |
4153 | 1317 { |
10142
829e69ec3110
make OCTAVE_QUIT a function
Jaroslav Hajek <highegg@gmail.com>
parents:
10124
diff
changeset
|
1318 octave_quit (); |
4153 | 1319 |
7789
82be108cc558
First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents:
7788
diff
changeset
|
1320 F77_FUNC (zfftf, ZFFTF) (npts, &tmp_data[npts*j], pwsave); |
4153 | 1321 } |
1948 | 1322 |
1323 return retval; | |
458 | 1324 } |
1325 | |
1326 ComplexMatrix | |
1327 ComplexMatrix::ifourier (void) const | |
1328 { | |
1948 | 1329 ComplexMatrix retval; |
1330 | |
5275 | 1331 octave_idx_type nr = rows (); |
1332 octave_idx_type nc = cols (); | |
1333 | |
1334 octave_idx_type npts, nsamples; | |
1948 | 1335 |
458 | 1336 if (nr == 1 || nc == 1) |
1337 { | |
1338 npts = nr > nc ? nr : nc; | |
1339 nsamples = 1; | |
1340 } | |
1341 else | |
1342 { | |
1343 npts = nr; | |
1344 nsamples = nc; | |
1345 } | |
1346 | |
5275 | 1347 octave_idx_type nn = 4*npts+15; |
1948 | 1348 |
19340
fcd9e1198847
CMatrix.cc: Use undeprecated Array constructor (bug #43646).
Kai T. Ohlhus <k.ohlhus@gmail.com>
parents:
19321
diff
changeset
|
1349 Array<Complex> wsave (dim_vector (nn, 1)); |
1948 | 1350 Complex *pwsave = wsave.fortran_vec (); |
1351 | |
1352 retval = *this; | |
1353 Complex *tmp_data = retval.fortran_vec (); | |
1354 | |
7789
82be108cc558
First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents:
7788
diff
changeset
|
1355 F77_FUNC (zffti, ZFFTI) (npts, pwsave); |
458 | 1356 |
5275 | 1357 for (octave_idx_type j = 0; j < nsamples; j++) |
4153 | 1358 { |
10142
829e69ec3110
make OCTAVE_QUIT a function
Jaroslav Hajek <highegg@gmail.com>
parents:
10124
diff
changeset
|
1359 octave_quit (); |
4153 | 1360 |
7789
82be108cc558
First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents:
7788
diff
changeset
|
1361 F77_FUNC (zfftb, ZFFTB) (npts, &tmp_data[npts*j], pwsave); |
4153 | 1362 } |
458 | 1363 |
5275 | 1364 for (octave_idx_type j = 0; j < npts*nsamples; j++) |
3572 | 1365 tmp_data[j] = tmp_data[j] / static_cast<double> (npts); |
458 | 1366 |
1948 | 1367 return retval; |
458 | 1368 } |
1369 | |
677 | 1370 ComplexMatrix |
1371 ComplexMatrix::fourier2d (void) const | |
1372 { | |
1948 | 1373 ComplexMatrix retval; |
1374 | |
5275 | 1375 octave_idx_type nr = rows (); |
1376 octave_idx_type nc = cols (); | |
1377 | |
1378 octave_idx_type npts, nsamples; | |
1948 | 1379 |
677 | 1380 if (nr == 1 || nc == 1) |
1381 { | |
1382 npts = nr > nc ? nr : nc; | |
1383 nsamples = 1; | |
1384 } | |
1385 else | |
1386 { | |
1387 npts = nr; | |
1388 nsamples = nc; | |
1389 } | |
1390 | |
5275 | 1391 octave_idx_type nn = 4*npts+15; |
1948 | 1392 |
19340
fcd9e1198847
CMatrix.cc: Use undeprecated Array constructor (bug #43646).
Kai T. Ohlhus <k.ohlhus@gmail.com>
parents:
19321
diff
changeset
|
1393 Array<Complex> wsave (dim_vector (nn, 1)); |
1948 | 1394 Complex *pwsave = wsave.fortran_vec (); |
1395 | |
1396 retval = *this; | |
1397 Complex *tmp_data = retval.fortran_vec (); | |
1398 | |
7789
82be108cc558
First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents:
7788
diff
changeset
|
1399 F77_FUNC (zffti, ZFFTI) (npts, pwsave); |
677 | 1400 |
5275 | 1401 for (octave_idx_type j = 0; j < nsamples; j++) |
4153 | 1402 { |
10142
829e69ec3110
make OCTAVE_QUIT a function
Jaroslav Hajek <highegg@gmail.com>
parents:
10124
diff
changeset
|
1403 octave_quit (); |
4153 | 1404 |
7789
82be108cc558
First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents:
7788
diff
changeset
|
1405 F77_FUNC (zfftf, ZFFTF) (npts, &tmp_data[npts*j], pwsave); |
4153 | 1406 } |
677 | 1407 |
1408 npts = nc; | |
1409 nsamples = nr; | |
1410 nn = 4*npts+15; | |
1948 | 1411 |
11574
a83bad07f7e3
attempt better backward compatibility for Array resize functions
John W. Eaton <jwe@octave.org>
parents:
11570
diff
changeset
|
1412 wsave.resize (dim_vector (nn, 1)); |
1948 | 1413 pwsave = wsave.fortran_vec (); |
1414 | |
19340
fcd9e1198847
CMatrix.cc: Use undeprecated Array constructor (bug #43646).
Kai T. Ohlhus <k.ohlhus@gmail.com>
parents:
19321
diff
changeset
|
1415 Array<Complex> tmp (dim_vector (npts, 1)); |
4773 | 1416 Complex *prow = tmp.fortran_vec (); |
1948 | 1417 |
7789
82be108cc558
First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents:
7788
diff
changeset
|
1418 F77_FUNC (zffti, ZFFTI) (npts, pwsave); |
677 | 1419 |
5275 | 1420 for (octave_idx_type j = 0; j < nsamples; j++) |
677 | 1421 { |
10142
829e69ec3110
make OCTAVE_QUIT a function
Jaroslav Hajek <highegg@gmail.com>
parents:
10124
diff
changeset
|
1422 octave_quit (); |
4153 | 1423 |
5275 | 1424 for (octave_idx_type i = 0; i < npts; i++) |
10314
07ebe522dac2
untabify liboctave C++ sources
John W. Eaton <jwe@octave.org>
parents:
10213
diff
changeset
|
1425 prow[i] = tmp_data[i*nr + j]; |
1948 | 1426 |
7789
82be108cc558
First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents:
7788
diff
changeset
|
1427 F77_FUNC (zfftf, ZFFTF) (npts, prow, pwsave); |
677 | 1428 |
5275 | 1429 for (octave_idx_type i = 0; i < npts; i++) |
10314
07ebe522dac2
untabify liboctave C++ sources
John W. Eaton <jwe@octave.org>
parents:
10213
diff
changeset
|
1430 tmp_data[i*nr + j] = prow[i]; |
677 | 1431 } |
1432 | |
1948 | 1433 return retval; |
677 | 1434 } |
1435 | |
1436 ComplexMatrix | |
1437 ComplexMatrix::ifourier2d (void) const | |
1438 { | |
1948 | 1439 ComplexMatrix retval; |
1440 | |
5275 | 1441 octave_idx_type nr = rows (); |
1442 octave_idx_type nc = cols (); | |
1443 | |
1444 octave_idx_type npts, nsamples; | |
1948 | 1445 |
677 | 1446 if (nr == 1 || nc == 1) |
1447 { | |
1448 npts = nr > nc ? nr : nc; | |
1449 nsamples = 1; | |
1450 } | |
1451 else | |
1452 { | |
1453 npts = nr; | |
1454 nsamples = nc; | |
1455 } | |
1456 | |
5275 | 1457 octave_idx_type nn = 4*npts+15; |
1948 | 1458 |
19340
fcd9e1198847
CMatrix.cc: Use undeprecated Array constructor (bug #43646).
Kai T. Ohlhus <k.ohlhus@gmail.com>
parents:
19321
diff
changeset
|
1459 Array<Complex> wsave (dim_vector (nn, 1)); |
1948 | 1460 Complex *pwsave = wsave.fortran_vec (); |
1461 | |
1462 retval = *this; | |
1463 Complex *tmp_data = retval.fortran_vec (); | |
1464 | |
7789
82be108cc558
First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents:
7788
diff
changeset
|
1465 F77_FUNC (zffti, ZFFTI) (npts, pwsave); |
677 | 1466 |
5275 | 1467 for (octave_idx_type j = 0; j < nsamples; j++) |
4153 | 1468 { |
10142
829e69ec3110
make OCTAVE_QUIT a function
Jaroslav Hajek <highegg@gmail.com>
parents:
10124
diff
changeset
|
1469 octave_quit (); |
4153 | 1470 |
7789
82be108cc558
First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents:
7788
diff
changeset
|
1471 F77_FUNC (zfftb, ZFFTB) (npts, &tmp_data[npts*j], pwsave); |
4153 | 1472 } |
677 | 1473 |
5275 | 1474 for (octave_idx_type j = 0; j < npts*nsamples; j++) |
3572 | 1475 tmp_data[j] = tmp_data[j] / static_cast<double> (npts); |
677 | 1476 |
1477 npts = nc; | |
1478 nsamples = nr; | |
1479 nn = 4*npts+15; | |
1948 | 1480 |
11574
a83bad07f7e3
attempt better backward compatibility for Array resize functions
John W. Eaton <jwe@octave.org>
parents:
11570
diff
changeset
|
1481 wsave.resize (dim_vector (nn, 1)); |
1948 | 1482 pwsave = wsave.fortran_vec (); |
1483 | |
19340
fcd9e1198847
CMatrix.cc: Use undeprecated Array constructor (bug #43646).
Kai T. Ohlhus <k.ohlhus@gmail.com>
parents:
19321
diff
changeset
|
1484 Array<Complex> tmp (dim_vector (npts, 1)); |
4773 | 1485 Complex *prow = tmp.fortran_vec (); |
1948 | 1486 |
7789
82be108cc558
First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents:
7788
diff
changeset
|
1487 F77_FUNC (zffti, ZFFTI) (npts, pwsave); |
677 | 1488 |
5275 | 1489 for (octave_idx_type j = 0; j < nsamples; j++) |
677 | 1490 { |
10142
829e69ec3110
make OCTAVE_QUIT a function
Jaroslav Hajek <highegg@gmail.com>
parents:
10124
diff
changeset
|
1491 octave_quit (); |
4153 | 1492 |
5275 | 1493 for (octave_idx_type i = 0; i < npts; i++) |
10314
07ebe522dac2
untabify liboctave C++ sources
John W. Eaton <jwe@octave.org>
parents:
10213
diff
changeset
|
1494 prow[i] = tmp_data[i*nr + j]; |
1948 | 1495 |
7789
82be108cc558
First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents:
7788
diff
changeset
|
1496 F77_FUNC (zfftb, ZFFTB) (npts, prow, pwsave); |
677 | 1497 |
5275 | 1498 for (octave_idx_type i = 0; i < npts; i++) |
10314
07ebe522dac2
untabify liboctave C++ sources
John W. Eaton <jwe@octave.org>
parents:
10213
diff
changeset
|
1499 tmp_data[i*nr + j] = prow[i] / static_cast<double> (npts); |
677 | 1500 } |
1501 | |
1948 | 1502 return retval; |
677 | 1503 } |
1504 | |
3827 | 1505 #endif |
1506 | |
458 | 1507 ComplexDET |
1508 ComplexMatrix::determinant (void) const | |
1509 { | |
5275 | 1510 octave_idx_type info; |
7788 | 1511 double rcon; |
1512 return determinant (info, rcon, 0); | |
458 | 1513 } |
1514 | |
1515 ComplexDET | |
5275 | 1516 ComplexMatrix::determinant (octave_idx_type& info) const |
458 | 1517 { |
7788 | 1518 double rcon; |
1519 return determinant (info, rcon, 0); | |
458 | 1520 } |
1521 | |
1522 ComplexDET | |
17769
49a5a4be04a1
maint: Use GNU style coding conventions for code in liboctave/
Rik <rik@octave.org>
parents:
17744
diff
changeset
|
1523 ComplexMatrix::determinant (octave_idx_type& info, double& rcon, |
21719
ff054947d132
use bool instead of int for some logical flags
John W. Eaton <jwe@octave.org>
parents:
21317
diff
changeset
|
1524 bool calc_cond) const |
458 | 1525 { |
8336
9813c07ca946
make det take advantage of matrix type
Jaroslav Hajek <highegg@gmail.com>
parents:
8335
diff
changeset
|
1526 MatrixType mattype (*this); |
9813c07ca946
make det take advantage of matrix type
Jaroslav Hajek <highegg@gmail.com>
parents:
8335
diff
changeset
|
1527 return determinant (mattype, info, rcon, calc_cond); |
9813c07ca946
make det take advantage of matrix type
Jaroslav Hajek <highegg@gmail.com>
parents:
8335
diff
changeset
|
1528 } |
9813c07ca946
make det take advantage of matrix type
Jaroslav Hajek <highegg@gmail.com>
parents:
8335
diff
changeset
|
1529 |
9813c07ca946
make det take advantage of matrix type
Jaroslav Hajek <highegg@gmail.com>
parents:
8335
diff
changeset
|
1530 ComplexDET |
9813c07ca946
make det take advantage of matrix type
Jaroslav Hajek <highegg@gmail.com>
parents:
8335
diff
changeset
|
1531 ComplexMatrix::determinant (MatrixType& mattype, |
8806 | 1532 octave_idx_type& info, double& rcon, |
21719
ff054947d132
use bool instead of int for some logical flags
John W. Eaton <jwe@octave.org>
parents:
21317
diff
changeset
|
1533 bool calc_cond) const |
8336
9813c07ca946
make det take advantage of matrix type
Jaroslav Hajek <highegg@gmail.com>
parents:
8335
diff
changeset
|
1534 { |
9813c07ca946
make det take advantage of matrix type
Jaroslav Hajek <highegg@gmail.com>
parents:
8335
diff
changeset
|
1535 ComplexDET retval (1.0); |
458 | 1536 |
13828
f1b023fd098d
always initialize info and rcon in Matrix determinant methods
John W. Eaton <jwe@octave.org>
parents:
13107
diff
changeset
|
1537 info = 0; |
f1b023fd098d
always initialize info and rcon in Matrix determinant methods
John W. Eaton <jwe@octave.org>
parents:
13107
diff
changeset
|
1538 rcon = 0.0; |
f1b023fd098d
always initialize info and rcon in Matrix determinant methods
John W. Eaton <jwe@octave.org>
parents:
13107
diff
changeset
|
1539 |
5275 | 1540 octave_idx_type nr = rows (); |
1541 octave_idx_type nc = cols (); | |
458 | 1542 |
8336
9813c07ca946
make det take advantage of matrix type
Jaroslav Hajek <highegg@gmail.com>
parents:
8335
diff
changeset
|
1543 if (nr != nc) |
9813c07ca946
make det take advantage of matrix type
Jaroslav Hajek <highegg@gmail.com>
parents:
8335
diff
changeset
|
1544 (*current_liboctave_error_handler) ("matrix must be square"); |
21136
7cac4e7458f2
maint: clean up code around calls to current_liboctave_error_handler.
Rik <rik@octave.org>
parents:
21129
diff
changeset
|
1545 |
7cac4e7458f2
maint: clean up code around calls to current_liboctave_error_handler.
Rik <rik@octave.org>
parents:
21129
diff
changeset
|
1546 volatile int typ = mattype.type (); |
7cac4e7458f2
maint: clean up code around calls to current_liboctave_error_handler.
Rik <rik@octave.org>
parents:
21129
diff
changeset
|
1547 |
7cac4e7458f2
maint: clean up code around calls to current_liboctave_error_handler.
Rik <rik@octave.org>
parents:
21129
diff
changeset
|
1548 // Even though the matrix is marked as singular (Rectangular), we may |
7cac4e7458f2
maint: clean up code around calls to current_liboctave_error_handler.
Rik <rik@octave.org>
parents:
21129
diff
changeset
|
1549 // still get a useful number from the LU factorization, because it always |
7cac4e7458f2
maint: clean up code around calls to current_liboctave_error_handler.
Rik <rik@octave.org>
parents:
21129
diff
changeset
|
1550 // completes. |
7cac4e7458f2
maint: clean up code around calls to current_liboctave_error_handler.
Rik <rik@octave.org>
parents:
21129
diff
changeset
|
1551 |
7cac4e7458f2
maint: clean up code around calls to current_liboctave_error_handler.
Rik <rik@octave.org>
parents:
21129
diff
changeset
|
1552 if (typ == MatrixType::Unknown) |
7cac4e7458f2
maint: clean up code around calls to current_liboctave_error_handler.
Rik <rik@octave.org>
parents:
21129
diff
changeset
|
1553 typ = mattype.type (*this); |
7cac4e7458f2
maint: clean up code around calls to current_liboctave_error_handler.
Rik <rik@octave.org>
parents:
21129
diff
changeset
|
1554 else if (typ == MatrixType::Rectangular) |
7cac4e7458f2
maint: clean up code around calls to current_liboctave_error_handler.
Rik <rik@octave.org>
parents:
21129
diff
changeset
|
1555 typ = MatrixType::Full; |
7cac4e7458f2
maint: clean up code around calls to current_liboctave_error_handler.
Rik <rik@octave.org>
parents:
21129
diff
changeset
|
1556 |
7cac4e7458f2
maint: clean up code around calls to current_liboctave_error_handler.
Rik <rik@octave.org>
parents:
21129
diff
changeset
|
1557 if (typ == MatrixType::Lower || typ == MatrixType::Upper) |
458 | 1558 { |
21136
7cac4e7458f2
maint: clean up code around calls to current_liboctave_error_handler.
Rik <rik@octave.org>
parents:
21129
diff
changeset
|
1559 for (octave_idx_type i = 0; i < nc; i++) |
7cac4e7458f2
maint: clean up code around calls to current_liboctave_error_handler.
Rik <rik@octave.org>
parents:
21129
diff
changeset
|
1560 retval *= elem (i,i); |
7cac4e7458f2
maint: clean up code around calls to current_liboctave_error_handler.
Rik <rik@octave.org>
parents:
21129
diff
changeset
|
1561 } |
7cac4e7458f2
maint: clean up code around calls to current_liboctave_error_handler.
Rik <rik@octave.org>
parents:
21129
diff
changeset
|
1562 else if (typ == MatrixType::Hermitian) |
7cac4e7458f2
maint: clean up code around calls to current_liboctave_error_handler.
Rik <rik@octave.org>
parents:
21129
diff
changeset
|
1563 { |
7cac4e7458f2
maint: clean up code around calls to current_liboctave_error_handler.
Rik <rik@octave.org>
parents:
21129
diff
changeset
|
1564 ComplexMatrix atmp = *this; |
7cac4e7458f2
maint: clean up code around calls to current_liboctave_error_handler.
Rik <rik@octave.org>
parents:
21129
diff
changeset
|
1565 Complex *tmp_data = atmp.fortran_vec (); |
7cac4e7458f2
maint: clean up code around calls to current_liboctave_error_handler.
Rik <rik@octave.org>
parents:
21129
diff
changeset
|
1566 |
7cac4e7458f2
maint: clean up code around calls to current_liboctave_error_handler.
Rik <rik@octave.org>
parents:
21129
diff
changeset
|
1567 double anorm = 0; |
7cac4e7458f2
maint: clean up code around calls to current_liboctave_error_handler.
Rik <rik@octave.org>
parents:
21129
diff
changeset
|
1568 if (calc_cond) anorm = xnorm (*this, 1); |
7cac4e7458f2
maint: clean up code around calls to current_liboctave_error_handler.
Rik <rik@octave.org>
parents:
21129
diff
changeset
|
1569 |
7cac4e7458f2
maint: clean up code around calls to current_liboctave_error_handler.
Rik <rik@octave.org>
parents:
21129
diff
changeset
|
1570 char job = 'L'; |
7cac4e7458f2
maint: clean up code around calls to current_liboctave_error_handler.
Rik <rik@octave.org>
parents:
21129
diff
changeset
|
1571 F77_XFCN (zpotrf, ZPOTRF, (F77_CONST_CHAR_ARG2 (&job, 1), nr, |
22135
407c66ae1e20
reduce warnings from GCC's link-time optimization feature (bug #48531)
John W. Eaton <jwe@octave.org>
parents:
22133
diff
changeset
|
1572 F77_DBLE_CMPLX_ARG (tmp_data), nr, info |
21136
7cac4e7458f2
maint: clean up code around calls to current_liboctave_error_handler.
Rik <rik@octave.org>
parents:
21129
diff
changeset
|
1573 F77_CHAR_ARG_LEN (1))); |
7cac4e7458f2
maint: clean up code around calls to current_liboctave_error_handler.
Rik <rik@octave.org>
parents:
21129
diff
changeset
|
1574 |
7cac4e7458f2
maint: clean up code around calls to current_liboctave_error_handler.
Rik <rik@octave.org>
parents:
21129
diff
changeset
|
1575 if (info != 0) |
8336
9813c07ca946
make det take advantage of matrix type
Jaroslav Hajek <highegg@gmail.com>
parents:
8335
diff
changeset
|
1576 { |
21136
7cac4e7458f2
maint: clean up code around calls to current_liboctave_error_handler.
Rik <rik@octave.org>
parents:
21129
diff
changeset
|
1577 rcon = 0.0; |
7cac4e7458f2
maint: clean up code around calls to current_liboctave_error_handler.
Rik <rik@octave.org>
parents:
21129
diff
changeset
|
1578 mattype.mark_as_unsymmetric (); |
7cac4e7458f2
maint: clean up code around calls to current_liboctave_error_handler.
Rik <rik@octave.org>
parents:
21129
diff
changeset
|
1579 typ = MatrixType::Full; |
8336
9813c07ca946
make det take advantage of matrix type
Jaroslav Hajek <highegg@gmail.com>
parents:
8335
diff
changeset
|
1580 } |
21136
7cac4e7458f2
maint: clean up code around calls to current_liboctave_error_handler.
Rik <rik@octave.org>
parents:
21129
diff
changeset
|
1581 else |
8336
9813c07ca946
make det take advantage of matrix type
Jaroslav Hajek <highegg@gmail.com>
parents:
8335
diff
changeset
|
1582 { |
21136
7cac4e7458f2
maint: clean up code around calls to current_liboctave_error_handler.
Rik <rik@octave.org>
parents:
21129
diff
changeset
|
1583 Array<Complex> z (dim_vector (2 * nc, 1)); |
7cac4e7458f2
maint: clean up code around calls to current_liboctave_error_handler.
Rik <rik@octave.org>
parents:
21129
diff
changeset
|
1584 Complex *pz = z.fortran_vec (); |
7cac4e7458f2
maint: clean up code around calls to current_liboctave_error_handler.
Rik <rik@octave.org>
parents:
21129
diff
changeset
|
1585 Array<double> rz (dim_vector (nc, 1)); |
7cac4e7458f2
maint: clean up code around calls to current_liboctave_error_handler.
Rik <rik@octave.org>
parents:
21129
diff
changeset
|
1586 double *prz = rz.fortran_vec (); |
7cac4e7458f2
maint: clean up code around calls to current_liboctave_error_handler.
Rik <rik@octave.org>
parents:
21129
diff
changeset
|
1587 |
7cac4e7458f2
maint: clean up code around calls to current_liboctave_error_handler.
Rik <rik@octave.org>
parents:
21129
diff
changeset
|
1588 F77_XFCN (zpocon, ZPOCON, (F77_CONST_CHAR_ARG2 (&job, 1), |
22135
407c66ae1e20
reduce warnings from GCC's link-time optimization feature (bug #48531)
John W. Eaton <jwe@octave.org>
parents:
22133
diff
changeset
|
1589 nr, F77_DBLE_CMPLX_ARG (tmp_data), nr, anorm, |
407c66ae1e20
reduce warnings from GCC's link-time optimization feature (bug #48531)
John W. Eaton <jwe@octave.org>
parents:
22133
diff
changeset
|
1590 rcon, F77_DBLE_CMPLX_ARG (pz), prz, info |
8336
9813c07ca946
make det take advantage of matrix type
Jaroslav Hajek <highegg@gmail.com>
parents:
8335
diff
changeset
|
1591 F77_CHAR_ARG_LEN (1))); |
9813c07ca946
make det take advantage of matrix type
Jaroslav Hajek <highegg@gmail.com>
parents:
8335
diff
changeset
|
1592 |
11586
12df7854fa7c
strip trailing whitespace from source files
John W. Eaton <jwe@octave.org>
parents:
11574
diff
changeset
|
1593 if (info != 0) |
21136
7cac4e7458f2
maint: clean up code around calls to current_liboctave_error_handler.
Rik <rik@octave.org>
parents:
21129
diff
changeset
|
1594 rcon = 0.0; |
7cac4e7458f2
maint: clean up code around calls to current_liboctave_error_handler.
Rik <rik@octave.org>
parents:
21129
diff
changeset
|
1595 |
7cac4e7458f2
maint: clean up code around calls to current_liboctave_error_handler.
Rik <rik@octave.org>
parents:
21129
diff
changeset
|
1596 for (octave_idx_type i = 0; i < nc; i++) |
7cac4e7458f2
maint: clean up code around calls to current_liboctave_error_handler.
Rik <rik@octave.org>
parents:
21129
diff
changeset
|
1597 retval *= atmp (i,i); |
7cac4e7458f2
maint: clean up code around calls to current_liboctave_error_handler.
Rik <rik@octave.org>
parents:
21129
diff
changeset
|
1598 |
7cac4e7458f2
maint: clean up code around calls to current_liboctave_error_handler.
Rik <rik@octave.org>
parents:
21129
diff
changeset
|
1599 retval = retval.square (); |
7cac4e7458f2
maint: clean up code around calls to current_liboctave_error_handler.
Rik <rik@octave.org>
parents:
21129
diff
changeset
|
1600 } |
7cac4e7458f2
maint: clean up code around calls to current_liboctave_error_handler.
Rik <rik@octave.org>
parents:
21129
diff
changeset
|
1601 } |
7cac4e7458f2
maint: clean up code around calls to current_liboctave_error_handler.
Rik <rik@octave.org>
parents:
21129
diff
changeset
|
1602 else if (typ != MatrixType::Full) |
7cac4e7458f2
maint: clean up code around calls to current_liboctave_error_handler.
Rik <rik@octave.org>
parents:
21129
diff
changeset
|
1603 (*current_liboctave_error_handler) ("det: invalid dense matrix type"); |
7cac4e7458f2
maint: clean up code around calls to current_liboctave_error_handler.
Rik <rik@octave.org>
parents:
21129
diff
changeset
|
1604 |
7cac4e7458f2
maint: clean up code around calls to current_liboctave_error_handler.
Rik <rik@octave.org>
parents:
21129
diff
changeset
|
1605 if (typ == MatrixType::Full) |
7cac4e7458f2
maint: clean up code around calls to current_liboctave_error_handler.
Rik <rik@octave.org>
parents:
21129
diff
changeset
|
1606 { |
7cac4e7458f2
maint: clean up code around calls to current_liboctave_error_handler.
Rik <rik@octave.org>
parents:
21129
diff
changeset
|
1607 Array<octave_idx_type> ipvt (dim_vector (nr, 1)); |
7cac4e7458f2
maint: clean up code around calls to current_liboctave_error_handler.
Rik <rik@octave.org>
parents:
21129
diff
changeset
|
1608 octave_idx_type *pipvt = ipvt.fortran_vec (); |
7cac4e7458f2
maint: clean up code around calls to current_liboctave_error_handler.
Rik <rik@octave.org>
parents:
21129
diff
changeset
|
1609 |
7cac4e7458f2
maint: clean up code around calls to current_liboctave_error_handler.
Rik <rik@octave.org>
parents:
21129
diff
changeset
|
1610 ComplexMatrix atmp = *this; |
7cac4e7458f2
maint: clean up code around calls to current_liboctave_error_handler.
Rik <rik@octave.org>
parents:
21129
diff
changeset
|
1611 Complex *tmp_data = atmp.fortran_vec (); |
7cac4e7458f2
maint: clean up code around calls to current_liboctave_error_handler.
Rik <rik@octave.org>
parents:
21129
diff
changeset
|
1612 |
7cac4e7458f2
maint: clean up code around calls to current_liboctave_error_handler.
Rik <rik@octave.org>
parents:
21129
diff
changeset
|
1613 info = 0; |
7cac4e7458f2
maint: clean up code around calls to current_liboctave_error_handler.
Rik <rik@octave.org>
parents:
21129
diff
changeset
|
1614 |
22085
bf5fbf347aaf
Avoid segfault with complex matrices using LAPACK (bug #46330).
Kai T. Ohlhus <k.ohlhus@gmail.com>
parents:
22044
diff
changeset
|
1615 // Calculate (always, see bug #45577) the norm of the matrix, for later use. |
bf5fbf347aaf
Avoid segfault with complex matrices using LAPACK (bug #46330).
Kai T. Ohlhus <k.ohlhus@gmail.com>
parents:
22044
diff
changeset
|
1616 double anorm = xnorm (*this, 1); |
21136
7cac4e7458f2
maint: clean up code around calls to current_liboctave_error_handler.
Rik <rik@octave.org>
parents:
21129
diff
changeset
|
1617 |
7cac4e7458f2
maint: clean up code around calls to current_liboctave_error_handler.
Rik <rik@octave.org>
parents:
21129
diff
changeset
|
1618 // Work around bug #45577, LAPACK crashes Octave if norm is NaN |
21782
2aef506f3fec
use namespace for lo-mappers.h functions
John W. Eaton <jwe@octave.org>
parents:
21751
diff
changeset
|
1619 if (octave::math::isnan (anorm)) |
21136
7cac4e7458f2
maint: clean up code around calls to current_liboctave_error_handler.
Rik <rik@octave.org>
parents:
21129
diff
changeset
|
1620 info = -1; |
7cac4e7458f2
maint: clean up code around calls to current_liboctave_error_handler.
Rik <rik@octave.org>
parents:
21129
diff
changeset
|
1621 else |
22135
407c66ae1e20
reduce warnings from GCC's link-time optimization feature (bug #48531)
John W. Eaton <jwe@octave.org>
parents:
22133
diff
changeset
|
1622 F77_XFCN (zgetrf, ZGETRF, (nr, nr, F77_DBLE_CMPLX_ARG (tmp_data), nr, pipvt, info)); |
21136
7cac4e7458f2
maint: clean up code around calls to current_liboctave_error_handler.
Rik <rik@octave.org>
parents:
21129
diff
changeset
|
1623 |
7cac4e7458f2
maint: clean up code around calls to current_liboctave_error_handler.
Rik <rik@octave.org>
parents:
21129
diff
changeset
|
1624 // Throw-away extra info LAPACK gives so as to not change output. |
7cac4e7458f2
maint: clean up code around calls to current_liboctave_error_handler.
Rik <rik@octave.org>
parents:
21129
diff
changeset
|
1625 rcon = 0.0; |
7cac4e7458f2
maint: clean up code around calls to current_liboctave_error_handler.
Rik <rik@octave.org>
parents:
21129
diff
changeset
|
1626 if (info != 0) |
7cac4e7458f2
maint: clean up code around calls to current_liboctave_error_handler.
Rik <rik@octave.org>
parents:
21129
diff
changeset
|
1627 { |
7cac4e7458f2
maint: clean up code around calls to current_liboctave_error_handler.
Rik <rik@octave.org>
parents:
21129
diff
changeset
|
1628 info = -1; |
7cac4e7458f2
maint: clean up code around calls to current_liboctave_error_handler.
Rik <rik@octave.org>
parents:
21129
diff
changeset
|
1629 retval = ComplexDET (); |
7cac4e7458f2
maint: clean up code around calls to current_liboctave_error_handler.
Rik <rik@octave.org>
parents:
21129
diff
changeset
|
1630 } |
7cac4e7458f2
maint: clean up code around calls to current_liboctave_error_handler.
Rik <rik@octave.org>
parents:
21129
diff
changeset
|
1631 else |
7cac4e7458f2
maint: clean up code around calls to current_liboctave_error_handler.
Rik <rik@octave.org>
parents:
21129
diff
changeset
|
1632 { |
7cac4e7458f2
maint: clean up code around calls to current_liboctave_error_handler.
Rik <rik@octave.org>
parents:
21129
diff
changeset
|
1633 if (calc_cond) |
8336
9813c07ca946
make det take advantage of matrix type
Jaroslav Hajek <highegg@gmail.com>
parents:
8335
diff
changeset
|
1634 { |
21136
7cac4e7458f2
maint: clean up code around calls to current_liboctave_error_handler.
Rik <rik@octave.org>
parents:
21129
diff
changeset
|
1635 // Now calc the condition number for non-singular matrix. |
7cac4e7458f2
maint: clean up code around calls to current_liboctave_error_handler.
Rik <rik@octave.org>
parents:
21129
diff
changeset
|
1636 char job = '1'; |
11570
57632dea2446
attempt better backward compatibility for Array constructors
John W. Eaton <jwe@octave.org>
parents:
11523
diff
changeset
|
1637 Array<Complex> z (dim_vector (2 * nc, 1)); |
8336
9813c07ca946
make det take advantage of matrix type
Jaroslav Hajek <highegg@gmail.com>
parents:
8335
diff
changeset
|
1638 Complex *pz = z.fortran_vec (); |
21136
7cac4e7458f2
maint: clean up code around calls to current_liboctave_error_handler.
Rik <rik@octave.org>
parents:
21129
diff
changeset
|
1639 Array<double> rz (dim_vector (2 * nc, 1)); |
8336
9813c07ca946
make det take advantage of matrix type
Jaroslav Hajek <highegg@gmail.com>
parents:
8335
diff
changeset
|
1640 double *prz = rz.fortran_vec (); |
9813c07ca946
make det take advantage of matrix type
Jaroslav Hajek <highegg@gmail.com>
parents:
8335
diff
changeset
|
1641 |
21136
7cac4e7458f2
maint: clean up code around calls to current_liboctave_error_handler.
Rik <rik@octave.org>
parents:
21129
diff
changeset
|
1642 F77_XFCN (zgecon, ZGECON, (F77_CONST_CHAR_ARG2 (&job, 1), |
22135
407c66ae1e20
reduce warnings from GCC's link-time optimization feature (bug #48531)
John W. Eaton <jwe@octave.org>
parents:
22133
diff
changeset
|
1643 nc, F77_DBLE_CMPLX_ARG (tmp_data), nr, anorm, |
407c66ae1e20
reduce warnings from GCC's link-time optimization feature (bug #48531)
John W. Eaton <jwe@octave.org>
parents:
22133
diff
changeset
|
1644 rcon, F77_DBLE_CMPLX_ARG (pz), prz, info |
8336
9813c07ca946
make det take advantage of matrix type
Jaroslav Hajek <highegg@gmail.com>
parents:
8335
diff
changeset
|
1645 F77_CHAR_ARG_LEN (1))); |
9813c07ca946
make det take advantage of matrix type
Jaroslav Hajek <highegg@gmail.com>
parents:
8335
diff
changeset
|
1646 } |
21136
7cac4e7458f2
maint: clean up code around calls to current_liboctave_error_handler.
Rik <rik@octave.org>
parents:
21129
diff
changeset
|
1647 |
11586
12df7854fa7c
strip trailing whitespace from source files
John W. Eaton <jwe@octave.org>
parents:
11574
diff
changeset
|
1648 if (info != 0) |
8336
9813c07ca946
make det take advantage of matrix type
Jaroslav Hajek <highegg@gmail.com>
parents:
8335
diff
changeset
|
1649 { |
9813c07ca946
make det take advantage of matrix type
Jaroslav Hajek <highegg@gmail.com>
parents:
8335
diff
changeset
|
1650 info = -1; |
9813c07ca946
make det take advantage of matrix type
Jaroslav Hajek <highegg@gmail.com>
parents:
8335
diff
changeset
|
1651 retval = ComplexDET (); |
11586
12df7854fa7c
strip trailing whitespace from source files
John W. Eaton <jwe@octave.org>
parents:
11574
diff
changeset
|
1652 } |
12df7854fa7c
strip trailing whitespace from source files
John W. Eaton <jwe@octave.org>
parents:
11574
diff
changeset
|
1653 else |
8336
9813c07ca946
make det take advantage of matrix type
Jaroslav Hajek <highegg@gmail.com>
parents:
8335
diff
changeset
|
1654 { |
21136
7cac4e7458f2
maint: clean up code around calls to current_liboctave_error_handler.
Rik <rik@octave.org>
parents:
21129
diff
changeset
|
1655 for (octave_idx_type i = 0; i < nc; i++) |
8336
9813c07ca946
make det take advantage of matrix type
Jaroslav Hajek <highegg@gmail.com>
parents:
8335
diff
changeset
|
1656 { |
21136
7cac4e7458f2
maint: clean up code around calls to current_liboctave_error_handler.
Rik <rik@octave.org>
parents:
21129
diff
changeset
|
1657 Complex c = atmp(i,i); |
7cac4e7458f2
maint: clean up code around calls to current_liboctave_error_handler.
Rik <rik@octave.org>
parents:
21129
diff
changeset
|
1658 retval *= (ipvt(i) != (i+1)) ? -c : c; |
8336
9813c07ca946
make det take advantage of matrix type
Jaroslav Hajek <highegg@gmail.com>
parents:
8335
diff
changeset
|
1659 } |
9813c07ca946
make det take advantage of matrix type
Jaroslav Hajek <highegg@gmail.com>
parents:
8335
diff
changeset
|
1660 } |
9813c07ca946
make det take advantage of matrix type
Jaroslav Hajek <highegg@gmail.com>
parents:
8335
diff
changeset
|
1661 } |
458 | 1662 } |
8336
9813c07ca946
make det take advantage of matrix type
Jaroslav Hajek <highegg@gmail.com>
parents:
8335
diff
changeset
|
1663 |
458 | 1664 return retval; |
1665 } | |
1666 | |
7788 | 1667 double |
1668 ComplexMatrix::rcond (void) const | |
1669 { | |
1670 MatrixType mattype (*this); | |
1671 return rcond (mattype); | |
1672 } | |
1673 | |
1674 double | |
1675 ComplexMatrix::rcond (MatrixType &mattype) const | |
1676 { | |
21723
bae585228161
use namespace for numeric_limits
John W. Eaton <jwe@octave.org>
parents:
21721
diff
changeset
|
1677 double rcon = octave::numeric_limits<double>::NaN (); |
7788 | 1678 octave_idx_type nr = rows (); |
1679 octave_idx_type nc = cols (); | |
1680 | |
1681 if (nr != nc) | |
1682 (*current_liboctave_error_handler) ("matrix must be square"); | |
21136
7cac4e7458f2
maint: clean up code around calls to current_liboctave_error_handler.
Rik <rik@octave.org>
parents:
21129
diff
changeset
|
1683 |
7cac4e7458f2
maint: clean up code around calls to current_liboctave_error_handler.
Rik <rik@octave.org>
parents:
21129
diff
changeset
|
1684 if (nr == 0 || nc == 0) |
21723
bae585228161
use namespace for numeric_limits
John W. Eaton <jwe@octave.org>
parents:
21721
diff
changeset
|
1685 rcon = octave::numeric_limits<double>::Inf (); |
7788 | 1686 else |
1687 { | |
16300
23c5f90f92cd
eliminate some variable might be clobbered by 'longjmp' or 'vfork' warnings
John W. Eaton <jwe@octave.org>
parents:
15448
diff
changeset
|
1688 volatile int typ = mattype.type (); |
7788 | 1689 |
1690 if (typ == MatrixType::Unknown) | |
10314
07ebe522dac2
untabify liboctave C++ sources
John W. Eaton <jwe@octave.org>
parents:
10213
diff
changeset
|
1691 typ = mattype.type (*this); |
7788 | 1692 |
1693 // Only calculate the condition number for LU/Cholesky | |
1694 if (typ == MatrixType::Upper) | |
10314
07ebe522dac2
untabify liboctave C++ sources
John W. Eaton <jwe@octave.org>
parents:
10213
diff
changeset
|
1695 { |
07ebe522dac2
untabify liboctave C++ sources
John W. Eaton <jwe@octave.org>
parents:
10213
diff
changeset
|
1696 const Complex *tmp_data = fortran_vec (); |
07ebe522dac2
untabify liboctave C++ sources
John W. Eaton <jwe@octave.org>
parents:
10213
diff
changeset
|
1697 octave_idx_type info = 0; |
07ebe522dac2
untabify liboctave C++ sources
John W. Eaton <jwe@octave.org>
parents:
10213
diff
changeset
|
1698 char norm = '1'; |
07ebe522dac2
untabify liboctave C++ sources
John W. Eaton <jwe@octave.org>
parents:
10213
diff
changeset
|
1699 char uplo = 'U'; |
07ebe522dac2
untabify liboctave C++ sources
John W. Eaton <jwe@octave.org>
parents:
10213
diff
changeset
|
1700 char dia = 'N'; |
07ebe522dac2
untabify liboctave C++ sources
John W. Eaton <jwe@octave.org>
parents:
10213
diff
changeset
|
1701 |
11570
57632dea2446
attempt better backward compatibility for Array constructors
John W. Eaton <jwe@octave.org>
parents:
11523
diff
changeset
|
1702 Array<Complex> z (dim_vector (2 * nc, 1)); |
10314
07ebe522dac2
untabify liboctave C++ sources
John W. Eaton <jwe@octave.org>
parents:
10213
diff
changeset
|
1703 Complex *pz = z.fortran_vec (); |
11570
57632dea2446
attempt better backward compatibility for Array constructors
John W. Eaton <jwe@octave.org>
parents:
11523
diff
changeset
|
1704 Array<double> rz (dim_vector (nc, 1)); |
10314
07ebe522dac2
untabify liboctave C++ sources
John W. Eaton <jwe@octave.org>
parents:
10213
diff
changeset
|
1705 double *prz = rz.fortran_vec (); |
07ebe522dac2
untabify liboctave C++ sources
John W. Eaton <jwe@octave.org>
parents:
10213
diff
changeset
|
1706 |
11586
12df7854fa7c
strip trailing whitespace from source files
John W. Eaton <jwe@octave.org>
parents:
11574
diff
changeset
|
1707 F77_XFCN (ztrcon, ZTRCON, (F77_CONST_CHAR_ARG2 (&norm, 1), |
12df7854fa7c
strip trailing whitespace from source files
John W. Eaton <jwe@octave.org>
parents:
11574
diff
changeset
|
1708 F77_CONST_CHAR_ARG2 (&uplo, 1), |
12df7854fa7c
strip trailing whitespace from source files
John W. Eaton <jwe@octave.org>
parents:
11574
diff
changeset
|
1709 F77_CONST_CHAR_ARG2 (&dia, 1), |
22135
407c66ae1e20
reduce warnings from GCC's link-time optimization feature (bug #48531)
John W. Eaton <jwe@octave.org>
parents:
22133
diff
changeset
|
1710 nr, F77_CONST_DBLE_CMPLX_ARG (tmp_data), nr, rcon, |
407c66ae1e20
reduce warnings from GCC's link-time optimization feature (bug #48531)
John W. Eaton <jwe@octave.org>
parents:
22133
diff
changeset
|
1711 F77_DBLE_CMPLX_ARG (pz), prz, info |
10314
07ebe522dac2
untabify liboctave C++ sources
John W. Eaton <jwe@octave.org>
parents:
10213
diff
changeset
|
1712 F77_CHAR_ARG_LEN (1) |
07ebe522dac2
untabify liboctave C++ sources
John W. Eaton <jwe@octave.org>
parents:
10213
diff
changeset
|
1713 F77_CHAR_ARG_LEN (1) |
07ebe522dac2
untabify liboctave C++ sources
John W. Eaton <jwe@octave.org>
parents:
10213
diff
changeset
|
1714 F77_CHAR_ARG_LEN (1))); |
07ebe522dac2
untabify liboctave C++ sources
John W. Eaton <jwe@octave.org>
parents:
10213
diff
changeset
|
1715 |
11586
12df7854fa7c
strip trailing whitespace from source files
John W. Eaton <jwe@octave.org>
parents:
11574
diff
changeset
|
1716 if (info != 0) |
10314
07ebe522dac2
untabify liboctave C++ sources
John W. Eaton <jwe@octave.org>
parents:
10213
diff
changeset
|
1717 rcon = 0; |
07ebe522dac2
untabify liboctave C++ sources
John W. Eaton <jwe@octave.org>
parents:
10213
diff
changeset
|
1718 } |
7788 | 1719 else if (typ == MatrixType::Permuted_Upper) |
10314
07ebe522dac2
untabify liboctave C++ sources
John W. Eaton <jwe@octave.org>
parents:
10213
diff
changeset
|
1720 (*current_liboctave_error_handler) |
07ebe522dac2
untabify liboctave C++ sources
John W. Eaton <jwe@octave.org>
parents:
10213
diff
changeset
|
1721 ("permuted triangular matrix not implemented"); |
7788 | 1722 else if (typ == MatrixType::Lower) |
10314
07ebe522dac2
untabify liboctave C++ sources
John W. Eaton <jwe@octave.org>
parents:
10213
diff
changeset
|
1723 { |
07ebe522dac2
untabify liboctave C++ sources
John W. Eaton <jwe@octave.org>
parents:
10213
diff
changeset
|
1724 const Complex *tmp_data = fortran_vec (); |
07ebe522dac2
untabify liboctave C++ sources
John W. Eaton <jwe@octave.org>
parents:
10213
diff
changeset
|
1725 octave_idx_type info = 0; |
07ebe522dac2
untabify liboctave C++ sources
John W. Eaton <jwe@octave.org>
parents:
10213
diff
changeset
|
1726 char norm = '1'; |
07ebe522dac2
untabify liboctave C++ sources
John W. Eaton <jwe@octave.org>
parents:
10213
diff
changeset
|
1727 char uplo = 'L'; |
07ebe522dac2
untabify liboctave C++ sources
John W. Eaton <jwe@octave.org>
parents:
10213
diff
changeset
|
1728 char dia = 'N'; |
07ebe522dac2
untabify liboctave C++ sources
John W. Eaton <jwe@octave.org>
parents:
10213
diff
changeset
|
1729 |
11570
57632dea2446
attempt better backward compatibility for Array constructors
John W. Eaton <jwe@octave.org>
parents:
11523
diff
changeset
|
1730 Array<Complex> z (dim_vector (2 * nc, 1)); |
10314
07ebe522dac2
untabify liboctave C++ sources
John W. Eaton <jwe@octave.org>
parents:
10213
diff
changeset
|
1731 Complex *pz = z.fortran_vec (); |
11570
57632dea2446
attempt better backward compatibility for Array constructors
John W. Eaton <jwe@octave.org>
parents:
11523
diff
changeset
|
1732 Array<double> rz (dim_vector (nc, 1)); |
10314
07ebe522dac2
untabify liboctave C++ sources
John W. Eaton <jwe@octave.org>
parents:
10213
diff
changeset
|
1733 double *prz = rz.fortran_vec (); |
07ebe522dac2
untabify liboctave C++ sources
John W. Eaton <jwe@octave.org>
parents:
10213
diff
changeset
|
1734 |
11586
12df7854fa7c
strip trailing whitespace from source files
John W. Eaton <jwe@octave.org>
parents:
11574
diff
changeset
|
1735 F77_XFCN (ztrcon, ZTRCON, (F77_CONST_CHAR_ARG2 (&norm, 1), |
12df7854fa7c
strip trailing whitespace from source files
John W. Eaton <jwe@octave.org>
parents:
11574
diff
changeset
|
1736 F77_CONST_CHAR_ARG2 (&uplo, 1), |
12df7854fa7c
strip trailing whitespace from source files
John W. Eaton <jwe@octave.org>
parents:
11574
diff
changeset
|
1737 F77_CONST_CHAR_ARG2 (&dia, 1), |
22135
407c66ae1e20
reduce warnings from GCC's link-time optimization feature (bug #48531)
John W. Eaton <jwe@octave.org>
parents:
22133
diff
changeset
|
1738 nr, F77_CONST_DBLE_CMPLX_ARG (tmp_data), nr, rcon, |
407c66ae1e20
reduce warnings from GCC's link-time optimization feature (bug #48531)
John W. Eaton <jwe@octave.org>
parents:
22133
diff
changeset
|
1739 F77_DBLE_CMPLX_ARG (pz), prz, info |
10314
07ebe522dac2
untabify liboctave C++ sources
John W. Eaton <jwe@octave.org>
parents:
10213
diff
changeset
|
1740 F77_CHAR_ARG_LEN (1) |
07ebe522dac2
untabify liboctave C++ sources
John W. Eaton <jwe@octave.org>
parents:
10213
diff
changeset
|
1741 F77_CHAR_ARG_LEN (1) |
07ebe522dac2
untabify liboctave C++ sources
John W. Eaton <jwe@octave.org>
parents:
10213
diff
changeset
|
1742 F77_CHAR_ARG_LEN (1))); |
07ebe522dac2
untabify liboctave C++ sources
John W. Eaton <jwe@octave.org>
parents:
10213
diff
changeset
|
1743 |
11586
12df7854fa7c
strip trailing whitespace from source files
John W. Eaton <jwe@octave.org>
parents:
11574
diff
changeset
|
1744 if (info != 0) |
10314
07ebe522dac2
untabify liboctave C++ sources
John W. Eaton <jwe@octave.org>
parents:
10213
diff
changeset
|
1745 rcon = 0.0; |
07ebe522dac2
untabify liboctave C++ sources
John W. Eaton <jwe@octave.org>
parents:
10213
diff
changeset
|
1746 } |
7788 | 1747 else if (typ == MatrixType::Permuted_Lower) |
10314
07ebe522dac2
untabify liboctave C++ sources
John W. Eaton <jwe@octave.org>
parents:
10213
diff
changeset
|
1748 (*current_liboctave_error_handler) |
07ebe522dac2
untabify liboctave C++ sources
John W. Eaton <jwe@octave.org>
parents:
10213
diff
changeset
|
1749 ("permuted triangular matrix not implemented"); |
7788 | 1750 else if (typ == MatrixType::Full || typ == MatrixType::Hermitian) |
10314
07ebe522dac2
untabify liboctave C++ sources
John W. Eaton <jwe@octave.org>
parents:
10213
diff
changeset
|
1751 { |
07ebe522dac2
untabify liboctave C++ sources
John W. Eaton <jwe@octave.org>
parents:
10213
diff
changeset
|
1752 double anorm = -1.0; |
07ebe522dac2
untabify liboctave C++ sources
John W. Eaton <jwe@octave.org>
parents:
10213
diff
changeset
|
1753 |
07ebe522dac2
untabify liboctave C++ sources
John W. Eaton <jwe@octave.org>
parents:
10213
diff
changeset
|
1754 if (typ == MatrixType::Hermitian) |
07ebe522dac2
untabify liboctave C++ sources
John W. Eaton <jwe@octave.org>
parents:
10213
diff
changeset
|
1755 { |
07ebe522dac2
untabify liboctave C++ sources
John W. Eaton <jwe@octave.org>
parents:
10213
diff
changeset
|
1756 octave_idx_type info = 0; |
07ebe522dac2
untabify liboctave C++ sources
John W. Eaton <jwe@octave.org>
parents:
10213
diff
changeset
|
1757 char job = 'L'; |
15382
197774b411ec
rcond: use new copy of data for full factorization if positive definite cholesky factorization fails (bug #37336)
John W. Eaton <jwe@octave.org>
parents:
14138
diff
changeset
|
1758 |
197774b411ec
rcond: use new copy of data for full factorization if positive definite cholesky factorization fails (bug #37336)
John W. Eaton <jwe@octave.org>
parents:
14138
diff
changeset
|
1759 ComplexMatrix atmp = *this; |
197774b411ec
rcond: use new copy of data for full factorization if positive definite cholesky factorization fails (bug #37336)
John W. Eaton <jwe@octave.org>
parents:
14138
diff
changeset
|
1760 Complex *tmp_data = atmp.fortran_vec (); |
197774b411ec
rcond: use new copy of data for full factorization if positive definite cholesky factorization fails (bug #37336)
John W. Eaton <jwe@octave.org>
parents:
14138
diff
changeset
|
1761 |
10314
07ebe522dac2
untabify liboctave C++ sources
John W. Eaton <jwe@octave.org>
parents:
10213
diff
changeset
|
1762 anorm = atmp.abs().sum(). |
17769
49a5a4be04a1
maint: Use GNU style coding conventions for code in liboctave/
Rik <rik@octave.org>
parents:
17744
diff
changeset
|
1763 row(static_cast<octave_idx_type>(0)).max(); |
10314
07ebe522dac2
untabify liboctave C++ sources
John W. Eaton <jwe@octave.org>
parents:
10213
diff
changeset
|
1764 |
11586
12df7854fa7c
strip trailing whitespace from source files
John W. Eaton <jwe@octave.org>
parents:
11574
diff
changeset
|
1765 F77_XFCN (zpotrf, ZPOTRF, (F77_CONST_CHAR_ARG2 (&job, 1), nr, |
22135
407c66ae1e20
reduce warnings from GCC's link-time optimization feature (bug #48531)
John W. Eaton <jwe@octave.org>
parents:
22133
diff
changeset
|
1766 F77_DBLE_CMPLX_ARG (tmp_data), nr, info |
10314
07ebe522dac2
untabify liboctave C++ sources
John W. Eaton <jwe@octave.org>
parents:
10213
diff
changeset
|
1767 F77_CHAR_ARG_LEN (1))); |
07ebe522dac2
untabify liboctave C++ sources
John W. Eaton <jwe@octave.org>
parents:
10213
diff
changeset
|
1768 |
11586
12df7854fa7c
strip trailing whitespace from source files
John W. Eaton <jwe@octave.org>
parents:
11574
diff
changeset
|
1769 if (info != 0) |
10314
07ebe522dac2
untabify liboctave C++ sources
John W. Eaton <jwe@octave.org>
parents:
10213
diff
changeset
|
1770 { |
07ebe522dac2
untabify liboctave C++ sources
John W. Eaton <jwe@octave.org>
parents:
10213
diff
changeset
|
1771 rcon = 0.0; |
07ebe522dac2
untabify liboctave C++ sources
John W. Eaton <jwe@octave.org>
parents:
10213
diff
changeset
|
1772 |
07ebe522dac2
untabify liboctave C++ sources
John W. Eaton <jwe@octave.org>
parents:
10213
diff
changeset
|
1773 mattype.mark_as_unsymmetric (); |
07ebe522dac2
untabify liboctave C++ sources
John W. Eaton <jwe@octave.org>
parents:
10213
diff
changeset
|
1774 typ = MatrixType::Full; |
07ebe522dac2
untabify liboctave C++ sources
John W. Eaton <jwe@octave.org>
parents:
10213
diff
changeset
|
1775 } |
11586
12df7854fa7c
strip trailing whitespace from source files
John W. Eaton <jwe@octave.org>
parents:
11574
diff
changeset
|
1776 else |
10314
07ebe522dac2
untabify liboctave C++ sources
John W. Eaton <jwe@octave.org>
parents:
10213
diff
changeset
|
1777 { |
11570
57632dea2446
attempt better backward compatibility for Array constructors
John W. Eaton <jwe@octave.org>
parents:
11523
diff
changeset
|
1778 Array<Complex> z (dim_vector (2 * nc, 1)); |
10314
07ebe522dac2
untabify liboctave C++ sources
John W. Eaton <jwe@octave.org>
parents:
10213
diff
changeset
|
1779 Complex *pz = z.fortran_vec (); |
11570
57632dea2446
attempt better backward compatibility for Array constructors
John W. Eaton <jwe@octave.org>
parents:
11523
diff
changeset
|
1780 Array<double> rz (dim_vector (nc, 1)); |
10314
07ebe522dac2
untabify liboctave C++ sources
John W. Eaton <jwe@octave.org>
parents:
10213
diff
changeset
|
1781 double *prz = rz.fortran_vec (); |
07ebe522dac2
untabify liboctave C++ sources
John W. Eaton <jwe@octave.org>
parents:
10213
diff
changeset
|
1782 |
07ebe522dac2
untabify liboctave C++ sources
John W. Eaton <jwe@octave.org>
parents:
10213
diff
changeset
|
1783 F77_XFCN (zpocon, ZPOCON, (F77_CONST_CHAR_ARG2 (&job, 1), |
22135
407c66ae1e20
reduce warnings from GCC's link-time optimization feature (bug #48531)
John W. Eaton <jwe@octave.org>
parents:
22133
diff
changeset
|
1784 nr, F77_DBLE_CMPLX_ARG (tmp_data), nr, anorm, |
407c66ae1e20
reduce warnings from GCC's link-time optimization feature (bug #48531)
John W. Eaton <jwe@octave.org>
parents:
22133
diff
changeset
|
1785 rcon, F77_DBLE_CMPLX_ARG (pz), prz, info |
10314
07ebe522dac2
untabify liboctave C++ sources
John W. Eaton <jwe@octave.org>
parents:
10213
diff
changeset
|
1786 F77_CHAR_ARG_LEN (1))); |
07ebe522dac2
untabify liboctave C++ sources
John W. Eaton <jwe@octave.org>
parents:
10213
diff
changeset
|
1787 |
11586
12df7854fa7c
strip trailing whitespace from source files
John W. Eaton <jwe@octave.org>
parents:
11574
diff
changeset
|
1788 if (info != 0) |
10314
07ebe522dac2
untabify liboctave C++ sources
John W. Eaton <jwe@octave.org>
parents:
10213
diff
changeset
|
1789 rcon = 0.0; |
07ebe522dac2
untabify liboctave C++ sources
John W. Eaton <jwe@octave.org>
parents:
10213
diff
changeset
|
1790 } |
07ebe522dac2
untabify liboctave C++ sources
John W. Eaton <jwe@octave.org>
parents:
10213
diff
changeset
|
1791 } |
07ebe522dac2
untabify liboctave C++ sources
John W. Eaton <jwe@octave.org>
parents:
10213
diff
changeset
|
1792 |
07ebe522dac2
untabify liboctave C++ sources
John W. Eaton <jwe@octave.org>
parents:
10213
diff
changeset
|
1793 if (typ == MatrixType::Full) |
07ebe522dac2
untabify liboctave C++ sources
John W. Eaton <jwe@octave.org>
parents:
10213
diff
changeset
|
1794 { |
07ebe522dac2
untabify liboctave C++ sources
John W. Eaton <jwe@octave.org>
parents:
10213
diff
changeset
|
1795 octave_idx_type info = 0; |
07ebe522dac2
untabify liboctave C++ sources
John W. Eaton <jwe@octave.org>
parents:
10213
diff
changeset
|
1796 |
15382
197774b411ec
rcond: use new copy of data for full factorization if positive definite cholesky factorization fails (bug #37336)
John W. Eaton <jwe@octave.org>
parents:
14138
diff
changeset
|
1797 ComplexMatrix atmp = *this; |
197774b411ec
rcond: use new copy of data for full factorization if positive definite cholesky factorization fails (bug #37336)
John W. Eaton <jwe@octave.org>
parents:
14138
diff
changeset
|
1798 Complex *tmp_data = atmp.fortran_vec (); |
197774b411ec
rcond: use new copy of data for full factorization if positive definite cholesky factorization fails (bug #37336)
John W. Eaton <jwe@octave.org>
parents:
14138
diff
changeset
|
1799 |
11570
57632dea2446
attempt better backward compatibility for Array constructors
John W. Eaton <jwe@octave.org>
parents:
11523
diff
changeset
|
1800 Array<octave_idx_type> ipvt (dim_vector (nr, 1)); |
10314
07ebe522dac2
untabify liboctave C++ sources
John W. Eaton <jwe@octave.org>
parents:
10213
diff
changeset
|
1801 octave_idx_type *pipvt = ipvt.fortran_vec (); |
07ebe522dac2
untabify liboctave C++ sources
John W. Eaton <jwe@octave.org>
parents:
10213
diff
changeset
|
1802 |
15018
3d8ace26c5b4
maint: Use Octave coding conventions for cuddled parentheses in liboctave/.
Rik <rik@octave.org>
parents:
14846
diff
changeset
|
1803 if (anorm < 0.) |
14846
460a3c6d8bf1
maint: Use Octave coding convention for cuddled parenthis in function calls with empty argument lists.
Rik <octave@nomad.inbox5.com>
parents:
14557
diff
changeset
|
1804 anorm = atmp.abs ().sum (). |
17769
49a5a4be04a1
maint: Use GNU style coding conventions for code in liboctave/
Rik <rik@octave.org>
parents:
17744
diff
changeset
|
1805 row(static_cast<octave_idx_type>(0)).max (); |
10314
07ebe522dac2
untabify liboctave C++ sources
John W. Eaton <jwe@octave.org>
parents:
10213
diff
changeset
|
1806 |
11570
57632dea2446
attempt better backward compatibility for Array constructors
John W. Eaton <jwe@octave.org>
parents:
11523
diff
changeset
|
1807 Array<Complex> z (dim_vector (2 * nc, 1)); |
10314
07ebe522dac2
untabify liboctave C++ sources
John W. Eaton <jwe@octave.org>
parents:
10213
diff
changeset
|
1808 Complex *pz = z.fortran_vec (); |
11570
57632dea2446
attempt better backward compatibility for Array constructors
John W. Eaton <jwe@octave.org>
parents:
11523
diff
changeset
|
1809 Array<double> rz (dim_vector (2 * nc, 1)); |
10314
07ebe522dac2
untabify liboctave C++ sources
John W. Eaton <jwe@octave.org>
parents:
10213
diff
changeset
|
1810 double *prz = rz.fortran_vec (); |
07ebe522dac2
untabify liboctave C++ sources
John W. Eaton <jwe@octave.org>
parents:
10213
diff
changeset
|
1811 |
20598
ffc6cdcd02c5
Fix segfault when complex double matrix calls ZGETRF (bug #45577).
Rik <rik@octave.org>
parents:
19864
diff
changeset
|
1812 // Work around bug #45577, LAPACK crashes Octave if norm is NaN |
21782
2aef506f3fec
use namespace for lo-mappers.h functions
John W. Eaton <jwe@octave.org>
parents:
21751
diff
changeset
|
1813 if (octave::math::isnan (anorm)) |
20598
ffc6cdcd02c5
Fix segfault when complex double matrix calls ZGETRF (bug #45577).
Rik <rik@octave.org>
parents:
19864
diff
changeset
|
1814 info = -1; |
ffc6cdcd02c5
Fix segfault when complex double matrix calls ZGETRF (bug #45577).
Rik <rik@octave.org>
parents:
19864
diff
changeset
|
1815 else |
22135
407c66ae1e20
reduce warnings from GCC's link-time optimization feature (bug #48531)
John W. Eaton <jwe@octave.org>
parents:
22133
diff
changeset
|
1816 F77_XFCN (zgetrf, ZGETRF, (nr, nr, F77_DBLE_CMPLX_ARG (tmp_data), nr, pipvt, info)); |
10314
07ebe522dac2
untabify liboctave C++ sources
John W. Eaton <jwe@octave.org>
parents:
10213
diff
changeset
|
1817 |
11586
12df7854fa7c
strip trailing whitespace from source files
John W. Eaton <jwe@octave.org>
parents:
11574
diff
changeset
|
1818 if (info != 0) |
12df7854fa7c
strip trailing whitespace from source files
John W. Eaton <jwe@octave.org>
parents:
11574
diff
changeset
|
1819 { |
10314
07ebe522dac2
untabify liboctave C++ sources
John W. Eaton <jwe@octave.org>
parents:
10213
diff
changeset
|
1820 rcon = 0.0; |
07ebe522dac2
untabify liboctave C++ sources
John W. Eaton <jwe@octave.org>
parents:
10213
diff
changeset
|
1821 mattype.mark_as_rectangular (); |
11586
12df7854fa7c
strip trailing whitespace from source files
John W. Eaton <jwe@octave.org>
parents:
11574
diff
changeset
|
1822 } |
12df7854fa7c
strip trailing whitespace from source files
John W. Eaton <jwe@octave.org>
parents:
11574
diff
changeset
|
1823 else |
10314
07ebe522dac2
untabify liboctave C++ sources
John W. Eaton <jwe@octave.org>
parents:
10213
diff
changeset
|
1824 { |
07ebe522dac2
untabify liboctave C++ sources
John W. Eaton <jwe@octave.org>
parents:
10213
diff
changeset
|
1825 char job = '1'; |
07ebe522dac2
untabify liboctave C++ sources
John W. Eaton <jwe@octave.org>
parents:
10213
diff
changeset
|
1826 F77_XFCN (zgecon, ZGECON, (F77_CONST_CHAR_ARG2 (&job, 1), |
22135
407c66ae1e20
reduce warnings from GCC's link-time optimization feature (bug #48531)
John W. Eaton <jwe@octave.org>
parents:
22133
diff
changeset
|
1827 nc, F77_DBLE_CMPLX_ARG (tmp_data), nr, anorm, |
407c66ae1e20
reduce warnings from GCC's link-time optimization feature (bug #48531)
John W. Eaton <jwe@octave.org>
parents:
22133
diff
changeset
|
1828 rcon, F77_DBLE_CMPLX_ARG (pz), prz, info |
10314
07ebe522dac2
untabify liboctave C++ sources
John W. Eaton <jwe@octave.org>
parents:
10213
diff
changeset
|
1829 F77_CHAR_ARG_LEN (1))); |
07ebe522dac2
untabify liboctave C++ sources
John W. Eaton <jwe@octave.org>
parents:
10213
diff
changeset
|
1830 |
11586
12df7854fa7c
strip trailing whitespace from source files
John W. Eaton <jwe@octave.org>
parents:
11574
diff
changeset
|
1831 if (info != 0) |
10314
07ebe522dac2
untabify liboctave C++ sources
John W. Eaton <jwe@octave.org>
parents:
10213
diff
changeset
|
1832 rcon = 0.0; |
07ebe522dac2
untabify liboctave C++ sources
John W. Eaton <jwe@octave.org>
parents:
10213
diff
changeset
|
1833 } |
07ebe522dac2
untabify liboctave C++ sources
John W. Eaton <jwe@octave.org>
parents:
10213
diff
changeset
|
1834 } |
07ebe522dac2
untabify liboctave C++ sources
John W. Eaton <jwe@octave.org>
parents:
10213
diff
changeset
|
1835 } |
7788 | 1836 else |
10314
07ebe522dac2
untabify liboctave C++ sources
John W. Eaton <jwe@octave.org>
parents:
10213
diff
changeset
|
1837 rcon = 0.0; |
7788 | 1838 } |
1839 | |
1840 return rcon; | |
1841 } | |
1842 | |
458 | 1843 ComplexMatrix |
11586
12df7854fa7c
strip trailing whitespace from source files
John W. Eaton <jwe@octave.org>
parents:
11574
diff
changeset
|
1844 ComplexMatrix::utsolve (MatrixType &mattype, const ComplexMatrix& b, |
12df7854fa7c
strip trailing whitespace from source files
John W. Eaton <jwe@octave.org>
parents:
11574
diff
changeset
|
1845 octave_idx_type& info, double& rcon, |
10314
07ebe522dac2
untabify liboctave C++ sources
John W. Eaton <jwe@octave.org>
parents:
10213
diff
changeset
|
1846 solve_singularity_handler sing_handler, |
07ebe522dac2
untabify liboctave C++ sources
John W. Eaton <jwe@octave.org>
parents:
10213
diff
changeset
|
1847 bool calc_cond, blas_trans_type transt) const |
5785 | 1848 { |
1849 ComplexMatrix retval; | |
1850 | |
1851 octave_idx_type nr = rows (); | |
1852 octave_idx_type nc = cols (); | |
1853 | |
6924 | 1854 if (nr != b.rows ()) |
5785 | 1855 (*current_liboctave_error_handler) |
1856 ("matrix dimension mismatch solution of linear equations"); | |
21136
7cac4e7458f2
maint: clean up code around calls to current_liboctave_error_handler.
Rik <rik@octave.org>
parents:
21129
diff
changeset
|
1857 |
7cac4e7458f2
maint: clean up code around calls to current_liboctave_error_handler.
Rik <rik@octave.org>
parents:
21129
diff
changeset
|
1858 if (nr == 0 || nc == 0 || b.cols () == 0) |
6924 | 1859 retval = ComplexMatrix (nc, b.cols (), Complex (0.0, 0.0)); |
5785 | 1860 else |
1861 { | |
1862 volatile int typ = mattype.type (); | |
1863 | |
21136
7cac4e7458f2
maint: clean up code around calls to current_liboctave_error_handler.
Rik <rik@octave.org>
parents:
21129
diff
changeset
|
1864 if (typ != MatrixType::Permuted_Upper && typ != MatrixType::Upper) |
7cac4e7458f2
maint: clean up code around calls to current_liboctave_error_handler.
Rik <rik@octave.org>
parents:
21129
diff
changeset
|
1865 (*current_liboctave_error_handler) ("incorrect matrix type"); |
7cac4e7458f2
maint: clean up code around calls to current_liboctave_error_handler.
Rik <rik@octave.org>
parents:
21129
diff
changeset
|
1866 |
7cac4e7458f2
maint: clean up code around calls to current_liboctave_error_handler.
Rik <rik@octave.org>
parents:
21129
diff
changeset
|
1867 octave_idx_type b_nc = b.cols (); |
7cac4e7458f2
maint: clean up code around calls to current_liboctave_error_handler.
Rik <rik@octave.org>
parents:
21129
diff
changeset
|
1868 rcon = 1.; |
7cac4e7458f2
maint: clean up code around calls to current_liboctave_error_handler.
Rik <rik@octave.org>
parents:
21129
diff
changeset
|
1869 info = 0; |
7cac4e7458f2
maint: clean up code around calls to current_liboctave_error_handler.
Rik <rik@octave.org>
parents:
21129
diff
changeset
|
1870 |
7cac4e7458f2
maint: clean up code around calls to current_liboctave_error_handler.
Rik <rik@octave.org>
parents:
21129
diff
changeset
|
1871 if (typ == MatrixType::Permuted_Upper) |
7cac4e7458f2
maint: clean up code around calls to current_liboctave_error_handler.
Rik <rik@octave.org>
parents:
21129
diff
changeset
|
1872 (*current_liboctave_error_handler) |
7cac4e7458f2
maint: clean up code around calls to current_liboctave_error_handler.
Rik <rik@octave.org>
parents:
21129
diff
changeset
|
1873 ("permuted triangular matrix not implemented"); |
7cac4e7458f2
maint: clean up code around calls to current_liboctave_error_handler.
Rik <rik@octave.org>
parents:
21129
diff
changeset
|
1874 |
7cac4e7458f2
maint: clean up code around calls to current_liboctave_error_handler.
Rik <rik@octave.org>
parents:
21129
diff
changeset
|
1875 const Complex *tmp_data = fortran_vec (); |
7cac4e7458f2
maint: clean up code around calls to current_liboctave_error_handler.
Rik <rik@octave.org>
parents:
21129
diff
changeset
|
1876 |
7cac4e7458f2
maint: clean up code around calls to current_liboctave_error_handler.
Rik <rik@octave.org>
parents:
21129
diff
changeset
|
1877 retval = b; |
7cac4e7458f2
maint: clean up code around calls to current_liboctave_error_handler.
Rik <rik@octave.org>
parents:
21129
diff
changeset
|
1878 Complex *result = retval.fortran_vec (); |
7cac4e7458f2
maint: clean up code around calls to current_liboctave_error_handler.
Rik <rik@octave.org>
parents:
21129
diff
changeset
|
1879 |
7cac4e7458f2
maint: clean up code around calls to current_liboctave_error_handler.
Rik <rik@octave.org>
parents:
21129
diff
changeset
|
1880 char uplo = 'U'; |
7cac4e7458f2
maint: clean up code around calls to current_liboctave_error_handler.
Rik <rik@octave.org>
parents:
21129
diff
changeset
|
1881 char trans = get_blas_char (transt); |
7cac4e7458f2
maint: clean up code around calls to current_liboctave_error_handler.
Rik <rik@octave.org>
parents:
21129
diff
changeset
|
1882 char dia = 'N'; |
7cac4e7458f2
maint: clean up code around calls to current_liboctave_error_handler.
Rik <rik@octave.org>
parents:
21129
diff
changeset
|
1883 |
7cac4e7458f2
maint: clean up code around calls to current_liboctave_error_handler.
Rik <rik@octave.org>
parents:
21129
diff
changeset
|
1884 F77_XFCN (ztrtrs, ZTRTRS, (F77_CONST_CHAR_ARG2 (&uplo, 1), |
7cac4e7458f2
maint: clean up code around calls to current_liboctave_error_handler.
Rik <rik@octave.org>
parents:
21129
diff
changeset
|
1885 F77_CONST_CHAR_ARG2 (&trans, 1), |
7cac4e7458f2
maint: clean up code around calls to current_liboctave_error_handler.
Rik <rik@octave.org>
parents:
21129
diff
changeset
|
1886 F77_CONST_CHAR_ARG2 (&dia, 1), |
22135
407c66ae1e20
reduce warnings from GCC's link-time optimization feature (bug #48531)
John W. Eaton <jwe@octave.org>
parents:
22133
diff
changeset
|
1887 nr, b_nc, F77_CONST_DBLE_CMPLX_ARG (tmp_data), nr, |
407c66ae1e20
reduce warnings from GCC's link-time optimization feature (bug #48531)
John W. Eaton <jwe@octave.org>
parents:
22133
diff
changeset
|
1888 F77_DBLE_CMPLX_ARG (result), nr, info |
21136
7cac4e7458f2
maint: clean up code around calls to current_liboctave_error_handler.
Rik <rik@octave.org>
parents:
21129
diff
changeset
|
1889 F77_CHAR_ARG_LEN (1) |
7cac4e7458f2
maint: clean up code around calls to current_liboctave_error_handler.
Rik <rik@octave.org>
parents:
21129
diff
changeset
|
1890 F77_CHAR_ARG_LEN (1) |
7cac4e7458f2
maint: clean up code around calls to current_liboctave_error_handler.
Rik <rik@octave.org>
parents:
21129
diff
changeset
|
1891 F77_CHAR_ARG_LEN (1))); |
7cac4e7458f2
maint: clean up code around calls to current_liboctave_error_handler.
Rik <rik@octave.org>
parents:
21129
diff
changeset
|
1892 |
7cac4e7458f2
maint: clean up code around calls to current_liboctave_error_handler.
Rik <rik@octave.org>
parents:
21129
diff
changeset
|
1893 if (calc_cond) |
10314
07ebe522dac2
untabify liboctave C++ sources
John W. Eaton <jwe@octave.org>
parents:
10213
diff
changeset
|
1894 { |
21136
7cac4e7458f2
maint: clean up code around calls to current_liboctave_error_handler.
Rik <rik@octave.org>
parents:
21129
diff
changeset
|
1895 char norm = '1'; |
7cac4e7458f2
maint: clean up code around calls to current_liboctave_error_handler.
Rik <rik@octave.org>
parents:
21129
diff
changeset
|
1896 uplo = 'U'; |
7cac4e7458f2
maint: clean up code around calls to current_liboctave_error_handler.
Rik <rik@octave.org>
parents:
21129
diff
changeset
|
1897 dia = 'N'; |
7cac4e7458f2
maint: clean up code around calls to current_liboctave_error_handler.
Rik <rik@octave.org>
parents:
21129
diff
changeset
|
1898 |
7cac4e7458f2
maint: clean up code around calls to current_liboctave_error_handler.
Rik <rik@octave.org>
parents:
21129
diff
changeset
|
1899 Array<Complex> z (dim_vector (2 * nc, 1)); |
7cac4e7458f2
maint: clean up code around calls to current_liboctave_error_handler.
Rik <rik@octave.org>
parents:
21129
diff
changeset
|
1900 Complex *pz = z.fortran_vec (); |
7cac4e7458f2
maint: clean up code around calls to current_liboctave_error_handler.
Rik <rik@octave.org>
parents:
21129
diff
changeset
|
1901 Array<double> rz (dim_vector (nc, 1)); |
7cac4e7458f2
maint: clean up code around calls to current_liboctave_error_handler.
Rik <rik@octave.org>
parents:
21129
diff
changeset
|
1902 double *prz = rz.fortran_vec (); |
7cac4e7458f2
maint: clean up code around calls to current_liboctave_error_handler.
Rik <rik@octave.org>
parents:
21129
diff
changeset
|
1903 |
7cac4e7458f2
maint: clean up code around calls to current_liboctave_error_handler.
Rik <rik@octave.org>
parents:
21129
diff
changeset
|
1904 F77_XFCN (ztrcon, ZTRCON, (F77_CONST_CHAR_ARG2 (&norm, 1), |
7cac4e7458f2
maint: clean up code around calls to current_liboctave_error_handler.
Rik <rik@octave.org>
parents:
21129
diff
changeset
|
1905 F77_CONST_CHAR_ARG2 (&uplo, 1), |
7cac4e7458f2
maint: clean up code around calls to current_liboctave_error_handler.
Rik <rik@octave.org>
parents:
21129
diff
changeset
|
1906 F77_CONST_CHAR_ARG2 (&dia, 1), |
22135
407c66ae1e20
reduce warnings from GCC's link-time optimization feature (bug #48531)
John W. Eaton <jwe@octave.org>
parents:
22133
diff
changeset
|
1907 nr, F77_CONST_DBLE_CMPLX_ARG (tmp_data), nr, rcon, |
407c66ae1e20
reduce warnings from GCC's link-time optimization feature (bug #48531)
John W. Eaton <jwe@octave.org>
parents:
22133
diff
changeset
|
1908 F77_DBLE_CMPLX_ARG (pz), prz, info |
21136
7cac4e7458f2
maint: clean up code around calls to current_liboctave_error_handler.
Rik <rik@octave.org>
parents:
21129
diff
changeset
|
1909 F77_CHAR_ARG_LEN (1) |
7cac4e7458f2
maint: clean up code around calls to current_liboctave_error_handler.
Rik <rik@octave.org>
parents:
21129
diff
changeset
|
1910 F77_CHAR_ARG_LEN (1) |
7cac4e7458f2
maint: clean up code around calls to current_liboctave_error_handler.
Rik <rik@octave.org>
parents:
21129
diff
changeset
|
1911 F77_CHAR_ARG_LEN (1))); |
7cac4e7458f2
maint: clean up code around calls to current_liboctave_error_handler.
Rik <rik@octave.org>
parents:
21129
diff
changeset
|
1912 |
7cac4e7458f2
maint: clean up code around calls to current_liboctave_error_handler.
Rik <rik@octave.org>
parents:
21129
diff
changeset
|
1913 if (info != 0) |
7cac4e7458f2
maint: clean up code around calls to current_liboctave_error_handler.
Rik <rik@octave.org>
parents:
21129
diff
changeset
|
1914 info = -2; |
7cac4e7458f2
maint: clean up code around calls to current_liboctave_error_handler.
Rik <rik@octave.org>
parents:
21129
diff
changeset
|
1915 |
7cac4e7458f2
maint: clean up code around calls to current_liboctave_error_handler.
Rik <rik@octave.org>
parents:
21129
diff
changeset
|
1916 volatile double rcond_plus_one = rcon + 1.0; |
7cac4e7458f2
maint: clean up code around calls to current_liboctave_error_handler.
Rik <rik@octave.org>
parents:
21129
diff
changeset
|
1917 |
21782
2aef506f3fec
use namespace for lo-mappers.h functions
John W. Eaton <jwe@octave.org>
parents:
21751
diff
changeset
|
1918 if (rcond_plus_one == 1.0 || octave::math::isnan (rcon)) |
10314
07ebe522dac2
untabify liboctave C++ sources
John W. Eaton <jwe@octave.org>
parents:
10213
diff
changeset
|
1919 { |
21136
7cac4e7458f2
maint: clean up code around calls to current_liboctave_error_handler.
Rik <rik@octave.org>
parents:
21129
diff
changeset
|
1920 info = -2; |
7cac4e7458f2
maint: clean up code around calls to current_liboctave_error_handler.
Rik <rik@octave.org>
parents:
21129
diff
changeset
|
1921 |
7cac4e7458f2
maint: clean up code around calls to current_liboctave_error_handler.
Rik <rik@octave.org>
parents:
21129
diff
changeset
|
1922 if (sing_handler) |
7cac4e7458f2
maint: clean up code around calls to current_liboctave_error_handler.
Rik <rik@octave.org>
parents:
21129
diff
changeset
|
1923 sing_handler (rcon); |
7cac4e7458f2
maint: clean up code around calls to current_liboctave_error_handler.
Rik <rik@octave.org>
parents:
21129
diff
changeset
|
1924 else |
7cac4e7458f2
maint: clean up code around calls to current_liboctave_error_handler.
Rik <rik@octave.org>
parents:
21129
diff
changeset
|
1925 warn_singular_matrix (rcon); |
10314
07ebe522dac2
untabify liboctave C++ sources
John W. Eaton <jwe@octave.org>
parents:
10213
diff
changeset
|
1926 } |
07ebe522dac2
untabify liboctave C++ sources
John W. Eaton <jwe@octave.org>
parents:
10213
diff
changeset
|
1927 } |
5785 | 1928 } |
1929 | |
1930 return retval; | |
1931 } | |
1932 | |
1933 ComplexMatrix | |
11586
12df7854fa7c
strip trailing whitespace from source files
John W. Eaton <jwe@octave.org>
parents:
11574
diff
changeset
|
1934 ComplexMatrix::ltsolve (MatrixType &mattype, const ComplexMatrix& b, |
12df7854fa7c
strip trailing whitespace from source files
John W. Eaton <jwe@octave.org>
parents:
11574
diff
changeset
|
1935 octave_idx_type& info, double& rcon, |
10314
07ebe522dac2
untabify liboctave C++ sources
John W. Eaton <jwe@octave.org>
parents:
10213
diff
changeset
|
1936 solve_singularity_handler sing_handler, |
07ebe522dac2
untabify liboctave C++ sources
John W. Eaton <jwe@octave.org>
parents:
10213
diff
changeset
|
1937 bool calc_cond, blas_trans_type transt) const |
5785 | 1938 { |
1939 ComplexMatrix retval; | |
1940 | |
1941 octave_idx_type nr = rows (); | |
1942 octave_idx_type nc = cols (); | |
1943 | |
6924 | 1944 if (nr != b.rows ()) |
5785 | 1945 (*current_liboctave_error_handler) |
1946 ("matrix dimension mismatch solution of linear equations"); | |
21136
7cac4e7458f2
maint: clean up code around calls to current_liboctave_error_handler.
Rik <rik@octave.org>
parents:
21129
diff
changeset
|
1947 |
7cac4e7458f2
maint: clean up code around calls to current_liboctave_error_handler.
Rik <rik@octave.org>
parents:
21129
diff
changeset
|
1948 if (nr == 0 || nc == 0 || b.cols () == 0) |
6924 | 1949 retval = ComplexMatrix (nc, b.cols (), Complex (0.0, 0.0)); |
5785 | 1950 else |
1951 { | |
1952 volatile int typ = mattype.type (); | |
1953 | |
21136
7cac4e7458f2
maint: clean up code around calls to current_liboctave_error_handler.
Rik <rik@octave.org>
parents:
21129
diff
changeset
|
1954 if (typ != MatrixType::Permuted_Lower && typ != MatrixType::Lower) |
7cac4e7458f2
maint: clean up code around calls to current_liboctave_error_handler.
Rik <rik@octave.org>
parents:
21129
diff
changeset
|
1955 (*current_liboctave_error_handler) ("incorrect matrix type"); |
7cac4e7458f2
maint: clean up code around calls to current_liboctave_error_handler.
Rik <rik@octave.org>
parents:
21129
diff
changeset
|
1956 |
7cac4e7458f2
maint: clean up code around calls to current_liboctave_error_handler.
Rik <rik@octave.org>
parents:
21129
diff
changeset
|
1957 octave_idx_type b_nc = b.cols (); |
7cac4e7458f2
maint: clean up code around calls to current_liboctave_error_handler.
Rik <rik@octave.org>
parents:
21129
diff
changeset
|
1958 rcon = 1.; |
7cac4e7458f2
maint: clean up code around calls to current_liboctave_error_handler.
Rik <rik@octave.org>
parents:
21129
diff
changeset
|
1959 info = 0; |
7cac4e7458f2
maint: clean up code around calls to current_liboctave_error_handler.
Rik <rik@octave.org>
parents:
21129
diff
changeset
|
1960 |
7cac4e7458f2
maint: clean up code around calls to current_liboctave_error_handler.
Rik <rik@octave.org>
parents:
21129
diff
changeset
|
1961 if (typ == MatrixType::Permuted_Lower) |
7cac4e7458f2
maint: clean up code around calls to current_liboctave_error_handler.
Rik <rik@octave.org>
parents:
21129
diff
changeset
|
1962 (*current_liboctave_error_handler) |
7cac4e7458f2
maint: clean up code around calls to current_liboctave_error_handler.
Rik <rik@octave.org>
parents:
21129
diff
changeset
|
1963 ("permuted triangular matrix not implemented"); |
7cac4e7458f2
maint: clean up code around calls to current_liboctave_error_handler.
Rik <rik@octave.org>
parents:
21129
diff
changeset
|
1964 |
7cac4e7458f2
maint: clean up code around calls to current_liboctave_error_handler.
Rik <rik@octave.org>
parents:
21129
diff
changeset
|
1965 const Complex *tmp_data = fortran_vec (); |
7cac4e7458f2
maint: clean up code around calls to current_liboctave_error_handler.
Rik <rik@octave.org>
parents:
21129
diff
changeset
|
1966 |
7cac4e7458f2
maint: clean up code around calls to current_liboctave_error_handler.
Rik <rik@octave.org>
parents:
21129
diff
changeset
|
1967 retval = b; |
7cac4e7458f2
maint: clean up code around calls to current_liboctave_error_handler.
Rik <rik@octave.org>
parents:
21129
diff
changeset
|
1968 Complex *result = retval.fortran_vec (); |
7cac4e7458f2
maint: clean up code around calls to current_liboctave_error_handler.
Rik <rik@octave.org>
parents:
21129
diff
changeset
|
1969 |
7cac4e7458f2
maint: clean up code around calls to current_liboctave_error_handler.
Rik <rik@octave.org>
parents:
21129
diff
changeset
|
1970 char uplo = 'L'; |
7cac4e7458f2
maint: clean up code around calls to current_liboctave_error_handler.
Rik <rik@octave.org>
parents:
21129
diff
changeset
|
1971 char trans = get_blas_char (transt); |
7cac4e7458f2
maint: clean up code around calls to current_liboctave_error_handler.
Rik <rik@octave.org>
parents:
21129
diff
changeset
|
1972 char dia = 'N'; |
7cac4e7458f2
maint: clean up code around calls to current_liboctave_error_handler.
Rik <rik@octave.org>
parents:
21129
diff
changeset
|
1973 |
7cac4e7458f2
maint: clean up code around calls to current_liboctave_error_handler.
Rik <rik@octave.org>
parents:
21129
diff
changeset
|
1974 F77_XFCN (ztrtrs, ZTRTRS, (F77_CONST_CHAR_ARG2 (&uplo, 1), |
7cac4e7458f2
maint: clean up code around calls to current_liboctave_error_handler.
Rik <rik@octave.org>
parents:
21129
diff
changeset
|
1975 F77_CONST_CHAR_ARG2 (&trans, 1), |
7cac4e7458f2
maint: clean up code around calls to current_liboctave_error_handler.
Rik <rik@octave.org>
parents:
21129
diff
changeset
|
1976 F77_CONST_CHAR_ARG2 (&dia, 1), |
22135
407c66ae1e20
reduce warnings from GCC's link-time optimization feature (bug #48531)
John W. Eaton <jwe@octave.org>
parents:
22133
diff
changeset
|
1977 nr, b_nc, F77_CONST_DBLE_CMPLX_ARG (tmp_data), nr, |
407c66ae1e20
reduce warnings from GCC's link-time optimization feature (bug #48531)
John W. Eaton <jwe@octave.org>
parents:
22133
diff
changeset
|
1978 F77_DBLE_CMPLX_ARG (result), nr, info |
21136
7cac4e7458f2
maint: clean up code around calls to current_liboctave_error_handler.
Rik <rik@octave.org>
parents:
21129
diff
changeset
|
1979 F77_CHAR_ARG_LEN (1) |
7cac4e7458f2
maint: clean up code around calls to current_liboctave_error_handler.
Rik <rik@octave.org>
parents:
21129
diff
changeset
|
1980 F77_CHAR_ARG_LEN (1) |
7cac4e7458f2
maint: clean up code around calls to current_liboctave_error_handler.
Rik <rik@octave.org>
parents:
21129
diff
changeset
|
1981 F77_CHAR_ARG_LEN (1))); |
7cac4e7458f2
maint: clean up code around calls to current_liboctave_error_handler.
Rik <rik@octave.org>
parents:
21129
diff
changeset
|
1982 |
7cac4e7458f2
maint: clean up code around calls to current_liboctave_error_handler.
Rik <rik@octave.org>
parents:
21129
diff
changeset
|
1983 if (calc_cond) |
10314
07ebe522dac2
untabify liboctave C++ sources
John W. Eaton <jwe@octave.org>
parents:
10213
diff
changeset
|
1984 { |
21136
7cac4e7458f2
maint: clean up code around calls to current_liboctave_error_handler.
Rik <rik@octave.org>
parents:
21129
diff
changeset
|
1985 char norm = '1'; |
7cac4e7458f2
maint: clean up code around calls to current_liboctave_error_handler.
Rik <rik@octave.org>
parents:
21129
diff
changeset
|
1986 uplo = 'L'; |
7cac4e7458f2
maint: clean up code around calls to current_liboctave_error_handler.
Rik <rik@octave.org>
parents:
21129
diff
changeset
|
1987 dia = 'N'; |
7cac4e7458f2
maint: clean up code around calls to current_liboctave_error_handler.
Rik <rik@octave.org>
parents:
21129
diff
changeset
|
1988 |
7cac4e7458f2
maint: clean up code around calls to current_liboctave_error_handler.
Rik <rik@octave.org>
parents:
21129
diff
changeset
|
1989 Array<Complex> z (dim_vector (2 * nc, 1)); |
7cac4e7458f2
maint: clean up code around calls to current_liboctave_error_handler.
Rik <rik@octave.org>
parents:
21129
diff
changeset
|
1990 Complex *pz = z.fortran_vec (); |
7cac4e7458f2
maint: clean up code around calls to current_liboctave_error_handler.
Rik <rik@octave.org>
parents:
21129
diff
changeset
|
1991 Array<double> rz (dim_vector (nc, 1)); |
7cac4e7458f2
maint: clean up code around calls to current_liboctave_error_handler.
Rik <rik@octave.org>
parents:
21129
diff
changeset
|
1992 double *prz = rz.fortran_vec (); |
7cac4e7458f2
maint: clean up code around calls to current_liboctave_error_handler.
Rik <rik@octave.org>
parents:
21129
diff
changeset
|
1993 |
7cac4e7458f2
maint: clean up code around calls to current_liboctave_error_handler.
Rik <rik@octave.org>
parents:
21129
diff
changeset
|
1994 F77_XFCN (ztrcon, ZTRCON, (F77_CONST_CHAR_ARG2 (&norm, 1), |
7cac4e7458f2
maint: clean up code around calls to current_liboctave_error_handler.
Rik <rik@octave.org>
parents:
21129
diff
changeset
|
1995 F77_CONST_CHAR_ARG2 (&uplo, 1), |
7cac4e7458f2
maint: clean up code around calls to current_liboctave_error_handler.
Rik <rik@octave.org>
parents:
21129
diff
changeset
|
1996 F77_CONST_CHAR_ARG2 (&dia, 1), |
22135
407c66ae1e20
reduce warnings from GCC's link-time optimization feature (bug #48531)
John W. Eaton <jwe@octave.org>
parents:
22133
diff
changeset
|
1997 nr, F77_CONST_DBLE_CMPLX_ARG (tmp_data), nr, rcon, |
407c66ae1e20
reduce warnings from GCC's link-time optimization feature (bug #48531)
John W. Eaton <jwe@octave.org>
parents:
22133
diff
changeset
|
1998 F77_DBLE_CMPLX_ARG (pz), prz, info |
21136
7cac4e7458f2
maint: clean up code around calls to current_liboctave_error_handler.
Rik <rik@octave.org>
parents:
21129
diff
changeset
|
1999 F77_CHAR_ARG_LEN (1) |
7cac4e7458f2
maint: clean up code around calls to current_liboctave_error_handler.
Rik <rik@octave.org>
parents:
21129
diff
changeset
|
2000 F77_CHAR_ARG_LEN (1) |
7cac4e7458f2
maint: clean up code around calls to current_liboctave_error_handler.
Rik <rik@octave.org>
parents:
21129
diff
changeset
|
2001 F77_CHAR_ARG_LEN (1))); |
7cac4e7458f2
maint: clean up code around calls to current_liboctave_error_handler.
Rik <rik@octave.org>
parents:
21129
diff
changeset
|
2002 |
7cac4e7458f2
maint: clean up code around calls to current_liboctave_error_handler.
Rik <rik@octave.org>
parents:
21129
diff
changeset
|
2003 if (info != 0) |
7cac4e7458f2
maint: clean up code around calls to current_liboctave_error_handler.
Rik <rik@octave.org>
parents:
21129
diff
changeset
|
2004 info = -2; |
7cac4e7458f2
maint: clean up code around calls to current_liboctave_error_handler.
Rik <rik@octave.org>
parents:
21129
diff
changeset
|
2005 |
7cac4e7458f2
maint: clean up code around calls to current_liboctave_error_handler.
Rik <rik@octave.org>
parents:
21129
diff
changeset
|
2006 volatile double rcond_plus_one = rcon + 1.0; |
7cac4e7458f2
maint: clean up code around calls to current_liboctave_error_handler.
Rik <rik@octave.org>
parents:
21129
diff
changeset
|
2007 |
21782
2aef506f3fec
use namespace for lo-mappers.h functions
John W. Eaton <jwe@octave.org>
parents:
21751
diff
changeset
|
2008 if (rcond_plus_one == 1.0 || octave::math::isnan (rcon)) |
10314
07ebe522dac2
untabify liboctave C++ sources
John W. Eaton <jwe@octave.org>
parents:
10213
diff
changeset
|
2009 { |
21136
7cac4e7458f2
maint: clean up code around calls to current_liboctave_error_handler.
Rik <rik@octave.org>
parents:
21129
diff
changeset
|
2010 info = -2; |
7cac4e7458f2
maint: clean up code around calls to current_liboctave_error_handler.
Rik <rik@octave.org>
parents:
21129
diff
changeset
|
2011 |
7cac4e7458f2
maint: clean up code around calls to current_liboctave_error_handler.
Rik <rik@octave.org>
parents:
21129
diff
changeset
|
2012 if (sing_handler) |
7cac4e7458f2
maint: clean up code around calls to current_liboctave_error_handler.
Rik <rik@octave.org>
parents:
21129
diff
changeset
|
2013 sing_handler (rcon); |
7cac4e7458f2
maint: clean up code around calls to current_liboctave_error_handler.
Rik <rik@octave.org>
parents:
21129
diff
changeset
|
2014 else |
7cac4e7458f2
maint: clean up code around calls to current_liboctave_error_handler.
Rik <rik@octave.org>
parents:
21129
diff
changeset
|
2015 warn_singular_matrix (rcon); |
10314
07ebe522dac2
untabify liboctave C++ sources
John W. Eaton <jwe@octave.org>
parents:
10213
diff
changeset
|
2016 } |
07ebe522dac2
untabify liboctave C++ sources
John W. Eaton <jwe@octave.org>
parents:
10213
diff
changeset
|
2017 } |
5785 | 2018 } |
2019 | |
2020 return retval; | |
2021 } | |
2022 | |
2023 ComplexMatrix | |
11586
12df7854fa7c
strip trailing whitespace from source files
John W. Eaton <jwe@octave.org>
parents:
11574
diff
changeset
|
2024 ComplexMatrix::fsolve (MatrixType &mattype, const ComplexMatrix& b, |
10314
07ebe522dac2
untabify liboctave C++ sources
John W. Eaton <jwe@octave.org>
parents:
10213
diff
changeset
|
2025 octave_idx_type& info, double& rcon, |
07ebe522dac2
untabify liboctave C++ sources
John W. Eaton <jwe@octave.org>
parents:
10213
diff
changeset
|
2026 solve_singularity_handler sing_handler, |
07ebe522dac2
untabify liboctave C++ sources
John W. Eaton <jwe@octave.org>
parents:
10213
diff
changeset
|
2027 bool calc_cond) const |
5785 | 2028 { |
2029 ComplexMatrix retval; | |
2030 | |
2031 octave_idx_type nr = rows (); | |
2032 octave_idx_type nc = cols (); | |
2033 | |
6924 | 2034 if (nr != nc || nr != b.rows ()) |
5785 | 2035 (*current_liboctave_error_handler) |
6924 | 2036 ("matrix dimension mismatch solution of linear equations"); |
21136
7cac4e7458f2
maint: clean up code around calls to current_liboctave_error_handler.
Rik <rik@octave.org>
parents:
21129
diff
changeset
|
2037 |
7cac4e7458f2
maint: clean up code around calls to current_liboctave_error_handler.
Rik <rik@octave.org>
parents:
21129
diff
changeset
|
2038 if (nr == 0 || b.cols () == 0) |
6924 | 2039 retval = ComplexMatrix (nc, b.cols (), Complex (0.0, 0.0)); |
5785 | 2040 else |
2041 { | |
2042 volatile int typ = mattype.type (); | |
11586
12df7854fa7c
strip trailing whitespace from source files
John W. Eaton <jwe@octave.org>
parents:
11574
diff
changeset
|
2043 |
17769
49a5a4be04a1
maint: Use GNU style coding conventions for code in liboctave/
Rik <rik@octave.org>
parents:
17744
diff
changeset
|
2044 // Calculate the norm of the matrix, for later use. |
5785 | 2045 double anorm = -1.; |
2046 | |
2047 if (typ == MatrixType::Hermitian) | |
10314
07ebe522dac2
untabify liboctave C++ sources
John W. Eaton <jwe@octave.org>
parents:
10213
diff
changeset
|
2048 { |
07ebe522dac2
untabify liboctave C++ sources
John W. Eaton <jwe@octave.org>
parents:
10213
diff
changeset
|
2049 info = 0; |
07ebe522dac2
untabify liboctave C++ sources
John W. Eaton <jwe@octave.org>
parents:
10213
diff
changeset
|
2050 char job = 'L'; |
15382
197774b411ec
rcond: use new copy of data for full factorization if positive definite cholesky factorization fails (bug #37336)
John W. Eaton <jwe@octave.org>
parents:
14138
diff
changeset
|
2051 |
10314
07ebe522dac2
untabify liboctave C++ sources
John W. Eaton <jwe@octave.org>
parents:
10213
diff
changeset
|
2052 ComplexMatrix atmp = *this; |
07ebe522dac2
untabify liboctave C++ sources
John W. Eaton <jwe@octave.org>
parents:
10213
diff
changeset
|
2053 Complex *tmp_data = atmp.fortran_vec (); |
15382
197774b411ec
rcond: use new copy of data for full factorization if positive definite cholesky factorization fails (bug #37336)
John W. Eaton <jwe@octave.org>
parents:
14138
diff
changeset
|
2054 |
10314
07ebe522dac2
untabify liboctave C++ sources
John W. Eaton <jwe@octave.org>
parents:
10213
diff
changeset
|
2055 anorm = atmp.abs().sum().row(static_cast<octave_idx_type>(0)).max(); |
07ebe522dac2
untabify liboctave C++ sources
John W. Eaton <jwe@octave.org>
parents:
10213
diff
changeset
|
2056 |
11586
12df7854fa7c
strip trailing whitespace from source files
John W. Eaton <jwe@octave.org>
parents:
11574
diff
changeset
|
2057 F77_XFCN (zpotrf, ZPOTRF, (F77_CONST_CHAR_ARG2 (&job, 1), nr, |
22135
407c66ae1e20
reduce warnings from GCC's link-time optimization feature (bug #48531)
John W. Eaton <jwe@octave.org>
parents:
22133
diff
changeset
|
2058 F77_DBLE_CMPLX_ARG (tmp_data), nr, info |
10314
07ebe522dac2
untabify liboctave C++ sources
John W. Eaton <jwe@octave.org>
parents:
10213
diff
changeset
|
2059 F77_CHAR_ARG_LEN (1))); |
07ebe522dac2
untabify liboctave C++ sources
John W. Eaton <jwe@octave.org>
parents:
10213
diff
changeset
|
2060 |
07ebe522dac2
untabify liboctave C++ sources
John W. Eaton <jwe@octave.org>
parents:
10213
diff
changeset
|
2061 // Throw-away extra info LAPACK gives so as to not change output. |
07ebe522dac2
untabify liboctave C++ sources
John W. Eaton <jwe@octave.org>
parents:
10213
diff
changeset
|
2062 rcon = 0.0; |
11586
12df7854fa7c
strip trailing whitespace from source files
John W. Eaton <jwe@octave.org>
parents:
11574
diff
changeset
|
2063 if (info != 0) |
10314
07ebe522dac2
untabify liboctave C++ sources
John W. Eaton <jwe@octave.org>
parents:
10213
diff
changeset
|
2064 { |
07ebe522dac2
untabify liboctave C++ sources
John W. Eaton <jwe@octave.org>
parents:
10213
diff
changeset
|
2065 info = -2; |
07ebe522dac2
untabify liboctave C++ sources
John W. Eaton <jwe@octave.org>
parents:
10213
diff
changeset
|
2066 |
07ebe522dac2
untabify liboctave C++ sources
John W. Eaton <jwe@octave.org>
parents:
10213
diff
changeset
|
2067 mattype.mark_as_unsymmetric (); |
07ebe522dac2
untabify liboctave C++ sources
John W. Eaton <jwe@octave.org>
parents:
10213
diff
changeset
|
2068 typ = MatrixType::Full; |
07ebe522dac2
untabify liboctave C++ sources
John W. Eaton <jwe@octave.org>
parents:
10213
diff
changeset
|
2069 } |
11586
12df7854fa7c
strip trailing whitespace from source files
John W. Eaton <jwe@octave.org>
parents:
11574
diff
changeset
|
2070 else |
10314
07ebe522dac2
untabify liboctave C++ sources
John W. Eaton <jwe@octave.org>
parents:
10213
diff
changeset
|
2071 { |
07ebe522dac2
untabify liboctave C++ sources
John W. Eaton <jwe@octave.org>
parents:
10213
diff
changeset
|
2072 if (calc_cond) |
07ebe522dac2
untabify liboctave C++ sources
John W. Eaton <jwe@octave.org>
parents:
10213
diff
changeset
|
2073 { |
11570
57632dea2446
attempt better backward compatibility for Array constructors
John W. Eaton <jwe@octave.org>
parents:
11523
diff
changeset
|
2074 Array<Complex> z (dim_vector (2 * nc, 1)); |
10314
07ebe522dac2
untabify liboctave C++ sources
John W. Eaton <jwe@octave.org>
parents:
10213
diff
changeset
|
2075 Complex *pz = z.fortran_vec (); |
11570
57632dea2446
attempt better backward compatibility for Array constructors
John W. Eaton <jwe@octave.org>
parents:
11523
diff
changeset
|
2076 Array<double> rz (dim_vector (nc, 1)); |
10314
07ebe522dac2
untabify liboctave C++ sources
John W. Eaton <jwe@octave.org>
parents:
10213
diff
changeset
|
2077 double *prz = rz.fortran_vec (); |
07ebe522dac2
untabify liboctave C++ sources
John W. Eaton <jwe@octave.org>
parents:
10213
diff
changeset
|
2078 |
07ebe522dac2
untabify liboctave C++ sources
John W. Eaton <jwe@octave.org>
parents:
10213
diff
changeset
|
2079 F77_XFCN (zpocon, ZPOCON, (F77_CONST_CHAR_ARG2 (&job, 1), |
22135
407c66ae1e20
reduce warnings from GCC's link-time optimization feature (bug #48531)
John W. Eaton <jwe@octave.org>
parents:
22133
diff
changeset
|
2080 nr, F77_DBLE_CMPLX_ARG (tmp_data), nr, anorm, |
407c66ae1e20
reduce warnings from GCC's link-time optimization feature (bug #48531)
John W. Eaton <jwe@octave.org>
parents:
22133
diff
changeset
|
2081 rcon, F77_DBLE_CMPLX_ARG (pz), prz, info |
10314
07ebe522dac2
untabify liboctave C++ sources
John W. Eaton <jwe@octave.org>
parents:
10213
diff
changeset
|
2082 F77_CHAR_ARG_LEN (1))); |
07ebe522dac2
untabify liboctave C++ sources
John W. Eaton <jwe@octave.org>
parents:
10213
diff
changeset
|
2083 |
11586
12df7854fa7c
strip trailing whitespace from source files
John W. Eaton <jwe@octave.org>
parents:
11574
diff
changeset
|
2084 if (info != 0) |
10314
07ebe522dac2
untabify liboctave C++ sources
John W. Eaton <jwe@octave.org>
parents:
10213
diff
changeset
|
2085 info = -2; |
07ebe522dac2
untabify liboctave C++ sources
John W. Eaton <jwe@octave.org>
parents:
10213
diff
changeset
|
2086 |
07ebe522dac2
untabify liboctave C++ sources
John W. Eaton <jwe@octave.org>
parents:
10213
diff
changeset
|
2087 volatile double rcond_plus_one = rcon + 1.0; |
07ebe522dac2
untabify liboctave C++ sources
John W. Eaton <jwe@octave.org>
parents:
10213
diff
changeset
|
2088 |
21782
2aef506f3fec
use namespace for lo-mappers.h functions
John W. Eaton <jwe@octave.org>
parents:
21751
diff
changeset
|
2089 if (rcond_plus_one == 1.0 || octave::math::isnan (rcon)) |
10314
07ebe522dac2
untabify liboctave C++ sources
John W. Eaton <jwe@octave.org>
parents:
10213
diff
changeset
|
2090 { |
07ebe522dac2
untabify liboctave C++ sources
John W. Eaton <jwe@octave.org>
parents:
10213
diff
changeset
|
2091 info = -2; |
07ebe522dac2
untabify liboctave C++ sources
John W. Eaton <jwe@octave.org>
parents:
10213
diff
changeset
|
2092 |
07ebe522dac2
untabify liboctave C++ sources
John W. Eaton <jwe@octave.org>
parents:
10213
diff
changeset
|
2093 if (sing_handler) |
07ebe522dac2
untabify liboctave C++ sources
John W. Eaton <jwe@octave.org>
parents:
10213
diff
changeset
|
2094 sing_handler (rcon); |
07ebe522dac2
untabify liboctave C++ sources
John W. Eaton <jwe@octave.org>
parents:
10213
diff
changeset
|
2095 else |
21112
358aa7fcbd33
Rename errwarn_singular_matrix to warn_singular_matrix.
Rik <rik@octave.org>
parents:
21100
diff
changeset
|
2096 warn_singular_matrix (rcon); |
10314
07ebe522dac2
untabify liboctave C++ sources
John W. Eaton <jwe@octave.org>
parents:
10213
diff
changeset
|
2097 } |
07ebe522dac2
untabify liboctave C++ sources
John W. Eaton <jwe@octave.org>
parents:
10213
diff
changeset
|
2098 } |
07ebe522dac2
untabify liboctave C++ sources
John W. Eaton <jwe@octave.org>
parents:
10213
diff
changeset
|
2099 |
07ebe522dac2
untabify liboctave C++ sources
John W. Eaton <jwe@octave.org>
parents:
10213
diff
changeset
|
2100 if (info == 0) |
07ebe522dac2
untabify liboctave C++ sources
John W. Eaton <jwe@octave.org>
parents:
10213
diff
changeset
|
2101 { |
07ebe522dac2
untabify liboctave C++ sources
John W. Eaton <jwe@octave.org>
parents:
10213
diff
changeset
|
2102 retval = b; |
07ebe522dac2
untabify liboctave C++ sources
John W. Eaton <jwe@octave.org>
parents:
10213
diff
changeset
|
2103 Complex *result = retval.fortran_vec (); |
07ebe522dac2
untabify liboctave C++ sources
John W. Eaton <jwe@octave.org>
parents:
10213
diff
changeset
|
2104 |
07ebe522dac2
untabify liboctave C++ sources
John W. Eaton <jwe@octave.org>
parents:
10213
diff
changeset
|
2105 octave_idx_type b_nc = b.cols (); |
07ebe522dac2
untabify liboctave C++ sources
John W. Eaton <jwe@octave.org>
parents:
10213
diff
changeset
|
2106 |
07ebe522dac2
untabify liboctave C++ sources
John W. Eaton <jwe@octave.org>
parents:
10213
diff
changeset
|
2107 F77_XFCN (zpotrs, ZPOTRS, (F77_CONST_CHAR_ARG2 (&job, 1), |
22135
407c66ae1e20
reduce warnings from GCC's link-time optimization feature (bug #48531)
John W. Eaton <jwe@octave.org>
parents:
22133
diff
changeset
|
2108 nr, b_nc, F77_DBLE_CMPLX_ARG (tmp_data), nr, |
407c66ae1e20
reduce warnings from GCC's link-time optimization feature (bug #48531)
John W. Eaton <jwe@octave.org>
parents:
22133
diff
changeset
|
2109 F77_DBLE_CMPLX_ARG (result), b.rows (), info |
10314
07ebe522dac2
untabify liboctave C++ sources
John W. Eaton <jwe@octave.org>
parents:
10213
diff
changeset
|
2110 F77_CHAR_ARG_LEN (1))); |
07ebe522dac2
untabify liboctave C++ sources
John W. Eaton <jwe@octave.org>
parents:
10213
diff
changeset
|
2111 } |
07ebe522dac2
untabify liboctave C++ sources
John W. Eaton <jwe@octave.org>
parents:
10213
diff
changeset
|
2112 else |
07ebe522dac2
untabify liboctave C++ sources
John W. Eaton <jwe@octave.org>
parents:
10213
diff
changeset
|
2113 { |
07ebe522dac2
untabify liboctave C++ sources
John W. Eaton <jwe@octave.org>
parents:
10213
diff
changeset
|
2114 mattype.mark_as_unsymmetric (); |
07ebe522dac2
untabify liboctave C++ sources
John W. Eaton <jwe@octave.org>
parents:
10213
diff
changeset
|
2115 typ = MatrixType::Full; |
07ebe522dac2
untabify liboctave C++ sources
John W. Eaton <jwe@octave.org>
parents:
10213
diff
changeset
|
2116 } |
07ebe522dac2
untabify liboctave C++ sources
John W. Eaton <jwe@octave.org>
parents:
10213
diff
changeset
|
2117 } |
07ebe522dac2
untabify liboctave C++ sources
John W. Eaton <jwe@octave.org>
parents:
10213
diff
changeset
|
2118 } |
5785 | 2119 |
2120 if (typ == MatrixType::Full) | |
10314
07ebe522dac2
untabify liboctave C++ sources
John W. Eaton <jwe@octave.org>
parents:
10213
diff
changeset
|
2121 { |
07ebe522dac2
untabify liboctave C++ sources
John W. Eaton <jwe@octave.org>
parents:
10213
diff
changeset
|
2122 info = 0; |
07ebe522dac2
untabify liboctave C++ sources
John W. Eaton <jwe@octave.org>
parents:
10213
diff
changeset
|
2123 |
11570
57632dea2446
attempt better backward compatibility for Array constructors
John W. Eaton <jwe@octave.org>
parents:
11523
diff
changeset
|
2124 Array<octave_idx_type> ipvt (dim_vector (nr, 1)); |
10314
07ebe522dac2
untabify liboctave C++ sources
John W. Eaton <jwe@octave.org>
parents:
10213
diff
changeset
|
2125 octave_idx_type *pipvt = ipvt.fortran_vec (); |
07ebe522dac2
untabify liboctave C++ sources
John W. Eaton <jwe@octave.org>
parents:
10213
diff
changeset
|
2126 |
07ebe522dac2
untabify liboctave C++ sources
John W. Eaton <jwe@octave.org>
parents:
10213
diff
changeset
|
2127 ComplexMatrix atmp = *this; |
07ebe522dac2
untabify liboctave C++ sources
John W. Eaton <jwe@octave.org>
parents:
10213
diff
changeset
|
2128 Complex *tmp_data = atmp.fortran_vec (); |
07ebe522dac2
untabify liboctave C++ sources
John W. Eaton <jwe@octave.org>
parents:
10213
diff
changeset
|
2129 |
11570
57632dea2446
attempt better backward compatibility for Array constructors
John W. Eaton <jwe@octave.org>
parents:
11523
diff
changeset
|
2130 Array<Complex> z (dim_vector (2 * nc, 1)); |
10314
07ebe522dac2
untabify liboctave C++ sources
John W. Eaton <jwe@octave.org>
parents:
10213
diff
changeset
|
2131 Complex *pz = z.fortran_vec (); |
11570
57632dea2446
attempt better backward compatibility for Array constructors
John W. Eaton <jwe@octave.org>
parents:
11523
diff
changeset
|
2132 Array<double> rz (dim_vector (2 * nc, 1)); |
10314
07ebe522dac2
untabify liboctave C++ sources
John W. Eaton <jwe@octave.org>
parents:
10213
diff
changeset
|
2133 double *prz = rz.fortran_vec (); |
07ebe522dac2
untabify liboctave C++ sources
John W. Eaton <jwe@octave.org>
parents:
10213
diff
changeset
|
2134 |
07ebe522dac2
untabify liboctave C++ sources
John W. Eaton <jwe@octave.org>
parents:
10213
diff
changeset
|
2135 // Calculate the norm of the matrix, for later use. |
07ebe522dac2
untabify liboctave C++ sources
John W. Eaton <jwe@octave.org>
parents:
10213
diff
changeset
|
2136 if (anorm < 0.) |
17769
49a5a4be04a1
maint: Use GNU style coding conventions for code in liboctave/
Rik <rik@octave.org>
parents:
17744
diff
changeset
|
2137 anorm = atmp.abs ().sum ().row (static_cast<octave_idx_type>(0)) |
49a5a4be04a1
maint: Use GNU style coding conventions for code in liboctave/
Rik <rik@octave.org>
parents:
17744
diff
changeset
|
2138 .max (); |
10314
07ebe522dac2
untabify liboctave C++ sources
John W. Eaton <jwe@octave.org>
parents:
10213
diff
changeset
|
2139 |
20598
ffc6cdcd02c5
Fix segfault when complex double matrix calls ZGETRF (bug #45577).
Rik <rik@octave.org>
parents:
19864
diff
changeset
|
2140 // Work around bug #45577, LAPACK crashes Octave if norm is NaN |
22044
571b42508e1e
Avoid segfault with matrices containing Inf & NaN (bug #46330).
Lachlan Andrew <lachlanbis@gmail.com>
parents:
22022
diff
changeset
|
2141 // and bug #46330, segfault with matrices containing Inf & NaN |
571b42508e1e
Avoid segfault with matrices containing Inf & NaN (bug #46330).
Lachlan Andrew <lachlanbis@gmail.com>
parents:
22022
diff
changeset
|
2142 if (octave::math::isnan (anorm) || octave::math::isinf (anorm)) |
20598
ffc6cdcd02c5
Fix segfault when complex double matrix calls ZGETRF (bug #45577).
Rik <rik@octave.org>
parents:
19864
diff
changeset
|
2143 info = -2; |
ffc6cdcd02c5
Fix segfault when complex double matrix calls ZGETRF (bug #45577).
Rik <rik@octave.org>
parents:
19864
diff
changeset
|
2144 else |
22135
407c66ae1e20
reduce warnings from GCC's link-time optimization feature (bug #48531)
John W. Eaton <jwe@octave.org>
parents:
22133
diff
changeset
|
2145 F77_XFCN (zgetrf, ZGETRF, (nr, nr, F77_DBLE_CMPLX_ARG (tmp_data), nr, pipvt, info)); |
10314
07ebe522dac2
untabify liboctave C++ sources
John W. Eaton <jwe@octave.org>
parents:
10213
diff
changeset
|
2146 |
07ebe522dac2
untabify liboctave C++ sources
John W. Eaton <jwe@octave.org>
parents:
10213
diff
changeset
|
2147 // Throw-away extra info LAPACK gives so as to not change output. |
07ebe522dac2
untabify liboctave C++ sources
John W. Eaton <jwe@octave.org>
parents:
10213
diff
changeset
|
2148 rcon = 0.0; |
11586
12df7854fa7c
strip trailing whitespace from source files
John W. Eaton <jwe@octave.org>
parents:
11574
diff
changeset
|
2149 if (info != 0) |
12df7854fa7c
strip trailing whitespace from source files
John W. Eaton <jwe@octave.org>
parents:
11574
diff
changeset
|
2150 { |
10314
07ebe522dac2
untabify liboctave C++ sources
John W. Eaton <jwe@octave.org>
parents:
10213
diff
changeset
|
2151 info = -2; |
07ebe522dac2
untabify liboctave C++ sources
John W. Eaton <jwe@octave.org>
parents:
10213
diff
changeset
|
2152 |
07ebe522dac2
untabify liboctave C++ sources
John W. Eaton <jwe@octave.org>
parents:
10213
diff
changeset
|
2153 if (sing_handler) |
07ebe522dac2
untabify liboctave C++ sources
John W. Eaton <jwe@octave.org>
parents:
10213
diff
changeset
|
2154 sing_handler (rcon); |
07ebe522dac2
untabify liboctave C++ sources
John W. Eaton <jwe@octave.org>
parents:
10213
diff
changeset
|
2155 else |
21112
358aa7fcbd33
Rename errwarn_singular_matrix to warn_singular_matrix.
Rik <rik@octave.org>
parents:
21100
diff
changeset
|
2156 warn_singular_matrix (); |
10314
07ebe522dac2
untabify liboctave C++ sources
John W. Eaton <jwe@octave.org>
parents:
10213
diff
changeset
|
2157 |
07ebe522dac2
untabify liboctave C++ sources
John W. Eaton <jwe@octave.org>
parents:
10213
diff
changeset
|
2158 mattype.mark_as_rectangular (); |
11586
12df7854fa7c
strip trailing whitespace from source files
John W. Eaton <jwe@octave.org>
parents:
11574
diff
changeset
|
2159 } |
12df7854fa7c
strip trailing whitespace from source files
John W. Eaton <jwe@octave.org>
parents:
11574
diff
changeset
|
2160 else |
10314
07ebe522dac2
untabify liboctave C++ sources
John W. Eaton <jwe@octave.org>
parents:
10213
diff
changeset
|
2161 { |
07ebe522dac2
untabify liboctave C++ sources
John W. Eaton <jwe@octave.org>
parents:
10213
diff
changeset
|
2162 if (calc_cond) |
07ebe522dac2
untabify liboctave C++ sources
John W. Eaton <jwe@octave.org>
parents:
10213
diff
changeset
|
2163 { |
11586
12df7854fa7c
strip trailing whitespace from source files
John W. Eaton <jwe@octave.org>
parents:
11574
diff
changeset
|
2164 // Now calculate the condition number for |
10314
07ebe522dac2
untabify liboctave C++ sources
John W. Eaton <jwe@octave.org>
parents:
10213
diff
changeset
|
2165 // non-singular matrix. |
07ebe522dac2
untabify liboctave C++ sources
John W. Eaton <jwe@octave.org>
parents:
10213
diff
changeset
|
2166 char job = '1'; |
07ebe522dac2
untabify liboctave C++ sources
John W. Eaton <jwe@octave.org>
parents:
10213
diff
changeset
|
2167 F77_XFCN (zgecon, ZGECON, (F77_CONST_CHAR_ARG2 (&job, 1), |
22135
407c66ae1e20
reduce warnings from GCC's link-time optimization feature (bug #48531)
John W. Eaton <jwe@octave.org>
parents:
22133
diff
changeset
|
2168 nc, F77_DBLE_CMPLX_ARG (tmp_data), nr, anorm, |
407c66ae1e20
reduce warnings from GCC's link-time optimization feature (bug #48531)
John W. Eaton <jwe@octave.org>
parents:
22133
diff
changeset
|
2169 rcon, F77_DBLE_CMPLX_ARG (pz), prz, info |
10314
07ebe522dac2
untabify liboctave C++ sources
John W. Eaton <jwe@octave.org>
parents:
10213
diff
changeset
|
2170 F77_CHAR_ARG_LEN (1))); |
07ebe522dac2
untabify liboctave C++ sources
John W. Eaton <jwe@octave.org>
parents:
10213
diff
changeset
|
2171 |
11586
12df7854fa7c
strip trailing whitespace from source files
John W. Eaton <jwe@octave.org>
parents:
11574
diff
changeset
|
2172 if (info != 0) |
10314
07ebe522dac2
untabify liboctave C++ sources
John W. Eaton <jwe@octave.org>
parents:
10213
diff
changeset
|
2173 info = -2; |
07ebe522dac2
untabify liboctave C++ sources
John W. Eaton <jwe@octave.org>
parents:
10213
diff
changeset
|
2174 |
07ebe522dac2
untabify liboctave C++ sources
John W. Eaton <jwe@octave.org>
parents:
10213
diff
changeset
|
2175 volatile double rcond_plus_one = rcon + 1.0; |
07ebe522dac2
untabify liboctave C++ sources
John W. Eaton <jwe@octave.org>
parents:
10213
diff
changeset
|
2176 |
21782
2aef506f3fec
use namespace for lo-mappers.h functions
John W. Eaton <jwe@octave.org>
parents:
21751
diff
changeset
|
2177 if (rcond_plus_one == 1.0 || octave::math::isnan (rcon)) |
10314
07ebe522dac2
untabify liboctave C++ sources
John W. Eaton <jwe@octave.org>
parents:
10213
diff
changeset
|
2178 { |
07ebe522dac2
untabify liboctave C++ sources
John W. Eaton <jwe@octave.org>
parents:
10213
diff
changeset
|
2179 info = -2; |
07ebe522dac2
untabify liboctave C++ sources
John W. Eaton <jwe@octave.org>
parents:
10213
diff
changeset
|
2180 |
07ebe522dac2
untabify liboctave C++ sources
John W. Eaton <jwe@octave.org>
parents:
10213
diff
changeset
|
2181 if (sing_handler) |
07ebe522dac2
untabify liboctave C++ sources
John W. Eaton <jwe@octave.org>
parents:
10213
diff
changeset
|
2182 sing_handler (rcon); |
07ebe522dac2
untabify liboctave C++ sources
John W. Eaton <jwe@octave.org>
parents:
10213
diff
changeset
|
2183 else |
21112
358aa7fcbd33
Rename errwarn_singular_matrix to warn_singular_matrix.
Rik <rik@octave.org>
parents:
21100
diff
changeset
|
2184 warn_singular_matrix (rcon); |
10314
07ebe522dac2
untabify liboctave C++ sources
John W. Eaton <jwe@octave.org>
parents:
10213
diff
changeset
|
2185 } |
07ebe522dac2
untabify liboctave C++ sources
John W. Eaton <jwe@octave.org>
parents:
10213
diff
changeset
|
2186 } |
07ebe522dac2
untabify liboctave C++ sources
John W. Eaton <jwe@octave.org>
parents:
10213
diff
changeset
|
2187 |
07ebe522dac2
untabify liboctave C++ sources
John W. Eaton <jwe@octave.org>
parents:
10213
diff
changeset
|
2188 if (info == 0) |
07ebe522dac2
untabify liboctave C++ sources
John W. Eaton <jwe@octave.org>
parents:
10213
diff
changeset
|
2189 { |
07ebe522dac2
untabify liboctave C++ sources
John W. Eaton <jwe@octave.org>
parents:
10213
diff
changeset
|
2190 retval = b; |
07ebe522dac2
untabify liboctave C++ sources
John W. Eaton <jwe@octave.org>
parents:
10213
diff
changeset
|
2191 Complex *result = retval.fortran_vec (); |
07ebe522dac2
untabify liboctave C++ sources
John W. Eaton <jwe@octave.org>
parents:
10213
diff
changeset
|
2192 |
07ebe522dac2
untabify liboctave C++ sources
John W. Eaton <jwe@octave.org>
parents:
10213
diff
changeset
|
2193 octave_idx_type b_nc = b.cols (); |
07ebe522dac2
untabify liboctave C++ sources
John W. Eaton <jwe@octave.org>
parents:
10213
diff
changeset
|
2194 |
07ebe522dac2
untabify liboctave C++ sources
John W. Eaton <jwe@octave.org>
parents:
10213
diff
changeset
|
2195 char job = 'N'; |
07ebe522dac2
untabify liboctave C++ sources
John W. Eaton <jwe@octave.org>
parents:
10213
diff
changeset
|
2196 F77_XFCN (zgetrs, ZGETRS, (F77_CONST_CHAR_ARG2 (&job, 1), |
22135
407c66ae1e20
reduce warnings from GCC's link-time optimization feature (bug #48531)
John W. Eaton <jwe@octave.org>
parents:
22133
diff
changeset
|
2197 nr, b_nc, F77_DBLE_CMPLX_ARG (tmp_data), nr, |
407c66ae1e20
reduce warnings from GCC's link-time optimization feature (bug #48531)
John W. Eaton <jwe@octave.org>
parents:
22133
diff
changeset
|
2198 pipvt, F77_DBLE_CMPLX_ARG (result), b.rows (), info |
11586
12df7854fa7c
strip trailing whitespace from source files
John W. Eaton <jwe@octave.org>
parents:
11574
diff
changeset
|
2199 F77_CHAR_ARG_LEN (1))); |
10314
07ebe522dac2
untabify liboctave C++ sources
John W. Eaton <jwe@octave.org>
parents:
10213
diff
changeset
|
2200 } |
07ebe522dac2
untabify liboctave C++ sources
John W. Eaton <jwe@octave.org>
parents:
10213
diff
changeset
|
2201 else |
11586
12df7854fa7c
strip trailing whitespace from source files
John W. Eaton <jwe@octave.org>
parents:
11574
diff
changeset
|
2202 mattype.mark_as_rectangular (); |
10314
07ebe522dac2
untabify liboctave C++ sources
John W. Eaton <jwe@octave.org>
parents:
10213
diff
changeset
|
2203 } |
07ebe522dac2
untabify liboctave C++ sources
John W. Eaton <jwe@octave.org>
parents:
10213
diff
changeset
|
2204 } |
22085
bf5fbf347aaf
Avoid segfault with complex matrices using LAPACK (bug #46330).
Kai T. Ohlhus <k.ohlhus@gmail.com>
parents:
22044
diff
changeset
|
2205 |
22044
571b42508e1e
Avoid segfault with matrices containing Inf & NaN (bug #46330).
Lachlan Andrew <lachlanbis@gmail.com>
parents:
22022
diff
changeset
|
2206 if (octave::math::isinf (anorm)) |
571b42508e1e
Avoid segfault with matrices containing Inf & NaN (bug #46330).
Lachlan Andrew <lachlanbis@gmail.com>
parents:
22022
diff
changeset
|
2207 { |
571b42508e1e
Avoid segfault with matrices containing Inf & NaN (bug #46330).
Lachlan Andrew <lachlanbis@gmail.com>
parents:
22022
diff
changeset
|
2208 retval = ComplexMatrix (b.rows (), b.cols (), Complex (0, 0)); |
571b42508e1e
Avoid segfault with matrices containing Inf & NaN (bug #46330).
Lachlan Andrew <lachlanbis@gmail.com>
parents:
22022
diff
changeset
|
2209 mattype.mark_as_full (); |
571b42508e1e
Avoid segfault with matrices containing Inf & NaN (bug #46330).
Lachlan Andrew <lachlanbis@gmail.com>
parents:
22022
diff
changeset
|
2210 } |
5785 | 2211 } |
11586
12df7854fa7c
strip trailing whitespace from source files
John W. Eaton <jwe@octave.org>
parents:
11574
diff
changeset
|
2212 |
5785 | 2213 return retval; |
2214 } | |
2215 | |
2216 ComplexMatrix | |
2217 ComplexMatrix::solve (MatrixType &typ, const Matrix& b) const | |
2218 { | |
2219 octave_idx_type info; | |
7788 | 2220 double rcon; |
2221 return solve (typ, b, info, rcon, 0); | |
5785 | 2222 } |
2223 | |
2224 ComplexMatrix | |
11586
12df7854fa7c
strip trailing whitespace from source files
John W. Eaton <jwe@octave.org>
parents:
11574
diff
changeset
|
2225 ComplexMatrix::solve (MatrixType &typ, const Matrix& b, |
10314
07ebe522dac2
untabify liboctave C++ sources
John W. Eaton <jwe@octave.org>
parents:
10213
diff
changeset
|
2226 octave_idx_type& info) const |
5785 | 2227 { |
7788 | 2228 double rcon; |
2229 return solve (typ, b, info, rcon, 0); | |
5785 | 2230 } |
2231 | |
2232 ComplexMatrix | |
2233 ComplexMatrix::solve (MatrixType &typ, const Matrix& b, octave_idx_type& info, | |
10314
07ebe522dac2
untabify liboctave C++ sources
John W. Eaton <jwe@octave.org>
parents:
10213
diff
changeset
|
2234 double& rcon) const |
5785 | 2235 { |
7788 | 2236 return solve (typ, b, info, rcon, 0); |
5785 | 2237 } |
2238 | |
2239 ComplexMatrix | |
11586
12df7854fa7c
strip trailing whitespace from source files
John W. Eaton <jwe@octave.org>
parents:
11574
diff
changeset
|
2240 ComplexMatrix::solve (MatrixType &typ, const Matrix& b, octave_idx_type& info, |
10314
07ebe522dac2
untabify liboctave C++ sources
John W. Eaton <jwe@octave.org>
parents:
10213
diff
changeset
|
2241 double& rcon, solve_singularity_handler sing_handler, |
07ebe522dac2
untabify liboctave C++ sources
John W. Eaton <jwe@octave.org>
parents:
10213
diff
changeset
|
2242 bool singular_fallback, blas_trans_type transt) const |
5785 | 2243 { |
2244 ComplexMatrix tmp (b); | |
9661
afcf852256d2
optimize / and '\ for triangular matrices
Jaroslav Hajek <highegg@gmail.com>
parents:
9658
diff
changeset
|
2245 return solve (typ, tmp, info, rcon, sing_handler, singular_fallback, transt); |
5785 | 2246 } |
2247 | |
2248 ComplexMatrix | |
2249 ComplexMatrix::solve (MatrixType &typ, const ComplexMatrix& b) const | |
2250 { | |
2251 octave_idx_type info; | |
7788 | 2252 double rcon; |
2253 return solve (typ, b, info, rcon, 0); | |
5785 | 2254 } |
2255 | |
2256 ComplexMatrix | |
11586
12df7854fa7c
strip trailing whitespace from source files
John W. Eaton <jwe@octave.org>
parents:
11574
diff
changeset
|
2257 ComplexMatrix::solve (MatrixType &typ, const ComplexMatrix& b, |
10314
07ebe522dac2
untabify liboctave C++ sources
John W. Eaton <jwe@octave.org>
parents:
10213
diff
changeset
|
2258 octave_idx_type& info) const |
5785 | 2259 { |
7788 | 2260 double rcon; |
2261 return solve (typ, b, info, rcon, 0); | |
5785 | 2262 } |
2263 | |
2264 ComplexMatrix | |
11586
12df7854fa7c
strip trailing whitespace from source files
John W. Eaton <jwe@octave.org>
parents:
11574
diff
changeset
|
2265 ComplexMatrix::solve (MatrixType &typ, const ComplexMatrix& b, |
10314
07ebe522dac2
untabify liboctave C++ sources
John W. Eaton <jwe@octave.org>
parents:
10213
diff
changeset
|
2266 octave_idx_type& info, double& rcon) const |
5785 | 2267 { |
7788 | 2268 return solve (typ, b, info, rcon, 0); |
5785 | 2269 } |
2270 | |
2271 ComplexMatrix | |
11586
12df7854fa7c
strip trailing whitespace from source files
John W. Eaton <jwe@octave.org>
parents:
11574
diff
changeset
|
2272 ComplexMatrix::solve (MatrixType &mattype, const ComplexMatrix& b, |
10314
07ebe522dac2
untabify liboctave C++ sources
John W. Eaton <jwe@octave.org>
parents:
10213
diff
changeset
|
2273 octave_idx_type& info, double& rcon, |
07ebe522dac2
untabify liboctave C++ sources
John W. Eaton <jwe@octave.org>
parents:
10213
diff
changeset
|
2274 solve_singularity_handler sing_handler, |
07ebe522dac2
untabify liboctave C++ sources
John W. Eaton <jwe@octave.org>
parents:
10213
diff
changeset
|
2275 bool singular_fallback, blas_trans_type transt) const |
5785 | 2276 { |
2277 ComplexMatrix retval; | |
2278 int typ = mattype.type (); | |
2279 | |
2280 if (typ == MatrixType::Unknown) | |
2281 typ = mattype.type (*this); | |
2282 | |
2283 // Only calculate the condition number for LU/Cholesky | |
2284 if (typ == MatrixType::Upper || typ == MatrixType::Permuted_Upper) | |
19434
aee5fea8a03e
compute condition number when solving triangular systems (bug #43875)
John W. Eaton <jwe@octave.org>
parents:
19408
diff
changeset
|
2285 retval = utsolve (mattype, b, info, rcon, sing_handler, true, transt); |
5785 | 2286 else if (typ == MatrixType::Lower || typ == MatrixType::Permuted_Lower) |
19434
aee5fea8a03e
compute condition number when solving triangular systems (bug #43875)
John W. Eaton <jwe@octave.org>
parents:
19408
diff
changeset
|
2287 retval = ltsolve (mattype, b, info, rcon, sing_handler, true, transt); |
9661
afcf852256d2
optimize / and '\ for triangular matrices
Jaroslav Hajek <highegg@gmail.com>
parents:
9658
diff
changeset
|
2288 else if (transt == blas_trans) |
17769
49a5a4be04a1
maint: Use GNU style coding conventions for code in liboctave/
Rik <rik@octave.org>
parents:
17744
diff
changeset
|
2289 return transpose ().solve (mattype, b, info, rcon, sing_handler, |
49a5a4be04a1
maint: Use GNU style coding conventions for code in liboctave/
Rik <rik@octave.org>
parents:
17744
diff
changeset
|
2290 singular_fallback); |
9661
afcf852256d2
optimize / and '\ for triangular matrices
Jaroslav Hajek <highegg@gmail.com>
parents:
9658
diff
changeset
|
2291 else if (transt == blas_conj_trans) |
17769
49a5a4be04a1
maint: Use GNU style coding conventions for code in liboctave/
Rik <rik@octave.org>
parents:
17744
diff
changeset
|
2292 retval = hermitian ().solve (mattype, b, info, rcon, sing_handler, |
49a5a4be04a1
maint: Use GNU style coding conventions for code in liboctave/
Rik <rik@octave.org>
parents:
17744
diff
changeset
|
2293 singular_fallback); |
5785 | 2294 else if (typ == MatrixType::Full || typ == MatrixType::Hermitian) |
7788 | 2295 retval = fsolve (mattype, b, info, rcon, sing_handler, true); |
5785 | 2296 else if (typ != MatrixType::Rectangular) |
21136
7cac4e7458f2
maint: clean up code around calls to current_liboctave_error_handler.
Rik <rik@octave.org>
parents:
21129
diff
changeset
|
2297 (*current_liboctave_error_handler) ("unknown matrix type"); |
5785 | 2298 |
2299 // Rectangular or one of the above solvers flags a singular matrix | |
2300 if (singular_fallback && mattype.type () == MatrixType::Rectangular) | |
2301 { | |
2302 octave_idx_type rank; | |
7788 | 2303 retval = lssolve (b, info, rank, rcon); |
5785 | 2304 } |
2305 | |
2306 return retval; | |
2307 } | |
2308 | |
2309 ComplexColumnVector | |
2310 ComplexMatrix::solve (MatrixType &typ, const ColumnVector& b) const | |
2311 { | |
2312 octave_idx_type info; | |
7788 | 2313 double rcon; |
2314 return solve (typ, ComplexColumnVector (b), info, rcon, 0); | |
5785 | 2315 } |
2316 | |
2317 ComplexColumnVector | |
11586
12df7854fa7c
strip trailing whitespace from source files
John W. Eaton <jwe@octave.org>
parents:
11574
diff
changeset
|
2318 ComplexMatrix::solve (MatrixType &typ, const ColumnVector& b, |
10314
07ebe522dac2
untabify liboctave C++ sources
John W. Eaton <jwe@octave.org>
parents:
10213
diff
changeset
|
2319 octave_idx_type& info) const |
5785 | 2320 { |
7788 | 2321 double rcon; |
2322 return solve (typ, ComplexColumnVector (b), info, rcon, 0); | |
5785 | 2323 } |
2324 | |
2325 ComplexColumnVector | |
11586
12df7854fa7c
strip trailing whitespace from source files
John W. Eaton <jwe@octave.org>
parents:
11574
diff
changeset
|
2326 ComplexMatrix::solve (MatrixType &typ, const ColumnVector& b, |
10314
07ebe522dac2
untabify liboctave C++ sources
John W. Eaton <jwe@octave.org>
parents:
10213
diff
changeset
|
2327 octave_idx_type& info, double& rcon) const |
5785 | 2328 { |
7788 | 2329 return solve (typ, ComplexColumnVector (b), info, rcon, 0); |
5785 | 2330 } |
2331 | |
2332 ComplexColumnVector | |
11586
12df7854fa7c
strip trailing whitespace from source files
John W. Eaton <jwe@octave.org>
parents:
11574
diff
changeset
|
2333 ComplexMatrix::solve (MatrixType &typ, const ColumnVector& b, |
10314
07ebe522dac2
untabify liboctave C++ sources
John W. Eaton <jwe@octave.org>
parents:
10213
diff
changeset
|
2334 octave_idx_type& info, double& rcon, |
17769
49a5a4be04a1
maint: Use GNU style coding conventions for code in liboctave/
Rik <rik@octave.org>
parents:
17744
diff
changeset
|
2335 solve_singularity_handler sing_handler, |
49a5a4be04a1
maint: Use GNU style coding conventions for code in liboctave/
Rik <rik@octave.org>
parents:
17744
diff
changeset
|
2336 blas_trans_type transt) const |
5785 | 2337 { |
9661
afcf852256d2
optimize / and '\ for triangular matrices
Jaroslav Hajek <highegg@gmail.com>
parents:
9658
diff
changeset
|
2338 return solve (typ, ComplexColumnVector (b), info, rcon, sing_handler, transt); |
5785 | 2339 } |
2340 | |
2341 ComplexColumnVector | |
2342 ComplexMatrix::solve (MatrixType &typ, const ComplexColumnVector& b) const | |
2343 { | |
2344 octave_idx_type info; | |
7788 | 2345 double rcon; |
2346 return solve (typ, b, info, rcon, 0); | |
5785 | 2347 } |
2348 | |
2349 ComplexColumnVector | |
11586
12df7854fa7c
strip trailing whitespace from source files
John W. Eaton <jwe@octave.org>
parents:
11574
diff
changeset
|
2350 ComplexMatrix::solve (MatrixType &typ, const ComplexColumnVector& b, |
10314
07ebe522dac2
untabify liboctave C++ sources
John W. Eaton <jwe@octave.org>
parents:
10213
diff
changeset
|
2351 octave_idx_type& info) const |
5785 | 2352 { |
7788 | 2353 double rcon; |
2354 return solve (typ, b, info, rcon, 0); | |
5785 | 2355 } |
2356 | |
2357 ComplexColumnVector | |
2358 ComplexMatrix::solve (MatrixType &typ, const ComplexColumnVector& b, | |
10314
07ebe522dac2
untabify liboctave C++ sources
John W. Eaton <jwe@octave.org>
parents:
10213
diff
changeset
|
2359 octave_idx_type& info, double& rcon) const |
5785 | 2360 { |
7788 | 2361 return solve (typ, b, info, rcon, 0); |
5785 | 2362 } |
2363 | |
2364 ComplexColumnVector | |
2365 ComplexMatrix::solve (MatrixType &typ, const ComplexColumnVector& b, | |
10314
07ebe522dac2
untabify liboctave C++ sources
John W. Eaton <jwe@octave.org>
parents:
10213
diff
changeset
|
2366 octave_idx_type& info, double& rcon, |
17769
49a5a4be04a1
maint: Use GNU style coding conventions for code in liboctave/
Rik <rik@octave.org>
parents:
17744
diff
changeset
|
2367 solve_singularity_handler sing_handler, |
49a5a4be04a1
maint: Use GNU style coding conventions for code in liboctave/
Rik <rik@octave.org>
parents:
17744
diff
changeset
|
2368 blas_trans_type transt) const |
5785 | 2369 { |
2370 | |
2371 ComplexMatrix tmp (b); | |
10352 | 2372 tmp = solve (typ, tmp, info, rcon, sing_handler, true, transt); |
15018
3d8ace26c5b4
maint: Use Octave coding conventions for cuddled parentheses in liboctave/.
Rik <rik@octave.org>
parents:
14846
diff
changeset
|
2373 return tmp.column (static_cast<octave_idx_type> (0)); |
5785 | 2374 } |
2375 | |
2376 ComplexMatrix | |
458 | 2377 ComplexMatrix::solve (const Matrix& b) const |
2378 { | |
5275 | 2379 octave_idx_type info; |
7788 | 2380 double rcon; |
2381 return solve (b, info, rcon, 0); | |
458 | 2382 } |
2383 | |
2384 ComplexMatrix | |
5275 | 2385 ComplexMatrix::solve (const Matrix& b, octave_idx_type& info) const |
458 | 2386 { |
7788 | 2387 double rcon; |
2388 return solve (b, info, rcon, 0); | |
458 | 2389 } |
2390 | |
2391 ComplexMatrix | |
17769
49a5a4be04a1
maint: Use GNU style coding conventions for code in liboctave/
Rik <rik@octave.org>
parents:
17744
diff
changeset
|
2392 ComplexMatrix::solve (const Matrix& b, octave_idx_type& info, |
49a5a4be04a1
maint: Use GNU style coding conventions for code in liboctave/
Rik <rik@octave.org>
parents:
17744
diff
changeset
|
2393 double& rcon) const |
458 | 2394 { |
7788 | 2395 return solve (b, info, rcon, 0); |
3480 | 2396 } |
2397 | |
2398 ComplexMatrix | |
7788 | 2399 ComplexMatrix::solve (const Matrix& b, octave_idx_type& info, double& rcon, |
17769
49a5a4be04a1
maint: Use GNU style coding conventions for code in liboctave/
Rik <rik@octave.org>
parents:
17744
diff
changeset
|
2400 solve_singularity_handler sing_handler, |
49a5a4be04a1
maint: Use GNU style coding conventions for code in liboctave/
Rik <rik@octave.org>
parents:
17744
diff
changeset
|
2401 blas_trans_type transt) const |
3480 | 2402 { |
458 | 2403 ComplexMatrix tmp (b); |
9661
afcf852256d2
optimize / and '\ for triangular matrices
Jaroslav Hajek <highegg@gmail.com>
parents:
9658
diff
changeset
|
2404 return solve (tmp, info, rcon, sing_handler, transt); |
458 | 2405 } |
2406 | |
2407 ComplexMatrix | |
2408 ComplexMatrix::solve (const ComplexMatrix& b) const | |
2409 { | |
5275 | 2410 octave_idx_type info; |
7788 | 2411 double rcon; |
2412 return solve (b, info, rcon, 0); | |
458 | 2413 } |
2414 | |
2415 ComplexMatrix | |
5275 | 2416 ComplexMatrix::solve (const ComplexMatrix& b, octave_idx_type& info) const |
458 | 2417 { |
7788 | 2418 double rcon; |
2419 return solve (b, info, rcon, 0); | |
458 | 2420 } |
3480 | 2421 |
458 | 2422 ComplexMatrix |
17769
49a5a4be04a1
maint: Use GNU style coding conventions for code in liboctave/
Rik <rik@octave.org>
parents:
17744
diff
changeset
|
2423 ComplexMatrix::solve (const ComplexMatrix& b, octave_idx_type& info, |
49a5a4be04a1
maint: Use GNU style coding conventions for code in liboctave/
Rik <rik@octave.org>
parents:
17744
diff
changeset
|
2424 double& rcon) const |
458 | 2425 { |
7788 | 2426 return solve (b, info, rcon, 0); |
3480 | 2427 } |
2428 | |
2429 ComplexMatrix | |
17769
49a5a4be04a1
maint: Use GNU style coding conventions for code in liboctave/
Rik <rik@octave.org>
parents:
17744
diff
changeset
|
2430 ComplexMatrix::solve (const ComplexMatrix& b, octave_idx_type& info, |
49a5a4be04a1
maint: Use GNU style coding conventions for code in liboctave/
Rik <rik@octave.org>
parents:
17744
diff
changeset
|
2431 double& rcon, |
49a5a4be04a1
maint: Use GNU style coding conventions for code in liboctave/
Rik <rik@octave.org>
parents:
17744
diff
changeset
|
2432 solve_singularity_handler sing_handler, |
49a5a4be04a1
maint: Use GNU style coding conventions for code in liboctave/
Rik <rik@octave.org>
parents:
17744
diff
changeset
|
2433 blas_trans_type transt) const |
3480 | 2434 { |
5785 | 2435 MatrixType mattype (*this); |
9661
afcf852256d2
optimize / and '\ for triangular matrices
Jaroslav Hajek <highegg@gmail.com>
parents:
9658
diff
changeset
|
2436 return solve (mattype, b, info, rcon, sing_handler, true, transt); |
458 | 2437 } |
2438 | |
2439 ComplexColumnVector | |
3585 | 2440 ComplexMatrix::solve (const ColumnVector& b) const |
2441 { | |
5275 | 2442 octave_idx_type info; |
7788 | 2443 double rcon; |
2444 return solve (ComplexColumnVector (b), info, rcon, 0); | |
3585 | 2445 } |
2446 | |
2447 ComplexColumnVector | |
5275 | 2448 ComplexMatrix::solve (const ColumnVector& b, octave_idx_type& info) const |
3585 | 2449 { |
7788 | 2450 double rcon; |
2451 return solve (ComplexColumnVector (b), info, rcon, 0); | |
3585 | 2452 } |
2453 | |
2454 ComplexColumnVector | |
11586
12df7854fa7c
strip trailing whitespace from source files
John W. Eaton <jwe@octave.org>
parents:
11574
diff
changeset
|
2455 ComplexMatrix::solve (const ColumnVector& b, octave_idx_type& info, |
10314
07ebe522dac2
untabify liboctave C++ sources
John W. Eaton <jwe@octave.org>
parents:
10213
diff
changeset
|
2456 double& rcon) const |
3585 | 2457 { |
7788 | 2458 return solve (ComplexColumnVector (b), info, rcon, 0); |
3585 | 2459 } |
2460 | |
2461 ComplexColumnVector | |
11586
12df7854fa7c
strip trailing whitespace from source files
John W. Eaton <jwe@octave.org>
parents:
11574
diff
changeset
|
2462 ComplexMatrix::solve (const ColumnVector& b, octave_idx_type& info, |
12df7854fa7c
strip trailing whitespace from source files
John W. Eaton <jwe@octave.org>
parents:
11574
diff
changeset
|
2463 double& rcon, |
17769
49a5a4be04a1
maint: Use GNU style coding conventions for code in liboctave/
Rik <rik@octave.org>
parents:
17744
diff
changeset
|
2464 solve_singularity_handler sing_handler, |
49a5a4be04a1
maint: Use GNU style coding conventions for code in liboctave/
Rik <rik@octave.org>
parents:
17744
diff
changeset
|
2465 blas_trans_type transt) const |
3585 | 2466 { |
9661
afcf852256d2
optimize / and '\ for triangular matrices
Jaroslav Hajek <highegg@gmail.com>
parents:
9658
diff
changeset
|
2467 return solve (ComplexColumnVector (b), info, rcon, sing_handler, transt); |
3585 | 2468 } |
2469 | |
2470 ComplexColumnVector | |
458 | 2471 ComplexMatrix::solve (const ComplexColumnVector& b) const |
2472 { | |
5275 | 2473 octave_idx_type info; |
7788 | 2474 double rcon; |
2475 return solve (b, info, rcon, 0); | |
458 | 2476 } |
2477 | |
2478 ComplexColumnVector | |
5275 | 2479 ComplexMatrix::solve (const ComplexColumnVector& b, octave_idx_type& info) const |
458 | 2480 { |
7788 | 2481 double rcon; |
2482 return solve (b, info, rcon, 0); | |
458 | 2483 } |
2484 | |
2485 ComplexColumnVector | |
5275 | 2486 ComplexMatrix::solve (const ComplexColumnVector& b, octave_idx_type& info, |
10314
07ebe522dac2
untabify liboctave C++ sources
John W. Eaton <jwe@octave.org>
parents:
10213
diff
changeset
|
2487 double& rcon) const |
458 | 2488 { |
7788 | 2489 return solve (b, info, rcon, 0); |
3480 | 2490 } |
2491 | |
2492 ComplexColumnVector | |
5275 | 2493 ComplexMatrix::solve (const ComplexColumnVector& b, octave_idx_type& info, |
10314
07ebe522dac2
untabify liboctave C++ sources
John W. Eaton <jwe@octave.org>
parents:
10213
diff
changeset
|
2494 double& rcon, |
17769
49a5a4be04a1
maint: Use GNU style coding conventions for code in liboctave/
Rik <rik@octave.org>
parents:
17744
diff
changeset
|
2495 solve_singularity_handler sing_handler, |
49a5a4be04a1
maint: Use GNU style coding conventions for code in liboctave/
Rik <rik@octave.org>
parents:
17744
diff
changeset
|
2496 blas_trans_type transt) const |
3480 | 2497 { |
5785 | 2498 MatrixType mattype (*this); |
9661
afcf852256d2
optimize / and '\ for triangular matrices
Jaroslav Hajek <highegg@gmail.com>
parents:
9658
diff
changeset
|
2499 return solve (mattype, b, info, rcon, sing_handler, transt); |
458 | 2500 } |
2501 | |
2502 ComplexMatrix | |
3585 | 2503 ComplexMatrix::lssolve (const Matrix& b) const |
2504 { | |
5275 | 2505 octave_idx_type info; |
2506 octave_idx_type rank; | |
7788 | 2507 double rcon; |
2508 return lssolve (ComplexMatrix (b), info, rank, rcon); | |
3585 | 2509 } |
2510 | |
2511 ComplexMatrix | |
5275 | 2512 ComplexMatrix::lssolve (const Matrix& b, octave_idx_type& info) const |
3585 | 2513 { |
5275 | 2514 octave_idx_type rank; |
7788 | 2515 double rcon; |
2516 return lssolve (ComplexMatrix (b), info, rank, rcon); | |
3585 | 2517 } |
2518 | |
2519 ComplexMatrix | |
7076 | 2520 ComplexMatrix::lssolve (const Matrix& b, octave_idx_type& info, |
10314
07ebe522dac2
untabify liboctave C++ sources
John W. Eaton <jwe@octave.org>
parents:
10213
diff
changeset
|
2521 octave_idx_type& rank) const |
3585 | 2522 { |
7788 | 2523 double rcon; |
2524 return lssolve (ComplexMatrix (b), info, rank, rcon); | |
7076 | 2525 } |
2526 | |
2527 ComplexMatrix | |
2528 ComplexMatrix::lssolve (const Matrix& b, octave_idx_type& info, | |
10314
07ebe522dac2
untabify liboctave C++ sources
John W. Eaton <jwe@octave.org>
parents:
10213
diff
changeset
|
2529 octave_idx_type& rank, double& rcon) const |
7076 | 2530 { |
7788 | 2531 return lssolve (ComplexMatrix (b), info, rank, rcon); |
3585 | 2532 } |
2533 | |
2534 ComplexMatrix | |
458 | 2535 ComplexMatrix::lssolve (const ComplexMatrix& b) const |
2536 { | |
5275 | 2537 octave_idx_type info; |
2538 octave_idx_type rank; | |
7788 | 2539 double rcon; |
2540 return lssolve (b, info, rank, rcon); | |
458 | 2541 } |
2542 | |
2543 ComplexMatrix | |
5275 | 2544 ComplexMatrix::lssolve (const ComplexMatrix& b, octave_idx_type& info) const |
458 | 2545 { |
5275 | 2546 octave_idx_type rank; |
7788 | 2547 double rcon; |
2548 return lssolve (b, info, rank, rcon); | |
458 | 2549 } |
2550 | |
2551 ComplexMatrix | |
7076 | 2552 ComplexMatrix::lssolve (const ComplexMatrix& b, octave_idx_type& info, |
10314
07ebe522dac2
untabify liboctave C++ sources
John W. Eaton <jwe@octave.org>
parents:
10213
diff
changeset
|
2553 octave_idx_type& rank) const |
7076 | 2554 { |
7788 | 2555 double rcon; |
2556 return lssolve (b, info, rank, rcon); | |
7076 | 2557 } |
2558 | |
2559 ComplexMatrix | |
11586
12df7854fa7c
strip trailing whitespace from source files
John W. Eaton <jwe@octave.org>
parents:
11574
diff
changeset
|
2560 ComplexMatrix::lssolve (const ComplexMatrix& b, octave_idx_type& info, |
10314
07ebe522dac2
untabify liboctave C++ sources
John W. Eaton <jwe@octave.org>
parents:
10213
diff
changeset
|
2561 octave_idx_type& rank, double& rcon) const |
458 | 2562 { |
1948 | 2563 ComplexMatrix retval; |
2564 | |
5275 | 2565 octave_idx_type nrhs = b.cols (); |
2566 | |
2567 octave_idx_type m = rows (); | |
2568 octave_idx_type n = cols (); | |
458 | 2569 |
6924 | 2570 if (m != b.rows ()) |
1948 | 2571 (*current_liboctave_error_handler) |
2572 ("matrix dimension mismatch solution of linear equations"); | |
21136
7cac4e7458f2
maint: clean up code around calls to current_liboctave_error_handler.
Rik <rik@octave.org>
parents:
21129
diff
changeset
|
2573 |
7cac4e7458f2
maint: clean up code around calls to current_liboctave_error_handler.
Rik <rik@octave.org>
parents:
21129
diff
changeset
|
2574 if (m== 0 || n == 0 || b.cols () == 0) |
6924 | 2575 retval = ComplexMatrix (n, b.cols (), Complex (0.0, 0.0)); |
1948 | 2576 else |
458 | 2577 { |
7072 | 2578 volatile octave_idx_type minmn = (m < n ? m : n); |
2579 octave_idx_type maxmn = m > n ? m : n; | |
7788 | 2580 rcon = -1.0; |
7072 | 2581 |
2582 if (m != n) | |
10314
07ebe522dac2
untabify liboctave C++ sources
John W. Eaton <jwe@octave.org>
parents:
10213
diff
changeset
|
2583 { |
07ebe522dac2
untabify liboctave C++ sources
John W. Eaton <jwe@octave.org>
parents:
10213
diff
changeset
|
2584 retval = ComplexMatrix (maxmn, nrhs); |
07ebe522dac2
untabify liboctave C++ sources
John W. Eaton <jwe@octave.org>
parents:
10213
diff
changeset
|
2585 |
07ebe522dac2
untabify liboctave C++ sources
John W. Eaton <jwe@octave.org>
parents:
10213
diff
changeset
|
2586 for (octave_idx_type j = 0; j < nrhs; j++) |
07ebe522dac2
untabify liboctave C++ sources
John W. Eaton <jwe@octave.org>
parents:
10213
diff
changeset
|
2587 for (octave_idx_type i = 0; i < m; i++) |
07ebe522dac2
untabify liboctave C++ sources
John W. Eaton <jwe@octave.org>
parents:
10213
diff
changeset
|
2588 retval.elem (i, j) = b.elem (i, j); |
07ebe522dac2
untabify liboctave C++ sources
John W. Eaton <jwe@octave.org>
parents:
10213
diff
changeset
|
2589 } |
7072 | 2590 else |
10314
07ebe522dac2
untabify liboctave C++ sources
John W. Eaton <jwe@octave.org>
parents:
10213
diff
changeset
|
2591 retval = b; |
7072 | 2592 |
1948 | 2593 ComplexMatrix atmp = *this; |
2594 Complex *tmp_data = atmp.fortran_vec (); | |
2595 | |
7072 | 2596 Complex *pretval = retval.fortran_vec (); |
11570
57632dea2446
attempt better backward compatibility for Array constructors
John W. Eaton <jwe@octave.org>
parents:
11523
diff
changeset
|
2597 Array<double> s (dim_vector (minmn, 1)); |
7071 | 2598 double *ps = s.fortran_vec (); |
2563 | 2599 |
7072 | 2600 // Ask ZGELSD what the dimension of WORK should be. |
5275 | 2601 octave_idx_type lwork = -1; |
3752 | 2602 |
11570
57632dea2446
attempt better backward compatibility for Array constructors
John W. Eaton <jwe@octave.org>
parents:
11523
diff
changeset
|
2603 Array<Complex> work (dim_vector (1, 1)); |
7079 | 2604 |
7477 | 2605 octave_idx_type smlsiz; |
2606 F77_FUNC (xilaenv, XILAENV) (9, F77_CONST_CHAR_ARG2 ("ZGELSD", 6), | |
10314
07ebe522dac2
untabify liboctave C++ sources
John W. Eaton <jwe@octave.org>
parents:
10213
diff
changeset
|
2607 F77_CONST_CHAR_ARG2 (" ", 1), |
07ebe522dac2
untabify liboctave C++ sources
John W. Eaton <jwe@octave.org>
parents:
10213
diff
changeset
|
2608 0, 0, 0, 0, smlsiz |
07ebe522dac2
untabify liboctave C++ sources
John W. Eaton <jwe@octave.org>
parents:
10213
diff
changeset
|
2609 F77_CHAR_ARG_LEN (6) |
07ebe522dac2
untabify liboctave C++ sources
John W. Eaton <jwe@octave.org>
parents:
10213
diff
changeset
|
2610 F77_CHAR_ARG_LEN (1)); |
7079 | 2611 |
7486
6a6d2abe51ff
more xGELSD workspace fixes
John W. Eaton <jwe@octave.org>
parents:
7482
diff
changeset
|
2612 octave_idx_type mnthr; |
6a6d2abe51ff
more xGELSD workspace fixes
John W. Eaton <jwe@octave.org>
parents:
7482
diff
changeset
|
2613 F77_FUNC (xilaenv, XILAENV) (6, F77_CONST_CHAR_ARG2 ("ZGELSD", 6), |
10314
07ebe522dac2
untabify liboctave C++ sources
John W. Eaton <jwe@octave.org>
parents:
10213
diff
changeset
|
2614 F77_CONST_CHAR_ARG2 (" ", 1), |
07ebe522dac2
untabify liboctave C++ sources
John W. Eaton <jwe@octave.org>
parents:
10213
diff
changeset
|
2615 m, n, nrhs, -1, mnthr |
07ebe522dac2
untabify liboctave C++ sources
John W. Eaton <jwe@octave.org>
parents:
10213
diff
changeset
|
2616 F77_CHAR_ARG_LEN (6) |
07ebe522dac2
untabify liboctave C++ sources
John W. Eaton <jwe@octave.org>
parents:
10213
diff
changeset
|
2617 F77_CHAR_ARG_LEN (1)); |
7486
6a6d2abe51ff
more xGELSD workspace fixes
John W. Eaton <jwe@octave.org>
parents:
7482
diff
changeset
|
2618 |
7079 | 2619 // We compute the size of rwork and iwork because ZGELSD in |
2620 // older versions of LAPACK does not return them on a query | |
2621 // call. | |
7124 | 2622 double dminmn = static_cast<double> (minmn); |
2623 double dsmlsizp1 = static_cast<double> (smlsiz+1); | |
21782
2aef506f3fec
use namespace for lo-mappers.h functions
John W. Eaton <jwe@octave.org>
parents:
21751
diff
changeset
|
2624 double tmp = octave::math::log2 (dminmn / dsmlsizp1); |
18847
ff4da3c8ed16
use gnulib log2 modules (bug #42583)
John W. Eaton <jwe@octave.org>
parents:
17769
diff
changeset
|
2625 |
7544
f9983d2761df
more xGELSD workspace fixes
Jaroslav Hajek <highegg@gmail.com>
parents:
7532
diff
changeset
|
2626 octave_idx_type nlvl = static_cast<octave_idx_type> (tmp) + 1; |
7079 | 2627 if (nlvl < 0) |
10314
07ebe522dac2
untabify liboctave C++ sources
John W. Eaton <jwe@octave.org>
parents:
10213
diff
changeset
|
2628 nlvl = 0; |
7079 | 2629 |
2630 octave_idx_type lrwork = minmn*(10 + 2*smlsiz + 8*nlvl) | |
17769
49a5a4be04a1
maint: Use GNU style coding conventions for code in liboctave/
Rik <rik@octave.org>
parents:
17744
diff
changeset
|
2631 + 3*smlsiz*nrhs |
49a5a4be04a1
maint: Use GNU style coding conventions for code in liboctave/
Rik <rik@octave.org>
parents:
17744
diff
changeset
|
2632 + std::max ((smlsiz+1)*(smlsiz+1), |
49a5a4be04a1
maint: Use GNU style coding conventions for code in liboctave/
Rik <rik@octave.org>
parents:
17744
diff
changeset
|
2633 n*(1+nrhs) + 2*nrhs); |
7079 | 2634 if (lrwork < 1) |
10314
07ebe522dac2
untabify liboctave C++ sources
John W. Eaton <jwe@octave.org>
parents:
10213
diff
changeset
|
2635 lrwork = 1; |
11570
57632dea2446
attempt better backward compatibility for Array constructors
John W. Eaton <jwe@octave.org>
parents:
11523
diff
changeset
|
2636 Array<double> rwork (dim_vector (lrwork, 1)); |
7079 | 2637 double *prwork = rwork.fortran_vec (); |
2638 | |
2639 octave_idx_type liwork = 3 * minmn * nlvl + 11 * minmn; | |
2640 if (liwork < 1) | |
10314
07ebe522dac2
untabify liboctave C++ sources
John W. Eaton <jwe@octave.org>
parents:
10213
diff
changeset
|
2641 liwork = 1; |
11570
57632dea2446
attempt better backward compatibility for Array constructors
John W. Eaton <jwe@octave.org>
parents:
11523
diff
changeset
|
2642 Array<octave_idx_type> iwork (dim_vector (liwork, 1)); |
7079 | 2643 octave_idx_type* piwork = iwork.fortran_vec (); |
7072 | 2644 |
22135
407c66ae1e20
reduce warnings from GCC's link-time optimization feature (bug #48531)
John W. Eaton <jwe@octave.org>
parents:
22133
diff
changeset
|
2645 F77_XFCN (zgelsd, ZGELSD, (m, n, nrhs, F77_DBLE_CMPLX_ARG (tmp_data), m, F77_DBLE_CMPLX_ARG (pretval), maxmn, |
407c66ae1e20
reduce warnings from GCC's link-time optimization feature (bug #48531)
John W. Eaton <jwe@octave.org>
parents:
22133
diff
changeset
|
2646 ps, rcon, rank, F77_DBLE_CMPLX_ARG (work.fortran_vec ()), |
10314
07ebe522dac2
untabify liboctave C++ sources
John W. Eaton <jwe@octave.org>
parents:
10213
diff
changeset
|
2647 lwork, prwork, piwork, info)); |
1948 | 2648 |
7476 | 2649 // The workspace query is broken in at least LAPACK 3.0.0 |
7488
6470f946a425
another small xGELSD workspace fix
John W. Eaton <jwe@octave.org>
parents:
7486
diff
changeset
|
2650 // through 3.1.1 when n >= mnthr. The obtuse formula below |
7486
6a6d2abe51ff
more xGELSD workspace fixes
John W. Eaton <jwe@octave.org>
parents:
7482
diff
changeset
|
2651 // should provide sufficient workspace for ZGELSD to operate |
7476 | 2652 // efficiently. |
10813
2c2d4a2f1047
fix workspace bug workaround for xGELSD (since 7486:6a6d2abe51ff)
Jaroslav Hajek <highegg@gmail.com>
parents:
10806
diff
changeset
|
2653 if (n > m && n >= mnthr) |
10314
07ebe522dac2
untabify liboctave C++ sources
John W. Eaton <jwe@octave.org>
parents:
10213
diff
changeset
|
2654 { |
07ebe522dac2
untabify liboctave C++ sources
John W. Eaton <jwe@octave.org>
parents:
10213
diff
changeset
|
2655 octave_idx_type addend = m; |
07ebe522dac2
untabify liboctave C++ sources
John W. Eaton <jwe@octave.org>
parents:
10213
diff
changeset
|
2656 |
07ebe522dac2
untabify liboctave C++ sources
John W. Eaton <jwe@octave.org>
parents:
10213
diff
changeset
|
2657 if (2*m-4 > addend) |
07ebe522dac2
untabify liboctave C++ sources
John W. Eaton <jwe@octave.org>
parents:
10213
diff
changeset
|
2658 addend = 2*m-4; |
07ebe522dac2
untabify liboctave C++ sources
John W. Eaton <jwe@octave.org>
parents:
10213
diff
changeset
|
2659 |
07ebe522dac2
untabify liboctave C++ sources
John W. Eaton <jwe@octave.org>
parents:
10213
diff
changeset
|
2660 if (nrhs > addend) |
07ebe522dac2
untabify liboctave C++ sources
John W. Eaton <jwe@octave.org>
parents:
10213
diff
changeset
|
2661 addend = nrhs; |
07ebe522dac2
untabify liboctave C++ sources
John W. Eaton <jwe@octave.org>
parents:
10213
diff
changeset
|
2662 |
07ebe522dac2
untabify liboctave C++ sources
John W. Eaton <jwe@octave.org>
parents:
10213
diff
changeset
|
2663 if (n-3*m > addend) |
07ebe522dac2
untabify liboctave C++ sources
John W. Eaton <jwe@octave.org>
parents:
10213
diff
changeset
|
2664 addend = n-3*m; |
07ebe522dac2
untabify liboctave C++ sources
John W. Eaton <jwe@octave.org>
parents:
10213
diff
changeset
|
2665 |
07ebe522dac2
untabify liboctave C++ sources
John W. Eaton <jwe@octave.org>
parents:
10213
diff
changeset
|
2666 const octave_idx_type lworkaround = 4*m + m*m + addend; |
07ebe522dac2
untabify liboctave C++ sources
John W. Eaton <jwe@octave.org>
parents:
10213
diff
changeset
|
2667 |
07ebe522dac2
untabify liboctave C++ sources
John W. Eaton <jwe@octave.org>
parents:
10213
diff
changeset
|
2668 if (std::real (work(0)) < lworkaround) |
07ebe522dac2
untabify liboctave C++ sources
John W. Eaton <jwe@octave.org>
parents:
10213
diff
changeset
|
2669 work(0) = lworkaround; |
07ebe522dac2
untabify liboctave C++ sources
John W. Eaton <jwe@octave.org>
parents:
10213
diff
changeset
|
2670 } |
7532
493bb0de3199
avoid another xGELSD workspace query bug
John W. Eaton <jwe@octave.org>
parents:
7503
diff
changeset
|
2671 else if (m >= n) |
10314
07ebe522dac2
untabify liboctave C++ sources
John W. Eaton <jwe@octave.org>
parents:
10213
diff
changeset
|
2672 { |
07ebe522dac2
untabify liboctave C++ sources
John W. Eaton <jwe@octave.org>
parents:
10213
diff
changeset
|
2673 octave_idx_type lworkaround = 2*m + m*nrhs; |
07ebe522dac2
untabify liboctave C++ sources
John W. Eaton <jwe@octave.org>
parents:
10213
diff
changeset
|
2674 |
07ebe522dac2
untabify liboctave C++ sources
John W. Eaton <jwe@octave.org>
parents:
10213
diff
changeset
|
2675 if (std::real (work(0)) < lworkaround) |
07ebe522dac2
untabify liboctave C++ sources
John W. Eaton <jwe@octave.org>
parents:
10213
diff
changeset
|
2676 work(0) = lworkaround; |
07ebe522dac2
untabify liboctave C++ sources
John W. Eaton <jwe@octave.org>
parents:
10213
diff
changeset
|
2677 } |
7476 | 2678 |
7482
29980c6b8604
don't check f77_exception_encountered
John W. Eaton <jwe@octave.org>
parents:
7478
diff
changeset
|
2679 lwork = static_cast<octave_idx_type> (std::real (work(0))); |
11574
a83bad07f7e3
attempt better backward compatibility for Array resize functions
John W. Eaton <jwe@octave.org>
parents:
11570
diff
changeset
|
2680 work.resize (dim_vector (lwork, 1)); |
7482
29980c6b8604
don't check f77_exception_encountered
John W. Eaton <jwe@octave.org>
parents:
7478
diff
changeset
|
2681 |
22135
407c66ae1e20
reduce warnings from GCC's link-time optimization feature (bug #48531)
John W. Eaton <jwe@octave.org>
parents:
22133
diff
changeset
|
2682 F77_XFCN (zgelsd, ZGELSD, (m, n, nrhs, F77_DBLE_CMPLX_ARG (tmp_data), m, F77_DBLE_CMPLX_ARG (pretval), |
10314
07ebe522dac2
untabify liboctave C++ sources
John W. Eaton <jwe@octave.org>
parents:
10213
diff
changeset
|
2683 maxmn, ps, rcon, rank, |
22135
407c66ae1e20
reduce warnings from GCC's link-time optimization feature (bug #48531)
John W. Eaton <jwe@octave.org>
parents:
22133
diff
changeset
|
2684 F77_DBLE_CMPLX_ARG (work.fortran_vec ()), lwork, |
10314
07ebe522dac2
untabify liboctave C++ sources
John W. Eaton <jwe@octave.org>
parents:
10213
diff
changeset
|
2685 prwork, piwork, info)); |
7482
29980c6b8604
don't check f77_exception_encountered
John W. Eaton <jwe@octave.org>
parents:
7478
diff
changeset
|
2686 |
29980c6b8604
don't check f77_exception_encountered
John W. Eaton <jwe@octave.org>
parents:
7478
diff
changeset
|
2687 if (s.elem (0) == 0.0) |
10314
07ebe522dac2
untabify liboctave C++ sources
John W. Eaton <jwe@octave.org>
parents:
10213
diff
changeset
|
2688 rcon = 0.0; |
1948 | 2689 else |
10314
07ebe522dac2
untabify liboctave C++ sources
John W. Eaton <jwe@octave.org>
parents:
10213
diff
changeset
|
2690 rcon = s.elem (minmn - 1) / s.elem (0); |
7482
29980c6b8604
don't check f77_exception_encountered
John W. Eaton <jwe@octave.org>
parents:
7478
diff
changeset
|
2691 |
29980c6b8604
don't check f77_exception_encountered
John W. Eaton <jwe@octave.org>
parents:
7478
diff
changeset
|
2692 retval.resize (n, nrhs); |
458 | 2693 } |
2694 | |
2695 return retval; | |
2696 } | |
2697 | |
2698 ComplexColumnVector | |
3585 | 2699 ComplexMatrix::lssolve (const ColumnVector& b) const |
2700 { | |
5275 | 2701 octave_idx_type info; |
2702 octave_idx_type rank; | |
7788 | 2703 double rcon; |
2704 return lssolve (ComplexColumnVector (b), info, rank, rcon); | |
3585 | 2705 } |
2706 | |
2707 ComplexColumnVector | |
5275 | 2708 ComplexMatrix::lssolve (const ColumnVector& b, octave_idx_type& info) const |
3585 | 2709 { |
5275 | 2710 octave_idx_type rank; |
7788 | 2711 double rcon; |
2712 return lssolve (ComplexColumnVector (b), info, rank, rcon); | |
3585 | 2713 } |
2714 | |
2715 ComplexColumnVector | |
11586
12df7854fa7c
strip trailing whitespace from source files
John W. Eaton <jwe@octave.org>
parents:
11574
diff
changeset
|
2716 ComplexMatrix::lssolve (const ColumnVector& b, octave_idx_type& info, |
10314
07ebe522dac2
untabify liboctave C++ sources
John W. Eaton <jwe@octave.org>
parents:
10213
diff
changeset
|
2717 octave_idx_type& rank) const |
3585 | 2718 { |
7788 | 2719 double rcon; |
2720 return lssolve (ComplexColumnVector (b), info, rank, rcon); | |
7076 | 2721 } |
2722 | |
2723 ComplexColumnVector | |
11586
12df7854fa7c
strip trailing whitespace from source files
John W. Eaton <jwe@octave.org>
parents:
11574
diff
changeset
|
2724 ComplexMatrix::lssolve (const ColumnVector& b, octave_idx_type& info, |
10314
07ebe522dac2
untabify liboctave C++ sources
John W. Eaton <jwe@octave.org>
parents:
10213
diff
changeset
|
2725 octave_idx_type& rank, double& rcon) const |
7076 | 2726 { |
7788 | 2727 return lssolve (ComplexColumnVector (b), info, rank, rcon); |
3585 | 2728 } |
2729 | |
2730 ComplexColumnVector | |
458 | 2731 ComplexMatrix::lssolve (const ComplexColumnVector& b) const |
2732 { | |
5275 | 2733 octave_idx_type info; |
2734 octave_idx_type rank; | |
7788 | 2735 double rcon; |
2736 return lssolve (b, info, rank, rcon); | |
458 | 2737 } |
2738 | |
2739 ComplexColumnVector | |
17769
49a5a4be04a1
maint: Use GNU style coding conventions for code in liboctave/
Rik <rik@octave.org>
parents:
17744
diff
changeset
|
2740 ComplexMatrix::lssolve (const ComplexColumnVector& b, |
49a5a4be04a1
maint: Use GNU style coding conventions for code in liboctave/
Rik <rik@octave.org>
parents:
17744
diff
changeset
|
2741 octave_idx_type& info) const |
458 | 2742 { |
5275 | 2743 octave_idx_type rank; |
7788 | 2744 double rcon; |
2745 return lssolve (b, info, rank, rcon); | |
458 | 2746 } |
2747 | |
2748 ComplexColumnVector | |
5275 | 2749 ComplexMatrix::lssolve (const ComplexColumnVector& b, octave_idx_type& info, |
10314
07ebe522dac2
untabify liboctave C++ sources
John W. Eaton <jwe@octave.org>
parents:
10213
diff
changeset
|
2750 octave_idx_type& rank) const |
458 | 2751 { |
7788 | 2752 double rcon; |
2753 return lssolve (b, info, rank, rcon); | |
7076 | 2754 |
2755 } | |
2756 | |
2757 ComplexColumnVector | |
2758 ComplexMatrix::lssolve (const ComplexColumnVector& b, octave_idx_type& info, | |
10314
07ebe522dac2
untabify liboctave C++ sources
John W. Eaton <jwe@octave.org>
parents:
10213
diff
changeset
|
2759 octave_idx_type& rank, double& rcon) const |
7076 | 2760 { |
1948 | 2761 ComplexColumnVector retval; |
2762 | |
5275 | 2763 octave_idx_type nrhs = 1; |
2764 | |
2765 octave_idx_type m = rows (); | |
2766 octave_idx_type n = cols (); | |
458 | 2767 |
20232
a9574e3c6e9e
Deprecate Array::length() and Sparse::length() in favour of ::numel().
Carnë Draug <carandraug@octave.org>
parents:
20218
diff
changeset
|
2768 if (m != b.numel ()) |
1948 | 2769 (*current_liboctave_error_handler) |
6924 | 2770 ("matrix dimension mismatch solution of linear equations"); |
21136
7cac4e7458f2
maint: clean up code around calls to current_liboctave_error_handler.
Rik <rik@octave.org>
parents:
21129
diff
changeset
|
2771 |
7cac4e7458f2
maint: clean up code around calls to current_liboctave_error_handler.
Rik <rik@octave.org>
parents:
21129
diff
changeset
|
2772 if (m == 0 || n == 0 || b.cols () == 0) |
6924 | 2773 retval = ComplexColumnVector (n, Complex (0.0, 0.0)); |
1948 | 2774 else |
458 | 2775 { |
7072 | 2776 volatile octave_idx_type minmn = (m < n ? m : n); |
2777 octave_idx_type maxmn = m > n ? m : n; | |
7788 | 2778 rcon = -1.0; |
7072 | 2779 |
2780 if (m != n) | |
10314
07ebe522dac2
untabify liboctave C++ sources
John W. Eaton <jwe@octave.org>
parents:
10213
diff
changeset
|
2781 { |
07ebe522dac2
untabify liboctave C++ sources
John W. Eaton <jwe@octave.org>
parents:
10213
diff
changeset
|
2782 retval = ComplexColumnVector (maxmn); |
07ebe522dac2
untabify liboctave C++ sources
John W. Eaton <jwe@octave.org>
parents:
10213
diff
changeset
|
2783 |
07ebe522dac2
untabify liboctave C++ sources
John W. Eaton <jwe@octave.org>
parents:
10213
diff
changeset
|
2784 for (octave_idx_type i = 0; i < m; i++) |
07ebe522dac2
untabify liboctave C++ sources
John W. Eaton <jwe@octave.org>
parents:
10213
diff
changeset
|
2785 retval.elem (i) = b.elem (i); |
07ebe522dac2
untabify liboctave C++ sources
John W. Eaton <jwe@octave.org>
parents:
10213
diff
changeset
|
2786 } |
7072 | 2787 else |
10314
07ebe522dac2
untabify liboctave C++ sources
John W. Eaton <jwe@octave.org>
parents:
10213
diff
changeset
|
2788 retval = b; |
7072 | 2789 |
1948 | 2790 ComplexMatrix atmp = *this; |
2791 Complex *tmp_data = atmp.fortran_vec (); | |
2792 | |
7072 | 2793 Complex *pretval = retval.fortran_vec (); |
11570
57632dea2446
attempt better backward compatibility for Array constructors
John W. Eaton <jwe@octave.org>
parents:
11523
diff
changeset
|
2794 Array<double> s (dim_vector (minmn, 1)); |
7071 | 2795 double *ps = s.fortran_vec (); |
1948 | 2796 |
7072 | 2797 // Ask ZGELSD what the dimension of WORK should be. |
5275 | 2798 octave_idx_type lwork = -1; |
3752 | 2799 |
11570
57632dea2446
attempt better backward compatibility for Array constructors
John W. Eaton <jwe@octave.org>
parents:
11523
diff
changeset
|
2800 Array<Complex> work (dim_vector (1, 1)); |
7079 | 2801 |
7544
f9983d2761df
more xGELSD workspace fixes
Jaroslav Hajek <highegg@gmail.com>
parents:
7532
diff
changeset
|
2802 octave_idx_type smlsiz; |
f9983d2761df
more xGELSD workspace fixes
Jaroslav Hajek <highegg@gmail.com>
parents:
7532
diff
changeset
|
2803 F77_FUNC (xilaenv, XILAENV) (9, F77_CONST_CHAR_ARG2 ("ZGELSD", 6), |
10314
07ebe522dac2
untabify liboctave C++ sources
John W. Eaton <jwe@octave.org>
parents:
10213
diff
changeset
|
2804 F77_CONST_CHAR_ARG2 (" ", 1), |
07ebe522dac2
untabify liboctave C++ sources
John W. Eaton <jwe@octave.org>
parents:
10213
diff
changeset
|
2805 0, 0, 0, 0, smlsiz |
07ebe522dac2
untabify liboctave C++ sources
John W. Eaton <jwe@octave.org>
parents:
10213
diff
changeset
|
2806 F77_CHAR_ARG_LEN (6) |
07ebe522dac2
untabify liboctave C++ sources
John W. Eaton <jwe@octave.org>
parents:
10213
diff
changeset
|
2807 F77_CHAR_ARG_LEN (1)); |
7079 | 2808 |
2809 // We compute the size of rwork and iwork because ZGELSD in | |
2810 // older versions of LAPACK does not return them on a query | |
2811 // call. | |
7124 | 2812 double dminmn = static_cast<double> (minmn); |
2813 double dsmlsizp1 = static_cast<double> (smlsiz+1); | |
21782
2aef506f3fec
use namespace for lo-mappers.h functions
John W. Eaton <jwe@octave.org>
parents:
21751
diff
changeset
|
2814 double tmp = octave::math::log2 (dminmn / dsmlsizp1); |
18847
ff4da3c8ed16
use gnulib log2 modules (bug #42583)
John W. Eaton <jwe@octave.org>
parents:
17769
diff
changeset
|
2815 |
7544
f9983d2761df
more xGELSD workspace fixes
Jaroslav Hajek <highegg@gmail.com>
parents:
7532
diff
changeset
|
2816 octave_idx_type nlvl = static_cast<octave_idx_type> (tmp) + 1; |
7079 | 2817 if (nlvl < 0) |
10314
07ebe522dac2
untabify liboctave C++ sources
John W. Eaton <jwe@octave.org>
parents:
10213
diff
changeset
|
2818 nlvl = 0; |
7079 | 2819 |
2820 octave_idx_type lrwork = minmn*(10 + 2*smlsiz + 8*nlvl) | |
17769
49a5a4be04a1
maint: Use GNU style coding conventions for code in liboctave/
Rik <rik@octave.org>
parents:
17744
diff
changeset
|
2821 + 3*smlsiz*nrhs + (smlsiz+1)*(smlsiz+1); |
7079 | 2822 if (lrwork < 1) |
10314
07ebe522dac2
untabify liboctave C++ sources
John W. Eaton <jwe@octave.org>
parents:
10213
diff
changeset
|
2823 lrwork = 1; |
11570
57632dea2446
attempt better backward compatibility for Array constructors
John W. Eaton <jwe@octave.org>
parents:
11523
diff
changeset
|
2824 Array<double> rwork (dim_vector (lrwork, 1)); |
7079 | 2825 double *prwork = rwork.fortran_vec (); |
2826 | |
2827 octave_idx_type liwork = 3 * minmn * nlvl + 11 * minmn; | |
2828 if (liwork < 1) | |
10314
07ebe522dac2
untabify liboctave C++ sources
John W. Eaton <jwe@octave.org>
parents:
10213
diff
changeset
|
2829 liwork = 1; |
11570
57632dea2446
attempt better backward compatibility for Array constructors
John W. Eaton <jwe@octave.org>
parents:
11523
diff
changeset
|
2830 Array<octave_idx_type> iwork (dim_vector (liwork, 1)); |
7079 | 2831 octave_idx_type* piwork = iwork.fortran_vec (); |
7072 | 2832 |
22135
407c66ae1e20
reduce warnings from GCC's link-time optimization feature (bug #48531)
John W. Eaton <jwe@octave.org>
parents:
22133
diff
changeset
|
2833 F77_XFCN (zgelsd, ZGELSD, (m, n, nrhs, F77_DBLE_CMPLX_ARG (tmp_data), m, F77_DBLE_CMPLX_ARG (pretval), maxmn, |
407c66ae1e20
reduce warnings from GCC's link-time optimization feature (bug #48531)
John W. Eaton <jwe@octave.org>
parents:
22133
diff
changeset
|
2834 ps, rcon, rank, F77_DBLE_CMPLX_ARG (work.fortran_vec ()), |
10314
07ebe522dac2
untabify liboctave C++ sources
John W. Eaton <jwe@octave.org>
parents:
10213
diff
changeset
|
2835 lwork, prwork, piwork, info)); |
1948 | 2836 |
7482
29980c6b8604
don't check f77_exception_encountered
John W. Eaton <jwe@octave.org>
parents:
7478
diff
changeset
|
2837 lwork = static_cast<octave_idx_type> (std::real (work(0))); |
11574
a83bad07f7e3
attempt better backward compatibility for Array resize functions
John W. Eaton <jwe@octave.org>
parents:
11570
diff
changeset
|
2838 work.resize (dim_vector (lwork, 1)); |
a83bad07f7e3
attempt better backward compatibility for Array resize functions
John W. Eaton <jwe@octave.org>
parents:
11570
diff
changeset
|
2839 rwork.resize (dim_vector (static_cast<octave_idx_type> (rwork(0)), 1)); |
a83bad07f7e3
attempt better backward compatibility for Array resize functions
John W. Eaton <jwe@octave.org>
parents:
11570
diff
changeset
|
2840 iwork.resize (dim_vector (iwork(0), 1)); |
7482
29980c6b8604
don't check f77_exception_encountered
John W. Eaton <jwe@octave.org>
parents:
7478
diff
changeset
|
2841 |
22135
407c66ae1e20
reduce warnings from GCC's link-time optimization feature (bug #48531)
John W. Eaton <jwe@octave.org>
parents:
22133
diff
changeset
|
2842 F77_XFCN (zgelsd, ZGELSD, (m, n, nrhs, F77_DBLE_CMPLX_ARG (tmp_data), m, F77_DBLE_CMPLX_ARG (pretval), |
10314
07ebe522dac2
untabify liboctave C++ sources
John W. Eaton <jwe@octave.org>
parents:
10213
diff
changeset
|
2843 maxmn, ps, rcon, rank, |
22135
407c66ae1e20
reduce warnings from GCC's link-time optimization feature (bug #48531)
John W. Eaton <jwe@octave.org>
parents:
22133
diff
changeset
|
2844 F77_DBLE_CMPLX_ARG (work.fortran_vec ()), lwork, |
10314
07ebe522dac2
untabify liboctave C++ sources
John W. Eaton <jwe@octave.org>
parents:
10213
diff
changeset
|
2845 prwork, piwork, info)); |
7482
29980c6b8604
don't check f77_exception_encountered
John W. Eaton <jwe@octave.org>
parents:
7478
diff
changeset
|
2846 |
29980c6b8604
don't check f77_exception_encountered
John W. Eaton <jwe@octave.org>
parents:
7478
diff
changeset
|
2847 if (rank < minmn) |
10314
07ebe522dac2
untabify liboctave C++ sources
John W. Eaton <jwe@octave.org>
parents:
10213
diff
changeset
|
2848 { |
07ebe522dac2
untabify liboctave C++ sources
John W. Eaton <jwe@octave.org>
parents:
10213
diff
changeset
|
2849 if (s.elem (0) == 0.0) |
07ebe522dac2
untabify liboctave C++ sources
John W. Eaton <jwe@octave.org>
parents:
10213
diff
changeset
|
2850 rcon = 0.0; |
07ebe522dac2
untabify liboctave C++ sources
John W. Eaton <jwe@octave.org>
parents:
10213
diff
changeset
|
2851 else |
07ebe522dac2
untabify liboctave C++ sources
John W. Eaton <jwe@octave.org>
parents:
10213
diff
changeset
|
2852 rcon = s.elem (minmn - 1) / s.elem (0); |
07ebe522dac2
untabify liboctave C++ sources
John W. Eaton <jwe@octave.org>
parents:
10213
diff
changeset
|
2853 |
07ebe522dac2
untabify liboctave C++ sources
John W. Eaton <jwe@octave.org>
parents:
10213
diff
changeset
|
2854 retval.resize (n, nrhs); |
07ebe522dac2
untabify liboctave C++ sources
John W. Eaton <jwe@octave.org>
parents:
10213
diff
changeset
|
2855 } |
458 | 2856 } |
2857 | |
2858 return retval; | |
2859 } | |
2860 | |
1205 | 2861 // column vector by row vector -> matrix operations |
2862 | |
2863 ComplexMatrix | |
2864 operator * (const ColumnVector& v, const ComplexRowVector& a) | |
2865 { | |
2866 ComplexColumnVector tmp (v); | |
2867 return tmp * a; | |
2868 } | |
2869 | |
2870 ComplexMatrix | |
2871 operator * (const ComplexColumnVector& a, const RowVector& b) | |
2872 { | |
2873 ComplexRowVector tmp (b); | |
2874 return a * tmp; | |
2875 } | |
2876 | |
2877 ComplexMatrix | |
2878 operator * (const ComplexColumnVector& v, const ComplexRowVector& a) | |
2879 { | |
1948 | 2880 ComplexMatrix retval; |
2881 | |
20232
a9574e3c6e9e
Deprecate Array::length() and Sparse::length() in favour of ::numel().
Carnë Draug <carandraug@octave.org>
parents:
20218
diff
changeset
|
2882 octave_idx_type len = v.numel (); |
3233 | 2883 |
2884 if (len != 0) | |
1205 | 2885 { |
20232
a9574e3c6e9e
Deprecate Array::length() and Sparse::length() in favour of ::numel().
Carnë Draug <carandraug@octave.org>
parents:
20218
diff
changeset
|
2886 octave_idx_type a_len = a.numel (); |
3233 | 2887 |
9359
be6867ba8104
avoid useless zero initialization when doing matrix multiply
Jaroslav Hajek <highegg@gmail.com>
parents:
9227
diff
changeset
|
2888 retval = ComplexMatrix (len, a_len); |
3233 | 2889 Complex *c = retval.fortran_vec (); |
2890 | |
4552 | 2891 F77_XFCN (zgemm, ZGEMM, (F77_CONST_CHAR_ARG2 ("N", 1), |
10314
07ebe522dac2
untabify liboctave C++ sources
John W. Eaton <jwe@octave.org>
parents:
10213
diff
changeset
|
2892 F77_CONST_CHAR_ARG2 ("N", 1), |
22135
407c66ae1e20
reduce warnings from GCC's link-time optimization feature (bug #48531)
John W. Eaton <jwe@octave.org>
parents:
22133
diff
changeset
|
2893 len, a_len, 1, 1.0, F77_CONST_DBLE_CMPLX_ARG (v.data ()), len, |
407c66ae1e20
reduce warnings from GCC's link-time optimization feature (bug #48531)
John W. Eaton <jwe@octave.org>
parents:
22133
diff
changeset
|
2894 F77_CONST_DBLE_CMPLX_ARG (a.data ()), 1, 0.0, F77_DBLE_CMPLX_ARG (c), len |
10314
07ebe522dac2
untabify liboctave C++ sources
John W. Eaton <jwe@octave.org>
parents:
10213
diff
changeset
|
2895 F77_CHAR_ARG_LEN (1) |
07ebe522dac2
untabify liboctave C++ sources
John W. Eaton <jwe@octave.org>
parents:
10213
diff
changeset
|
2896 F77_CHAR_ARG_LEN (1))); |
1205 | 2897 } |
2898 | |
1948 | 2899 return retval; |
1205 | 2900 } |
2901 | |
458 | 2902 // matrix by diagonal matrix -> matrix operations |
2903 | |
2904 ComplexMatrix& | |
2905 ComplexMatrix::operator += (const DiagMatrix& a) | |
2906 { | |
5275 | 2907 octave_idx_type nr = rows (); |
2908 octave_idx_type nc = cols (); | |
2909 | |
2910 octave_idx_type a_nr = rows (); | |
2911 octave_idx_type a_nc = cols (); | |
2384 | 2912 |
2913 if (nr != a_nr || nc != a_nc) | |
21129
228b65504557
maint: Eliminate useless statements after err_XXX.
Rik <rik@octave.org>
parents:
21120
diff
changeset
|
2914 err_nonconformant ("operator +=", nr, nc, a_nr, a_nc); |
458 | 2915 |
5275 | 2916 for (octave_idx_type i = 0; i < a.length (); i++) |
458 | 2917 elem (i, i) += a.elem (i, i); |
2918 | |
2919 return *this; | |
2920 } | |
2921 | |
2922 ComplexMatrix& | |
2923 ComplexMatrix::operator -= (const DiagMatrix& a) | |
2924 { | |
5275 | 2925 octave_idx_type nr = rows (); |
2926 octave_idx_type nc = cols (); | |
2927 | |
2928 octave_idx_type a_nr = rows (); | |
2929 octave_idx_type a_nc = cols (); | |
2384 | 2930 |
2931 if (nr != a_nr || nc != a_nc) | |
21129
228b65504557
maint: Eliminate useless statements after err_XXX.
Rik <rik@octave.org>
parents:
21120
diff
changeset
|
2932 err_nonconformant ("operator -=", nr, nc, a_nr, a_nc); |
458 | 2933 |
5275 | 2934 for (octave_idx_type i = 0; i < a.length (); i++) |
458 | 2935 elem (i, i) -= a.elem (i, i); |
2936 | |
2937 return *this; | |
2938 } | |
2939 | |
2940 ComplexMatrix& | |
2941 ComplexMatrix::operator += (const ComplexDiagMatrix& a) | |
2942 { | |
5275 | 2943 octave_idx_type nr = rows (); |
2944 octave_idx_type nc = cols (); | |
2945 | |
2946 octave_idx_type a_nr = rows (); | |
2947 octave_idx_type a_nc = cols (); | |
2384 | 2948 |
2949 if (nr != a_nr || nc != a_nc) | |
21129
228b65504557
maint: Eliminate useless statements after err_XXX.
Rik <rik@octave.org>
parents:
21120
diff
changeset
|
2950 err_nonconformant ("operator +=", nr, nc, a_nr, a_nc); |
458 | 2951 |
5275 | 2952 for (octave_idx_type i = 0; i < a.length (); i++) |
458 | 2953 elem (i, i) += a.elem (i, i); |
2954 | |
2955 return *this; | |
2956 } | |
2957 | |
2958 ComplexMatrix& | |
2959 ComplexMatrix::operator -= (const ComplexDiagMatrix& a) | |
2960 { | |
5275 | 2961 octave_idx_type nr = rows (); |
2962 octave_idx_type nc = cols (); | |
2963 | |
2964 octave_idx_type a_nr = rows (); | |
2965 octave_idx_type a_nc = cols (); | |
2384 | 2966 |
2967 if (nr != a_nr || nc != a_nc) | |
21129
228b65504557
maint: Eliminate useless statements after err_XXX.
Rik <rik@octave.org>
parents:
21120
diff
changeset
|
2968 err_nonconformant ("operator -=", nr, nc, a_nr, a_nc); |
458 | 2969 |
5275 | 2970 for (octave_idx_type i = 0; i < a.length (); i++) |
458 | 2971 elem (i, i) -= a.elem (i, i); |
2972 | |
2973 return *this; | |
2974 } | |
2975 | |
2976 // matrix by matrix -> matrix operations | |
2977 | |
2978 ComplexMatrix& | |
2979 ComplexMatrix::operator += (const Matrix& a) | |
2980 { | |
5275 | 2981 octave_idx_type nr = rows (); |
2982 octave_idx_type nc = cols (); | |
2983 | |
2984 octave_idx_type a_nr = a.rows (); | |
2985 octave_idx_type a_nc = a.cols (); | |
2384 | 2986 |
2987 if (nr != a_nr || nc != a_nc) | |
21129
228b65504557
maint: Eliminate useless statements after err_XXX.
Rik <rik@octave.org>
parents:
21120
diff
changeset
|
2988 err_nonconformant ("operator +=", nr, nc, a_nr, a_nc); |
458 | 2989 |
2990 if (nr == 0 || nc == 0) | |
2991 return *this; | |
2992 | |
2993 Complex *d = fortran_vec (); // Ensures only one reference to my privates! | |
2994 | |
20232
a9574e3c6e9e
Deprecate Array::length() and Sparse::length() in favour of ::numel().
Carnë Draug <carandraug@octave.org>
parents:
20218
diff
changeset
|
2995 mx_inline_add2 (numel (), d, a.data ()); |
458 | 2996 return *this; |
2997 } | |
2998 | |
2999 ComplexMatrix& | |
3000 ComplexMatrix::operator -= (const Matrix& a) | |
3001 { | |
5275 | 3002 octave_idx_type nr = rows (); |
3003 octave_idx_type nc = cols (); | |
3004 | |
3005 octave_idx_type a_nr = a.rows (); | |
3006 octave_idx_type a_nc = a.cols (); | |
2384 | 3007 |
3008 if (nr != a_nr || nc != a_nc) | |
21129
228b65504557
maint: Eliminate useless statements after err_XXX.
Rik <rik@octave.org>
parents:
21120
diff
changeset
|
3009 err_nonconformant ("operator -=", nr, nc, a_nr, a_nc); |
458 | 3010 |
3011 if (nr == 0 || nc == 0) | |
3012 return *this; | |
3013 | |
3014 Complex *d = fortran_vec (); // Ensures only one reference to my privates! | |
3015 | |
20232
a9574e3c6e9e
Deprecate Array::length() and Sparse::length() in favour of ::numel().
Carnë Draug <carandraug@octave.org>
parents:
20218
diff
changeset
|
3016 mx_inline_sub2 (numel (), d, a.data ()); |
458 | 3017 return *this; |
3018 } | |
3019 | |
3020 // other operations | |
3021 | |
2832 | 3022 boolMatrix |
4015 | 3023 ComplexMatrix::all (int dim) const |
458 | 3024 { |
19321
3746b92739f7
Replace some duplicated code and count on methods implemented on base classes.
Carnë Draug <carandraug@octave.org>
parents:
19320
diff
changeset
|
3025 return ComplexNDArray::all (dim); |
458 | 3026 } |
3027 | |
2832 | 3028 boolMatrix |
4015 | 3029 ComplexMatrix::any (int dim) const |
458 | 3030 { |
19321
3746b92739f7
Replace some duplicated code and count on methods implemented on base classes.
Carnë Draug <carandraug@octave.org>
parents:
19320
diff
changeset
|
3031 return ComplexNDArray::any (dim); |
458 | 3032 } |
3033 | |
3034 ComplexMatrix | |
3723 | 3035 ComplexMatrix::cumprod (int dim) const |
458 | 3036 { |
19321
3746b92739f7
Replace some duplicated code and count on methods implemented on base classes.
Carnë Draug <carandraug@octave.org>
parents:
19320
diff
changeset
|
3037 return ComplexNDArray::cumprod (dim); |
458 | 3038 } |
3039 | |
3040 ComplexMatrix | |
3723 | 3041 ComplexMatrix::cumsum (int dim) const |
458 | 3042 { |
19321
3746b92739f7
Replace some duplicated code and count on methods implemented on base classes.
Carnë Draug <carandraug@octave.org>
parents:
19320
diff
changeset
|
3043 return ComplexNDArray::cumsum (dim); |
458 | 3044 } |
3045 | |
3046 ComplexMatrix | |
3723 | 3047 ComplexMatrix::prod (int dim) const |
458 | 3048 { |
19321
3746b92739f7
Replace some duplicated code and count on methods implemented on base classes.
Carnë Draug <carandraug@octave.org>
parents:
19320
diff
changeset
|
3049 return ComplexNDArray::prod (dim); |
458 | 3050 } |
3051 | |
3052 ComplexMatrix | |
3723 | 3053 ComplexMatrix::sum (int dim) const |
458 | 3054 { |
19321
3746b92739f7
Replace some duplicated code and count on methods implemented on base classes.
Carnë Draug <carandraug@octave.org>
parents:
19320
diff
changeset
|
3055 return ComplexNDArray::sum (dim); |
458 | 3056 } |
3057 | |
3058 ComplexMatrix | |
3723 | 3059 ComplexMatrix::sumsq (int dim) const |
458 | 3060 { |
19321
3746b92739f7
Replace some duplicated code and count on methods implemented on base classes.
Carnë Draug <carandraug@octave.org>
parents:
19320
diff
changeset
|
3061 return ComplexNDArray::sumsq (dim); |
458 | 3062 } |
3063 | |
19321
3746b92739f7
Replace some duplicated code and count on methods implemented on base classes.
Carnë Draug <carandraug@octave.org>
parents:
19320
diff
changeset
|
3064 Matrix |
3746b92739f7
Replace some duplicated code and count on methods implemented on base classes.
Carnë Draug <carandraug@octave.org>
parents:
19320
diff
changeset
|
3065 ComplexMatrix::abs (void) const |
4329 | 3066 { |
19321
3746b92739f7
Replace some duplicated code and count on methods implemented on base classes.
Carnë Draug <carandraug@octave.org>
parents:
19320
diff
changeset
|
3067 return ComplexNDArray::abs (); |
4329 | 3068 } |
3069 | |
7620
36594d5bbe13
Move diag function into the octave_value class
David Bateman <dbateman@free.fr>
parents:
7544
diff
changeset
|
3070 ComplexMatrix |
5275 | 3071 ComplexMatrix::diag (octave_idx_type k) const |
458 | 3072 { |
19320
d0c73e23a505
Change inheritance tree so that <T>Matrix inherit from <T>NDArray.
Carnë Draug <carandraug@octave.org>
parents:
19269
diff
changeset
|
3073 return ComplexNDArray::diag (k); |
458 | 3074 } |
3075 | |
14557
e8e86ae3abbc
make diag (x, m, n) return a proper diagonal matrix object (bug #36099)
John W. Eaton <jwe@octave.org>
parents:
14427
diff
changeset
|
3076 ComplexDiagMatrix |
e8e86ae3abbc
make diag (x, m, n) return a proper diagonal matrix object (bug #36099)
John W. Eaton <jwe@octave.org>
parents:
14427
diff
changeset
|
3077 ComplexMatrix::diag (octave_idx_type m, octave_idx_type n) const |
e8e86ae3abbc
make diag (x, m, n) return a proper diagonal matrix object (bug #36099)
John W. Eaton <jwe@octave.org>
parents:
14427
diff
changeset
|
3078 { |
e8e86ae3abbc
make diag (x, m, n) return a proper diagonal matrix object (bug #36099)
John W. Eaton <jwe@octave.org>
parents:
14427
diff
changeset
|
3079 octave_idx_type nr = rows (); |
e8e86ae3abbc
make diag (x, m, n) return a proper diagonal matrix object (bug #36099)
John W. Eaton <jwe@octave.org>
parents:
14427
diff
changeset
|
3080 octave_idx_type nc = cols (); |
e8e86ae3abbc
make diag (x, m, n) return a proper diagonal matrix object (bug #36099)
John W. Eaton <jwe@octave.org>
parents:
14427
diff
changeset
|
3081 |
21136
7cac4e7458f2
maint: clean up code around calls to current_liboctave_error_handler.
Rik <rik@octave.org>
parents:
21129
diff
changeset
|
3082 if (nr != 1 && nc != 1) |
7cac4e7458f2
maint: clean up code around calls to current_liboctave_error_handler.
Rik <rik@octave.org>
parents:
21129
diff
changeset
|
3083 (*current_liboctave_error_handler) ("diag: expecting vector argument"); |
7cac4e7458f2
maint: clean up code around calls to current_liboctave_error_handler.
Rik <rik@octave.org>
parents:
21129
diff
changeset
|
3084 |
7cac4e7458f2
maint: clean up code around calls to current_liboctave_error_handler.
Rik <rik@octave.org>
parents:
21129
diff
changeset
|
3085 return ComplexDiagMatrix (*this, m, n); |
14557
e8e86ae3abbc
make diag (x, m, n) return a proper diagonal matrix object (bug #36099)
John W. Eaton <jwe@octave.org>
parents:
14427
diff
changeset
|
3086 } |
e8e86ae3abbc
make diag (x, m, n) return a proper diagonal matrix object (bug #36099)
John W. Eaton <jwe@octave.org>
parents:
14427
diff
changeset
|
3087 |
2354 | 3088 bool |
5275 | 3089 ComplexMatrix::row_is_real_only (octave_idx_type i) const |
2354 | 3090 { |
3091 bool retval = true; | |
3092 | |
5275 | 3093 octave_idx_type nc = columns (); |
3094 | |
3095 for (octave_idx_type j = 0; j < nc; j++) | |
2354 | 3096 { |
5315 | 3097 if (std::imag (elem (i, j)) != 0.0) |
10314
07ebe522dac2
untabify liboctave C++ sources
John W. Eaton <jwe@octave.org>
parents:
10213
diff
changeset
|
3098 { |
07ebe522dac2
untabify liboctave C++ sources
John W. Eaton <jwe@octave.org>
parents:
10213
diff
changeset
|
3099 retval = false; |
07ebe522dac2
untabify liboctave C++ sources
John W. Eaton <jwe@octave.org>
parents:
10213
diff
changeset
|
3100 break; |
07ebe522dac2
untabify liboctave C++ sources
John W. Eaton <jwe@octave.org>
parents:
10213
diff
changeset
|
3101 } |
2354 | 3102 } |
3103 | |
11586
12df7854fa7c
strip trailing whitespace from source files
John W. Eaton <jwe@octave.org>
parents:
11574
diff
changeset
|
3104 return retval; |
2354 | 3105 } |
3106 | |
3107 bool | |
5275 | 3108 ComplexMatrix::column_is_real_only (octave_idx_type j) const |
2354 | 3109 { |
3110 bool retval = true; | |
3111 | |
5275 | 3112 octave_idx_type nr = rows (); |
3113 | |
3114 for (octave_idx_type i = 0; i < nr; i++) | |
2354 | 3115 { |
5315 | 3116 if (std::imag (elem (i, j)) != 0.0) |
10314
07ebe522dac2
untabify liboctave C++ sources
John W. Eaton <jwe@octave.org>
parents:
10213
diff
changeset
|
3117 { |
07ebe522dac2
untabify liboctave C++ sources
John W. Eaton <jwe@octave.org>
parents:
10213
diff
changeset
|
3118 retval = false; |
07ebe522dac2
untabify liboctave C++ sources
John W. Eaton <jwe@octave.org>
parents:
10213
diff
changeset
|
3119 break; |
07ebe522dac2
untabify liboctave C++ sources
John W. Eaton <jwe@octave.org>
parents:
10213
diff
changeset
|
3120 } |
2354 | 3121 } |
3122 | |
11586
12df7854fa7c
strip trailing whitespace from source files
John W. Eaton <jwe@octave.org>
parents:
11574
diff
changeset
|
3123 return retval; |
2354 | 3124 } |
891 | 3125 |
458 | 3126 ComplexColumnVector |
3127 ComplexMatrix::row_min (void) const | |
3128 { | |
5275 | 3129 Array<octave_idx_type> dummy_idx; |
4587 | 3130 return row_min (dummy_idx); |
458 | 3131 } |
3132 | |
3133 ComplexColumnVector | |
5275 | 3134 ComplexMatrix::row_min (Array<octave_idx_type>& idx_arg) const |
458 | 3135 { |
3136 ComplexColumnVector result; | |
3137 | |
5275 | 3138 octave_idx_type nr = rows (); |
3139 octave_idx_type nc = cols (); | |
458 | 3140 |
3141 if (nr > 0 && nc > 0) | |
3142 { | |
3143 result.resize (nr); | |
11574
a83bad07f7e3
attempt better backward compatibility for Array resize functions
John W. Eaton <jwe@octave.org>
parents:
11570
diff
changeset
|
3144 idx_arg.resize (dim_vector (nr, 1)); |
458 | 3145 |
5275 | 3146 for (octave_idx_type i = 0; i < nr; i++) |
458 | 3147 { |
10314
07ebe522dac2
untabify liboctave C++ sources
John W. Eaton <jwe@octave.org>
parents:
10213
diff
changeset
|
3148 bool real_only = row_is_real_only (i); |
07ebe522dac2
untabify liboctave C++ sources
John W. Eaton <jwe@octave.org>
parents:
10213
diff
changeset
|
3149 |
07ebe522dac2
untabify liboctave C++ sources
John W. Eaton <jwe@octave.org>
parents:
10213
diff
changeset
|
3150 octave_idx_type idx_j; |
07ebe522dac2
untabify liboctave C++ sources
John W. Eaton <jwe@octave.org>
parents:
10213
diff
changeset
|
3151 |
07ebe522dac2
untabify liboctave C++ sources
John W. Eaton <jwe@octave.org>
parents:
10213
diff
changeset
|
3152 Complex tmp_min; |
07ebe522dac2
untabify liboctave C++ sources
John W. Eaton <jwe@octave.org>
parents:
10213
diff
changeset
|
3153 |
21723
bae585228161
use namespace for numeric_limits
John W. Eaton <jwe@octave.org>
parents:
21721
diff
changeset
|
3154 double abs_min = octave::numeric_limits<double>::NaN (); |
10314
07ebe522dac2
untabify liboctave C++ sources
John W. Eaton <jwe@octave.org>
parents:
10213
diff
changeset
|
3155 |
07ebe522dac2
untabify liboctave C++ sources
John W. Eaton <jwe@octave.org>
parents:
10213
diff
changeset
|
3156 for (idx_j = 0; idx_j < nc; idx_j++) |
07ebe522dac2
untabify liboctave C++ sources
John W. Eaton <jwe@octave.org>
parents:
10213
diff
changeset
|
3157 { |
07ebe522dac2
untabify liboctave C++ sources
John W. Eaton <jwe@octave.org>
parents:
10213
diff
changeset
|
3158 tmp_min = elem (i, idx_j); |
07ebe522dac2
untabify liboctave C++ sources
John W. Eaton <jwe@octave.org>
parents:
10213
diff
changeset
|
3159 |
21782
2aef506f3fec
use namespace for lo-mappers.h functions
John W. Eaton <jwe@octave.org>
parents:
21751
diff
changeset
|
3160 if (! octave::math::isnan (tmp_min)) |
10314
07ebe522dac2
untabify liboctave C++ sources
John W. Eaton <jwe@octave.org>
parents:
10213
diff
changeset
|
3161 { |
17769
49a5a4be04a1
maint: Use GNU style coding conventions for code in liboctave/
Rik <rik@octave.org>
parents:
17744
diff
changeset
|
3162 abs_min = real_only ? std::real (tmp_min) |
49a5a4be04a1
maint: Use GNU style coding conventions for code in liboctave/
Rik <rik@octave.org>
parents:
17744
diff
changeset
|
3163 : std::abs (tmp_min); |
10314
07ebe522dac2
untabify liboctave C++ sources
John W. Eaton <jwe@octave.org>
parents:
10213
diff
changeset
|
3164 break; |
07ebe522dac2
untabify liboctave C++ sources
John W. Eaton <jwe@octave.org>
parents:
10213
diff
changeset
|
3165 } |
07ebe522dac2
untabify liboctave C++ sources
John W. Eaton <jwe@octave.org>
parents:
10213
diff
changeset
|
3166 } |
07ebe522dac2
untabify liboctave C++ sources
John W. Eaton <jwe@octave.org>
parents:
10213
diff
changeset
|
3167 |
07ebe522dac2
untabify liboctave C++ sources
John W. Eaton <jwe@octave.org>
parents:
10213
diff
changeset
|
3168 for (octave_idx_type j = idx_j+1; j < nc; j++) |
07ebe522dac2
untabify liboctave C++ sources
John W. Eaton <jwe@octave.org>
parents:
10213
diff
changeset
|
3169 { |
07ebe522dac2
untabify liboctave C++ sources
John W. Eaton <jwe@octave.org>
parents:
10213
diff
changeset
|
3170 Complex tmp = elem (i, j); |
07ebe522dac2
untabify liboctave C++ sources
John W. Eaton <jwe@octave.org>
parents:
10213
diff
changeset
|
3171 |
21782
2aef506f3fec
use namespace for lo-mappers.h functions
John W. Eaton <jwe@octave.org>
parents:
21751
diff
changeset
|
3172 if (octave::math::isnan (tmp)) |
10314
07ebe522dac2
untabify liboctave C++ sources
John W. Eaton <jwe@octave.org>
parents:
10213
diff
changeset
|
3173 continue; |
07ebe522dac2
untabify liboctave C++ sources
John W. Eaton <jwe@octave.org>
parents:
10213
diff
changeset
|
3174 |
07ebe522dac2
untabify liboctave C++ sources
John W. Eaton <jwe@octave.org>
parents:
10213
diff
changeset
|
3175 double abs_tmp = real_only ? std::real (tmp) : std::abs (tmp); |
07ebe522dac2
untabify liboctave C++ sources
John W. Eaton <jwe@octave.org>
parents:
10213
diff
changeset
|
3176 |
07ebe522dac2
untabify liboctave C++ sources
John W. Eaton <jwe@octave.org>
parents:
10213
diff
changeset
|
3177 if (abs_tmp < abs_min) |
07ebe522dac2
untabify liboctave C++ sources
John W. Eaton <jwe@octave.org>
parents:
10213
diff
changeset
|
3178 { |
07ebe522dac2
untabify liboctave C++ sources
John W. Eaton <jwe@octave.org>
parents:
10213
diff
changeset
|
3179 idx_j = j; |
07ebe522dac2
untabify liboctave C++ sources
John W. Eaton <jwe@octave.org>
parents:
10213
diff
changeset
|
3180 tmp_min = tmp; |
07ebe522dac2
untabify liboctave C++ sources
John W. Eaton <jwe@octave.org>
parents:
10213
diff
changeset
|
3181 abs_min = abs_tmp; |
07ebe522dac2
untabify liboctave C++ sources
John W. Eaton <jwe@octave.org>
parents:
10213
diff
changeset
|
3182 } |
07ebe522dac2
untabify liboctave C++ sources
John W. Eaton <jwe@octave.org>
parents:
10213
diff
changeset
|
3183 } |
07ebe522dac2
untabify liboctave C++ sources
John W. Eaton <jwe@octave.org>
parents:
10213
diff
changeset
|
3184 |
21782
2aef506f3fec
use namespace for lo-mappers.h functions
John W. Eaton <jwe@octave.org>
parents:
21751
diff
changeset
|
3185 if (octave::math::isnan (tmp_min)) |
10314
07ebe522dac2
untabify liboctave C++ sources
John W. Eaton <jwe@octave.org>
parents:
10213
diff
changeset
|
3186 { |
07ebe522dac2
untabify liboctave C++ sources
John W. Eaton <jwe@octave.org>
parents:
10213
diff
changeset
|
3187 result.elem (i) = Complex_NaN_result; |
07ebe522dac2
untabify liboctave C++ sources
John W. Eaton <jwe@octave.org>
parents:
10213
diff
changeset
|
3188 idx_arg.elem (i) = 0; |
07ebe522dac2
untabify liboctave C++ sources
John W. Eaton <jwe@octave.org>
parents:
10213
diff
changeset
|
3189 } |
07ebe522dac2
untabify liboctave C++ sources
John W. Eaton <jwe@octave.org>
parents:
10213
diff
changeset
|
3190 else |
07ebe522dac2
untabify liboctave C++ sources
John W. Eaton <jwe@octave.org>
parents:
10213
diff
changeset
|
3191 { |
07ebe522dac2
untabify liboctave C++ sources
John W. Eaton <jwe@octave.org>
parents:
10213
diff
changeset
|
3192 result.elem (i) = tmp_min; |
07ebe522dac2
untabify liboctave C++ sources
John W. Eaton <jwe@octave.org>
parents:
10213
diff
changeset
|
3193 idx_arg.elem (i) = idx_j; |
07ebe522dac2
untabify liboctave C++ sources
John W. Eaton <jwe@octave.org>
parents:
10213
diff
changeset
|
3194 } |
458 | 3195 } |
3196 } | |
3197 | |
3198 return result; | |
3199 } | |
3200 | |
3201 ComplexColumnVector | |
3202 ComplexMatrix::row_max (void) const | |
3203 { | |
5275 | 3204 Array<octave_idx_type> dummy_idx; |
4587 | 3205 return row_max (dummy_idx); |
458 | 3206 } |
3207 | |
3208 ComplexColumnVector | |
5275 | 3209 ComplexMatrix::row_max (Array<octave_idx_type>& idx_arg) const |
458 | 3210 { |
3211 ComplexColumnVector result; | |
3212 | |
5275 | 3213 octave_idx_type nr = rows (); |
3214 octave_idx_type nc = cols (); | |
458 | 3215 |
3216 if (nr > 0 && nc > 0) | |
3217 { | |
3218 result.resize (nr); | |
11574
a83bad07f7e3
attempt better backward compatibility for Array resize functions
John W. Eaton <jwe@octave.org>
parents:
11570
diff
changeset
|
3219 idx_arg.resize (dim_vector (nr, 1)); |
458 | 3220 |
5275 | 3221 for (octave_idx_type i = 0; i < nr; i++) |
458 | 3222 { |
10314
07ebe522dac2
untabify liboctave C++ sources
John W. Eaton <jwe@octave.org>
parents:
10213
diff
changeset
|
3223 bool real_only = row_is_real_only (i); |
07ebe522dac2
untabify liboctave C++ sources
John W. Eaton <jwe@octave.org>
parents:
10213
diff
changeset
|
3224 |
07ebe522dac2
untabify liboctave C++ sources
John W. Eaton <jwe@octave.org>
parents:
10213
diff
changeset
|
3225 octave_idx_type idx_j; |
07ebe522dac2
untabify liboctave C++ sources
John W. Eaton <jwe@octave.org>
parents:
10213
diff
changeset
|
3226 |
07ebe522dac2
untabify liboctave C++ sources
John W. Eaton <jwe@octave.org>
parents:
10213
diff
changeset
|
3227 Complex tmp_max; |
07ebe522dac2
untabify liboctave C++ sources
John W. Eaton <jwe@octave.org>
parents:
10213
diff
changeset
|
3228 |
21723
bae585228161
use namespace for numeric_limits
John W. Eaton <jwe@octave.org>
parents:
21721
diff
changeset
|
3229 double abs_max = octave::numeric_limits<double>::NaN (); |
10314
07ebe522dac2
untabify liboctave C++ sources
John W. Eaton <jwe@octave.org>
parents:
10213
diff
changeset
|
3230 |
07ebe522dac2
untabify liboctave C++ sources
John W. Eaton <jwe@octave.org>
parents:
10213
diff
changeset
|
3231 for (idx_j = 0; idx_j < nc; idx_j++) |
07ebe522dac2
untabify liboctave C++ sources
John W. Eaton <jwe@octave.org>
parents:
10213
diff
changeset
|
3232 { |
07ebe522dac2
untabify liboctave C++ sources
John W. Eaton <jwe@octave.org>
parents:
10213
diff
changeset
|
3233 tmp_max = elem (i, idx_j); |
07ebe522dac2
untabify liboctave C++ sources
John W. Eaton <jwe@octave.org>
parents:
10213
diff
changeset
|
3234 |
21782
2aef506f3fec
use namespace for lo-mappers.h functions
John W. Eaton <jwe@octave.org>
parents:
21751
diff
changeset
|
3235 if (! octave::math::isnan (tmp_max)) |
10314
07ebe522dac2
untabify liboctave C++ sources
John W. Eaton <jwe@octave.org>
parents:
10213
diff
changeset
|
3236 { |
17769
49a5a4be04a1
maint: Use GNU style coding conventions for code in liboctave/
Rik <rik@octave.org>
parents:
17744
diff
changeset
|
3237 abs_max = real_only ? std::real (tmp_max) |
49a5a4be04a1
maint: Use GNU style coding conventions for code in liboctave/
Rik <rik@octave.org>
parents:
17744
diff
changeset
|
3238 : std::abs (tmp_max); |
10314
07ebe522dac2
untabify liboctave C++ sources
John W. Eaton <jwe@octave.org>
parents:
10213
diff
changeset
|
3239 break; |
07ebe522dac2
untabify liboctave C++ sources
John W. Eaton <jwe@octave.org>
parents:
10213
diff
changeset
|
3240 } |
07ebe522dac2
untabify liboctave C++ sources
John W. Eaton <jwe@octave.org>
parents:
10213
diff
changeset
|
3241 } |
07ebe522dac2
untabify liboctave C++ sources
John W. Eaton <jwe@octave.org>
parents:
10213
diff
changeset
|
3242 |
07ebe522dac2
untabify liboctave C++ sources
John W. Eaton <jwe@octave.org>
parents:
10213
diff
changeset
|
3243 for (octave_idx_type j = idx_j+1; j < nc; j++) |
07ebe522dac2
untabify liboctave C++ sources
John W. Eaton <jwe@octave.org>
parents:
10213
diff
changeset
|
3244 { |
07ebe522dac2
untabify liboctave C++ sources
John W. Eaton <jwe@octave.org>
parents:
10213
diff
changeset
|
3245 Complex tmp = elem (i, j); |
07ebe522dac2
untabify liboctave C++ sources
John W. Eaton <jwe@octave.org>
parents:
10213
diff
changeset
|
3246 |
21782
2aef506f3fec
use namespace for lo-mappers.h functions
John W. Eaton <jwe@octave.org>
parents:
21751
diff
changeset
|
3247 if (octave::math::isnan (tmp)) |
10314
07ebe522dac2
untabify liboctave C++ sources
John W. Eaton <jwe@octave.org>
parents:
10213
diff
changeset
|
3248 continue; |
07ebe522dac2
untabify liboctave C++ sources
John W. Eaton <jwe@octave.org>
parents:
10213
diff
changeset
|
3249 |
07ebe522dac2
untabify liboctave C++ sources
John W. Eaton <jwe@octave.org>
parents:
10213
diff
changeset
|
3250 double abs_tmp = real_only ? std::real (tmp) : std::abs (tmp); |
07ebe522dac2
untabify liboctave C++ sources
John W. Eaton <jwe@octave.org>
parents:
10213
diff
changeset
|
3251 |
07ebe522dac2
untabify liboctave C++ sources
John W. Eaton <jwe@octave.org>
parents:
10213
diff
changeset
|
3252 if (abs_tmp > abs_max) |
07ebe522dac2
untabify liboctave C++ sources
John W. Eaton <jwe@octave.org>
parents:
10213
diff
changeset
|
3253 { |
07ebe522dac2
untabify liboctave C++ sources
John W. Eaton <jwe@octave.org>
parents:
10213
diff
changeset
|
3254 idx_j = j; |
07ebe522dac2
untabify liboctave C++ sources
John W. Eaton <jwe@octave.org>
parents:
10213
diff
changeset
|
3255 tmp_max = tmp; |
07ebe522dac2
untabify liboctave C++ sources
John W. Eaton <jwe@octave.org>
parents:
10213
diff
changeset
|
3256 abs_max = abs_tmp; |
07ebe522dac2
untabify liboctave C++ sources
John W. Eaton <jwe@octave.org>
parents:
10213
diff
changeset
|
3257 } |
07ebe522dac2
untabify liboctave C++ sources
John W. Eaton <jwe@octave.org>
parents:
10213
diff
changeset
|
3258 } |
07ebe522dac2
untabify liboctave C++ sources
John W. Eaton <jwe@octave.org>
parents:
10213
diff
changeset
|
3259 |
21782
2aef506f3fec
use namespace for lo-mappers.h functions
John W. Eaton <jwe@octave.org>
parents:
21751
diff
changeset
|
3260 if (octave::math::isnan (tmp_max)) |
10314
07ebe522dac2
untabify liboctave C++ sources
John W. Eaton <jwe@octave.org>
parents:
10213
diff
changeset
|
3261 { |
07ebe522dac2
untabify liboctave C++ sources
John W. Eaton <jwe@octave.org>
parents:
10213
diff
changeset
|
3262 result.elem (i) = Complex_NaN_result; |
07ebe522dac2
untabify liboctave C++ sources
John W. Eaton <jwe@octave.org>
parents:
10213
diff
changeset
|
3263 idx_arg.elem (i) = 0; |
07ebe522dac2
untabify liboctave C++ sources
John W. Eaton <jwe@octave.org>
parents:
10213
diff
changeset
|
3264 } |
07ebe522dac2
untabify liboctave C++ sources
John W. Eaton <jwe@octave.org>
parents:
10213
diff
changeset
|
3265 else |
07ebe522dac2
untabify liboctave C++ sources
John W. Eaton <jwe@octave.org>
parents:
10213
diff
changeset
|
3266 { |
07ebe522dac2
untabify liboctave C++ sources
John W. Eaton <jwe@octave.org>
parents:
10213
diff
changeset
|
3267 result.elem (i) = tmp_max; |
07ebe522dac2
untabify liboctave C++ sources
John W. Eaton <jwe@octave.org>
parents:
10213
diff
changeset
|
3268 idx_arg.elem (i) = idx_j; |
07ebe522dac2
untabify liboctave C++ sources
John W. Eaton <jwe@octave.org>
parents:
10213
diff
changeset
|
3269 } |
458 | 3270 } |
3271 } | |
3272 | |
3273 return result; | |
3274 } | |
3275 | |
3276 ComplexRowVector | |
3277 ComplexMatrix::column_min (void) const | |
3278 { | |
5275 | 3279 Array<octave_idx_type> dummy_idx; |
4587 | 3280 return column_min (dummy_idx); |
458 | 3281 } |
3282 | |
3283 ComplexRowVector | |
5275 | 3284 ComplexMatrix::column_min (Array<octave_idx_type>& idx_arg) const |
458 | 3285 { |
3286 ComplexRowVector result; | |
3287 | |
5275 | 3288 octave_idx_type nr = rows (); |
3289 octave_idx_type nc = cols (); | |
458 | 3290 |
3291 if (nr > 0 && nc > 0) | |
3292 { | |
3293 result.resize (nc); | |
11574
a83bad07f7e3
attempt better backward compatibility for Array resize functions
John W. Eaton <jwe@octave.org>
parents:
11570
diff
changeset
|
3294 idx_arg.resize (dim_vector (1, nc)); |
458 | 3295 |
5275 | 3296 for (octave_idx_type j = 0; j < nc; j++) |
458 | 3297 { |
10314
07ebe522dac2
untabify liboctave C++ sources
John W. Eaton <jwe@octave.org>
parents:
10213
diff
changeset
|
3298 bool real_only = column_is_real_only (j); |
07ebe522dac2
untabify liboctave C++ sources
John W. Eaton <jwe@octave.org>
parents:
10213
diff
changeset
|
3299 |
07ebe522dac2
untabify liboctave C++ sources
John W. Eaton <jwe@octave.org>
parents:
10213
diff
changeset
|
3300 octave_idx_type idx_i; |
07ebe522dac2
untabify liboctave C++ sources
John W. Eaton <jwe@octave.org>
parents:
10213
diff
changeset
|
3301 |
07ebe522dac2
untabify liboctave C++ sources
John W. Eaton <jwe@octave.org>
parents:
10213
diff
changeset
|
3302 Complex tmp_min; |
07ebe522dac2
untabify liboctave C++ sources
John W. Eaton <jwe@octave.org>
parents:
10213
diff
changeset
|
3303 |
21723
bae585228161
use namespace for numeric_limits
John W. Eaton <jwe@octave.org>
parents:
21721
diff
changeset
|
3304 double abs_min = octave::numeric_limits<double>::NaN (); |
10314
07ebe522dac2
untabify liboctave C++ sources
John W. Eaton <jwe@octave.org>
parents:
10213
diff
changeset
|
3305 |
07ebe522dac2
untabify liboctave C++ sources
John W. Eaton <jwe@octave.org>
parents:
10213
diff
changeset
|
3306 for (idx_i = 0; idx_i < nr; idx_i++) |
07ebe522dac2
untabify liboctave C++ sources
John W. Eaton <jwe@octave.org>
parents:
10213
diff
changeset
|
3307 { |
07ebe522dac2
untabify liboctave C++ sources
John W. Eaton <jwe@octave.org>
parents:
10213
diff
changeset
|
3308 tmp_min = elem (idx_i, j); |
07ebe522dac2
untabify liboctave C++ sources
John W. Eaton <jwe@octave.org>
parents:
10213
diff
changeset
|
3309 |
21782
2aef506f3fec
use namespace for lo-mappers.h functions
John W. Eaton <jwe@octave.org>
parents:
21751
diff
changeset
|
3310 if (! octave::math::isnan (tmp_min)) |
10314
07ebe522dac2
untabify liboctave C++ sources
John W. Eaton <jwe@octave.org>
parents:
10213
diff
changeset
|
3311 { |
17769
49a5a4be04a1
maint: Use GNU style coding conventions for code in liboctave/
Rik <rik@octave.org>
parents:
17744
diff
changeset
|
3312 abs_min = real_only ? std::real (tmp_min) |
49a5a4be04a1
maint: Use GNU style coding conventions for code in liboctave/
Rik <rik@octave.org>
parents:
17744
diff
changeset
|
3313 : std::abs (tmp_min); |
10314
07ebe522dac2
untabify liboctave C++ sources
John W. Eaton <jwe@octave.org>
parents:
10213
diff
changeset
|
3314 break; |
07ebe522dac2
untabify liboctave C++ sources
John W. Eaton <jwe@octave.org>
parents:
10213
diff
changeset
|
3315 } |
07ebe522dac2
untabify liboctave C++ sources
John W. Eaton <jwe@octave.org>
parents:
10213
diff
changeset
|
3316 } |
07ebe522dac2
untabify liboctave C++ sources
John W. Eaton <jwe@octave.org>
parents:
10213
diff
changeset
|
3317 |
07ebe522dac2
untabify liboctave C++ sources
John W. Eaton <jwe@octave.org>
parents:
10213
diff
changeset
|
3318 for (octave_idx_type i = idx_i+1; i < nr; i++) |
07ebe522dac2
untabify liboctave C++ sources
John W. Eaton <jwe@octave.org>
parents:
10213
diff
changeset
|
3319 { |
07ebe522dac2
untabify liboctave C++ sources
John W. Eaton <jwe@octave.org>
parents:
10213
diff
changeset
|
3320 Complex tmp = elem (i, j); |
07ebe522dac2
untabify liboctave C++ sources
John W. Eaton <jwe@octave.org>
parents:
10213
diff
changeset
|
3321 |
21782
2aef506f3fec
use namespace for lo-mappers.h functions
John W. Eaton <jwe@octave.org>
parents:
21751
diff
changeset
|
3322 if (octave::math::isnan (tmp)) |
10314
07ebe522dac2
untabify liboctave C++ sources
John W. Eaton <jwe@octave.org>
parents:
10213
diff
changeset
|
3323 continue; |
07ebe522dac2
untabify liboctave C++ sources
John W. Eaton <jwe@octave.org>
parents:
10213
diff
changeset
|
3324 |
07ebe522dac2
untabify liboctave C++ sources
John W. Eaton <jwe@octave.org>
parents:
10213
diff
changeset
|
3325 double abs_tmp = real_only ? std::real (tmp) : std::abs (tmp); |
07ebe522dac2
untabify liboctave C++ sources
John W. Eaton <jwe@octave.org>
parents:
10213
diff
changeset
|
3326 |
07ebe522dac2
untabify liboctave C++ sources
John W. Eaton <jwe@octave.org>
parents:
10213
diff
changeset
|
3327 if (abs_tmp < abs_min) |
07ebe522dac2
untabify liboctave C++ sources
John W. Eaton <jwe@octave.org>
parents:
10213
diff
changeset
|
3328 { |
07ebe522dac2
untabify liboctave C++ sources
John W. Eaton <jwe@octave.org>
parents:
10213
diff
changeset
|
3329 idx_i = i; |
07ebe522dac2
untabify liboctave C++ sources
John W. Eaton <jwe@octave.org>
parents:
10213
diff
changeset
|
3330 tmp_min = tmp; |
07ebe522dac2
untabify liboctave C++ sources
John W. Eaton <jwe@octave.org>
parents:
10213
diff
changeset
|
3331 abs_min = abs_tmp; |
07ebe522dac2
untabify liboctave C++ sources
John W. Eaton <jwe@octave.org>
parents:
10213
diff
changeset
|
3332 } |
07ebe522dac2
untabify liboctave C++ sources
John W. Eaton <jwe@octave.org>
parents:
10213
diff
changeset
|
3333 } |
07ebe522dac2
untabify liboctave C++ sources
John W. Eaton <jwe@octave.org>
parents:
10213
diff
changeset
|
3334 |
21782
2aef506f3fec
use namespace for lo-mappers.h functions
John W. Eaton <jwe@octave.org>
parents:
21751
diff
changeset
|
3335 if (octave::math::isnan (tmp_min)) |
10314
07ebe522dac2
untabify liboctave C++ sources
John W. Eaton <jwe@octave.org>
parents:
10213
diff
changeset
|
3336 { |
07ebe522dac2
untabify liboctave C++ sources
John W. Eaton <jwe@octave.org>
parents:
10213
diff
changeset
|
3337 result.elem (j) = Complex_NaN_result; |
07ebe522dac2
untabify liboctave C++ sources
John W. Eaton <jwe@octave.org>
parents:
10213
diff
changeset
|
3338 idx_arg.elem (j) = 0; |
07ebe522dac2
untabify liboctave C++ sources
John W. Eaton <jwe@octave.org>
parents:
10213
diff
changeset
|
3339 } |
07ebe522dac2
untabify liboctave C++ sources
John W. Eaton <jwe@octave.org>
parents:
10213
diff
changeset
|
3340 else |
07ebe522dac2
untabify liboctave C++ sources
John W. Eaton <jwe@octave.org>
parents:
10213
diff
changeset
|
3341 { |
07ebe522dac2
untabify liboctave C++ sources
John W. Eaton <jwe@octave.org>
parents:
10213
diff
changeset
|
3342 result.elem (j) = tmp_min; |
07ebe522dac2
untabify liboctave C++ sources
John W. Eaton <jwe@octave.org>
parents:
10213
diff
changeset
|
3343 idx_arg.elem (j) = idx_i; |
07ebe522dac2
untabify liboctave C++ sources
John W. Eaton <jwe@octave.org>
parents:
10213
diff
changeset
|
3344 } |
458 | 3345 } |
3346 } | |
3347 | |
3348 return result; | |
3349 } | |
3350 | |
3351 ComplexRowVector | |
3352 ComplexMatrix::column_max (void) const | |
3353 { | |
5275 | 3354 Array<octave_idx_type> dummy_idx; |
4587 | 3355 return column_max (dummy_idx); |
458 | 3356 } |
3357 | |
3358 ComplexRowVector | |
5275 | 3359 ComplexMatrix::column_max (Array<octave_idx_type>& idx_arg) const |
458 | 3360 { |
3361 ComplexRowVector result; | |
3362 | |
5275 | 3363 octave_idx_type nr = rows (); |
3364 octave_idx_type nc = cols (); | |
458 | 3365 |
3366 if (nr > 0 && nc > 0) | |
3367 { | |
3368 result.resize (nc); | |
11574
a83bad07f7e3
attempt better backward compatibility for Array resize functions
John W. Eaton <jwe@octave.org>
parents:
11570
diff
changeset
|
3369 idx_arg.resize (dim_vector (1, nc)); |
458 | 3370 |
5275 | 3371 for (octave_idx_type j = 0; j < nc; j++) |
458 | 3372 { |
10314
07ebe522dac2
untabify liboctave C++ sources
John W. Eaton <jwe@octave.org>
parents:
10213
diff
changeset
|
3373 bool real_only = column_is_real_only (j); |
07ebe522dac2
untabify liboctave C++ sources
John W. Eaton <jwe@octave.org>
parents:
10213
diff
changeset
|
3374 |
07ebe522dac2
untabify liboctave C++ sources
John W. Eaton <jwe@octave.org>
parents:
10213
diff
changeset
|
3375 octave_idx_type idx_i; |
07ebe522dac2
untabify liboctave C++ sources
John W. Eaton <jwe@octave.org>
parents:
10213
diff
changeset
|
3376 |
07ebe522dac2
untabify liboctave C++ sources
John W. Eaton <jwe@octave.org>
parents:
10213
diff
changeset
|
3377 Complex tmp_max; |
07ebe522dac2
untabify liboctave C++ sources
John W. Eaton <jwe@octave.org>
parents:
10213
diff
changeset
|
3378 |
21723
bae585228161
use namespace for numeric_limits
John W. Eaton <jwe@octave.org>
parents:
21721
diff
changeset
|
3379 double abs_max = octave::numeric_limits<double>::NaN (); |
10314
07ebe522dac2
untabify liboctave C++ sources
John W. Eaton <jwe@octave.org>
parents:
10213
diff
changeset
|
3380 |
07ebe522dac2
untabify liboctave C++ sources
John W. Eaton <jwe@octave.org>
parents:
10213
diff
changeset
|
3381 for (idx_i = 0; idx_i < nr; idx_i++) |
07ebe522dac2
untabify liboctave C++ sources
John W. Eaton <jwe@octave.org>
parents:
10213
diff
changeset
|
3382 { |
07ebe522dac2
untabify liboctave C++ sources
John W. Eaton <jwe@octave.org>
parents:
10213
diff
changeset
|
3383 tmp_max = elem (idx_i, j); |
07ebe522dac2
untabify liboctave C++ sources
John W. Eaton <jwe@octave.org>
parents:
10213
diff
changeset
|
3384 |
21782
2aef506f3fec
use namespace for lo-mappers.h functions
John W. Eaton <jwe@octave.org>
parents:
21751
diff
changeset
|
3385 if (! octave::math::isnan (tmp_max)) |
10314
07ebe522dac2
untabify liboctave C++ sources
John W. Eaton <jwe@octave.org>
parents:
10213
diff
changeset
|
3386 { |
17769
49a5a4be04a1
maint: Use GNU style coding conventions for code in liboctave/
Rik <rik@octave.org>
parents:
17744
diff
changeset
|
3387 abs_max = real_only ? std::real (tmp_max) |
49a5a4be04a1
maint: Use GNU style coding conventions for code in liboctave/
Rik <rik@octave.org>
parents:
17744
diff
changeset
|
3388 : std::abs (tmp_max); |
10314
07ebe522dac2
untabify liboctave C++ sources
John W. Eaton <jwe@octave.org>
parents:
10213
diff
changeset
|
3389 break; |
07ebe522dac2
untabify liboctave C++ sources
John W. Eaton <jwe@octave.org>
parents:
10213
diff
changeset
|
3390 } |
07ebe522dac2
untabify liboctave C++ sources
John W. Eaton <jwe@octave.org>
parents:
10213
diff
changeset
|
3391 } |
07ebe522dac2
untabify liboctave C++ sources
John W. Eaton <jwe@octave.org>
parents:
10213
diff
changeset
|
3392 |
07ebe522dac2
untabify liboctave C++ sources
John W. Eaton <jwe@octave.org>
parents:
10213
diff
changeset
|
3393 for (octave_idx_type i = idx_i+1; i < nr; i++) |
07ebe522dac2
untabify liboctave C++ sources
John W. Eaton <jwe@octave.org>
parents:
10213
diff
changeset
|
3394 { |
07ebe522dac2
untabify liboctave C++ sources
John W. Eaton <jwe@octave.org>
parents:
10213
diff
changeset
|
3395 Complex tmp = elem (i, j); |
07ebe522dac2
untabify liboctave C++ sources
John W. Eaton <jwe@octave.org>
parents:
10213
diff
changeset
|
3396 |
21782
2aef506f3fec
use namespace for lo-mappers.h functions
John W. Eaton <jwe@octave.org>
parents:
21751
diff
changeset
|
3397 if (octave::math::isnan (tmp)) |
10314
07ebe522dac2
untabify liboctave C++ sources
John W. Eaton <jwe@octave.org>
parents:
10213
diff
changeset
|
3398 continue; |
07ebe522dac2
untabify liboctave C++ sources
John W. Eaton <jwe@octave.org>
parents:
10213
diff
changeset
|
3399 |
07ebe522dac2
untabify liboctave C++ sources
John W. Eaton <jwe@octave.org>
parents:
10213
diff
changeset
|
3400 double abs_tmp = real_only ? std::real (tmp) : std::abs (tmp); |
07ebe522dac2
untabify liboctave C++ sources
John W. Eaton <jwe@octave.org>
parents:
10213
diff
changeset
|
3401 |
07ebe522dac2
untabify liboctave C++ sources
John W. Eaton <jwe@octave.org>
parents:
10213
diff
changeset
|
3402 if (abs_tmp > abs_max) |
07ebe522dac2
untabify liboctave C++ sources
John W. Eaton <jwe@octave.org>
parents:
10213
diff
changeset
|
3403 { |
07ebe522dac2
untabify liboctave C++ sources
John W. Eaton <jwe@octave.org>
parents:
10213
diff
changeset
|
3404 idx_i = i; |
07ebe522dac2
untabify liboctave C++ sources
John W. Eaton <jwe@octave.org>
parents:
10213
diff
changeset
|
3405 tmp_max = tmp; |
07ebe522dac2
untabify liboctave C++ sources
John W. Eaton <jwe@octave.org>
parents:
10213
diff
changeset
|
3406 abs_max = abs_tmp; |
07ebe522dac2
untabify liboctave C++ sources
John W. Eaton <jwe@octave.org>
parents:
10213
diff
changeset
|
3407 } |
07ebe522dac2
untabify liboctave C++ sources
John W. Eaton <jwe@octave.org>
parents:
10213
diff
changeset
|
3408 } |
07ebe522dac2
untabify liboctave C++ sources
John W. Eaton <jwe@octave.org>
parents:
10213
diff
changeset
|
3409 |
21782
2aef506f3fec
use namespace for lo-mappers.h functions
John W. Eaton <jwe@octave.org>
parents:
21751
diff
changeset
|
3410 if (octave::math::isnan (tmp_max)) |
10314
07ebe522dac2
untabify liboctave C++ sources
John W. Eaton <jwe@octave.org>
parents:
10213
diff
changeset
|
3411 { |
07ebe522dac2
untabify liboctave C++ sources
John W. Eaton <jwe@octave.org>
parents:
10213
diff
changeset
|
3412 result.elem (j) = Complex_NaN_result; |
07ebe522dac2
untabify liboctave C++ sources
John W. Eaton <jwe@octave.org>
parents:
10213
diff
changeset
|
3413 idx_arg.elem (j) = 0; |
07ebe522dac2
untabify liboctave C++ sources
John W. Eaton <jwe@octave.org>
parents:
10213
diff
changeset
|
3414 } |
07ebe522dac2
untabify liboctave C++ sources
John W. Eaton <jwe@octave.org>
parents:
10213
diff
changeset
|
3415 else |
07ebe522dac2
untabify liboctave C++ sources
John W. Eaton <jwe@octave.org>
parents:
10213
diff
changeset
|
3416 { |
07ebe522dac2
untabify liboctave C++ sources
John W. Eaton <jwe@octave.org>
parents:
10213
diff
changeset
|
3417 result.elem (j) = tmp_max; |
07ebe522dac2
untabify liboctave C++ sources
John W. Eaton <jwe@octave.org>
parents:
10213
diff
changeset
|
3418 idx_arg.elem (j) = idx_i; |
07ebe522dac2
untabify liboctave C++ sources
John W. Eaton <jwe@octave.org>
parents:
10213
diff
changeset
|
3419 } |
458 | 3420 } |
3421 } | |
3422 | |
3423 return result; | |
3424 } | |
3425 | |
3426 // i/o | |
3427 | |
3504 | 3428 std::ostream& |
3429 operator << (std::ostream& os, const ComplexMatrix& a) | |
458 | 3430 { |
5275 | 3431 for (octave_idx_type i = 0; i < a.rows (); i++) |
458 | 3432 { |
5275 | 3433 for (octave_idx_type j = 0; j < a.cols (); j++) |
10314
07ebe522dac2
untabify liboctave C++ sources
John W. Eaton <jwe@octave.org>
parents:
10213
diff
changeset
|
3434 { |
07ebe522dac2
untabify liboctave C++ sources
John W. Eaton <jwe@octave.org>
parents:
10213
diff
changeset
|
3435 os << " "; |
07ebe522dac2
untabify liboctave C++ sources
John W. Eaton <jwe@octave.org>
parents:
10213
diff
changeset
|
3436 octave_write_complex (os, a.elem (i, j)); |
07ebe522dac2
untabify liboctave C++ sources
John W. Eaton <jwe@octave.org>
parents:
10213
diff
changeset
|
3437 } |
458 | 3438 os << "\n"; |
3439 } | |
3440 return os; | |
3441 } | |
3442 | |
3504 | 3443 std::istream& |
3444 operator >> (std::istream& is, ComplexMatrix& a) | |
458 | 3445 { |
5275 | 3446 octave_idx_type nr = a.rows (); |
3447 octave_idx_type nc = a.cols (); | |
458 | 3448 |
8999
dc07bc4157b8
allow empty matrices in stream input operators
Jaroslav Hajek <highegg@gmail.com>
parents:
8956
diff
changeset
|
3449 if (nr > 0 && nc > 0) |
458 | 3450 { |
3451 Complex tmp; | |
5275 | 3452 for (octave_idx_type i = 0; i < nr; i++) |
10314
07ebe522dac2
untabify liboctave C++ sources
John W. Eaton <jwe@octave.org>
parents:
10213
diff
changeset
|
3453 for (octave_idx_type j = 0; j < nc; j++) |
07ebe522dac2
untabify liboctave C++ sources
John W. Eaton <jwe@octave.org>
parents:
10213
diff
changeset
|
3454 { |
07ebe522dac2
untabify liboctave C++ sources
John W. Eaton <jwe@octave.org>
parents:
10213
diff
changeset
|
3455 tmp = octave_read_value<Complex> (is); |
07ebe522dac2
untabify liboctave C++ sources
John W. Eaton <jwe@octave.org>
parents:
10213
diff
changeset
|
3456 if (is) |
07ebe522dac2
untabify liboctave C++ sources
John W. Eaton <jwe@octave.org>
parents:
10213
diff
changeset
|
3457 a.elem (i, j) = tmp; |
07ebe522dac2
untabify liboctave C++ sources
John W. Eaton <jwe@octave.org>
parents:
10213
diff
changeset
|
3458 else |
21168
26f85aa072de
maint: Replace instances of goto in liboctave where convenient.
Rik <rik@octave.org>
parents:
21136
diff
changeset
|
3459 return is; |
10314
07ebe522dac2
untabify liboctave C++ sources
John W. Eaton <jwe@octave.org>
parents:
10213
diff
changeset
|
3460 } |
458 | 3461 } |
3462 | |
3463 return is; | |
3464 } | |
3465 | |
1819 | 3466 ComplexMatrix |
3467 Givens (const Complex& x, const Complex& y) | |
3468 { | |
3469 double cc; | |
3470 Complex cs, temp_r; | |
11586
12df7854fa7c
strip trailing whitespace from source files
John W. Eaton <jwe@octave.org>
parents:
11574
diff
changeset
|
3471 |
22135
407c66ae1e20
reduce warnings from GCC's link-time optimization feature (bug #48531)
John W. Eaton <jwe@octave.org>
parents:
22133
diff
changeset
|
3472 F77_FUNC (zlartg, ZLARTG) (F77_CONST_DBLE_CMPLX_ARG (&x), F77_CONST_DBLE_CMPLX_ARG (&y), cc, F77_DBLE_CMPLX_ARG (&cs), F77_DBLE_CMPLX_ARG (&temp_r)); |
1819 | 3473 |
3474 ComplexMatrix g (2, 2); | |
3475 | |
3476 g.elem (0, 0) = cc; | |
3477 g.elem (1, 1) = cc; | |
3478 g.elem (0, 1) = cs; | |
3479 g.elem (1, 0) = -conj (cs); | |
3480 | |
3481 return g; | |
3482 } | |
3483 | |
3484 ComplexMatrix | |
3485 Sylvester (const ComplexMatrix& a, const ComplexMatrix& b, | |
10314
07ebe522dac2
untabify liboctave C++ sources
John W. Eaton <jwe@octave.org>
parents:
10213
diff
changeset
|
3486 const ComplexMatrix& c) |
1819 | 3487 { |
3488 ComplexMatrix retval; | |
3489 | |
17769
49a5a4be04a1
maint: Use GNU style coding conventions for code in liboctave/
Rik <rik@octave.org>
parents:
17744
diff
changeset
|
3490 // FIXME: need to check that a, b, and c are all the same size. |
1819 | 3491 |
3492 // Compute Schur decompositions | |
3493 | |
21266
e69eaee28737
make better use of templates for Schur decomposition
John W. Eaton <jwe@octave.org>
parents:
21202
diff
changeset
|
3494 schur<ComplexMatrix> as (a, "U"); |
e69eaee28737
make better use of templates for Schur decomposition
John W. Eaton <jwe@octave.org>
parents:
21202
diff
changeset
|
3495 schur<ComplexMatrix> bs (b, "U"); |
11586
12df7854fa7c
strip trailing whitespace from source files
John W. Eaton <jwe@octave.org>
parents:
11574
diff
changeset
|
3496 |
1819 | 3497 // Transform c to new coordinates. |
3498 | |
3499 ComplexMatrix ua = as.unitary_matrix (); | |
3500 ComplexMatrix sch_a = as.schur_matrix (); | |
3501 | |
3502 ComplexMatrix ub = bs.unitary_matrix (); | |
3503 ComplexMatrix sch_b = bs.schur_matrix (); | |
11586
12df7854fa7c
strip trailing whitespace from source files
John W. Eaton <jwe@octave.org>
parents:
11574
diff
changeset
|
3504 |
1819 | 3505 ComplexMatrix cx = ua.hermitian () * c * ub; |
3506 | |
17769
49a5a4be04a1
maint: Use GNU style coding conventions for code in liboctave/
Rik <rik@octave.org>
parents:
17744
diff
changeset
|
3507 // Solve the sylvester equation, back-transform, and return the solution. |
1819 | 3508 |
5275 | 3509 octave_idx_type a_nr = a.rows (); |
3510 octave_idx_type b_nr = b.rows (); | |
1819 | 3511 |
3512 double scale; | |
5275 | 3513 octave_idx_type info; |
1950 | 3514 |
3515 Complex *pa = sch_a.fortran_vec (); | |
3516 Complex *pb = sch_b.fortran_vec (); | |
3517 Complex *px = cx.fortran_vec (); | |
11586
12df7854fa7c
strip trailing whitespace from source files
John W. Eaton <jwe@octave.org>
parents:
11574
diff
changeset
|
3518 |
4552 | 3519 F77_XFCN (ztrsyl, ZTRSYL, (F77_CONST_CHAR_ARG2 ("N", 1), |
10314
07ebe522dac2
untabify liboctave C++ sources
John W. Eaton <jwe@octave.org>
parents:
10213
diff
changeset
|
3520 F77_CONST_CHAR_ARG2 ("N", 1), |
22135
407c66ae1e20
reduce warnings from GCC's link-time optimization feature (bug #48531)
John W. Eaton <jwe@octave.org>
parents:
22133
diff
changeset
|
3521 1, a_nr, b_nr, F77_DBLE_CMPLX_ARG (pa), a_nr, F77_DBLE_CMPLX_ARG (pb), |
407c66ae1e20
reduce warnings from GCC's link-time optimization feature (bug #48531)
John W. Eaton <jwe@octave.org>
parents:
22133
diff
changeset
|
3522 b_nr, F77_DBLE_CMPLX_ARG (px), a_nr, scale, info |
10314
07ebe522dac2
untabify liboctave C++ sources
John W. Eaton <jwe@octave.org>
parents:
10213
diff
changeset
|
3523 F77_CHAR_ARG_LEN (1) |
07ebe522dac2
untabify liboctave C++ sources
John W. Eaton <jwe@octave.org>
parents:
10213
diff
changeset
|
3524 F77_CHAR_ARG_LEN (1))); |
1950 | 3525 |
17769
49a5a4be04a1
maint: Use GNU style coding conventions for code in liboctave/
Rik <rik@octave.org>
parents:
17744
diff
changeset
|
3526 // FIXME: check info? |
7482
29980c6b8604
don't check f77_exception_encountered
John W. Eaton <jwe@octave.org>
parents:
7478
diff
changeset
|
3527 |
19065
d20c81d3cd21
Deprecate syl, add new function sylvester.
Rik <rik@octave.org>
parents:
18850
diff
changeset
|
3528 retval = ua * cx * ub.hermitian (); |
1819 | 3529 |
3530 return retval; | |
3531 } | |
3532 | |
2828 | 3533 ComplexMatrix |
3534 operator * (const ComplexMatrix& m, const Matrix& a) | |
3535 { | |
9663
7e5b4de5fbfe
improve mixed real x complex ops
Jaroslav Hajek <highegg@gmail.com>
parents:
9661
diff
changeset
|
3536 if (m.columns () > std::min (m.rows (), a.columns ()) / 10) |
7e5b4de5fbfe
improve mixed real x complex ops
Jaroslav Hajek <highegg@gmail.com>
parents:
9661
diff
changeset
|
3537 return ComplexMatrix (real (m) * a, imag (m) * a); |
7e5b4de5fbfe
improve mixed real x complex ops
Jaroslav Hajek <highegg@gmail.com>
parents:
9661
diff
changeset
|
3538 else |
7e5b4de5fbfe
improve mixed real x complex ops
Jaroslav Hajek <highegg@gmail.com>
parents:
9661
diff
changeset
|
3539 return m * ComplexMatrix (a); |
2828 | 3540 } |
3541 | |
3542 ComplexMatrix | |
3543 operator * (const Matrix& m, const ComplexMatrix& a) | |
3544 { | |
9663
7e5b4de5fbfe
improve mixed real x complex ops
Jaroslav Hajek <highegg@gmail.com>
parents:
9661
diff
changeset
|
3545 if (a.rows () > std::min (m.rows (), a.columns ()) / 10) |
7e5b4de5fbfe
improve mixed real x complex ops
Jaroslav Hajek <highegg@gmail.com>
parents:
9661
diff
changeset
|
3546 return ComplexMatrix (m * real (a), m * imag (a)); |
7e5b4de5fbfe
improve mixed real x complex ops
Jaroslav Hajek <highegg@gmail.com>
parents:
9661
diff
changeset
|
3547 else |
11352
5ea2644b0111
fix cut and paste error in Matrix by ComplexMatrix multiplication operator
John W. Eaton <jwe@octave.org>
parents:
11130
diff
changeset
|
3548 return ComplexMatrix (m) * a; |
2828 | 3549 } |
3550 | |
14427
d07e989686b0
Use Octave coding conventions in liboctave %!test blocks
Rik <octave@nomad.inbox5.com>
parents:
14138
diff
changeset
|
3551 /* |
d07e989686b0
Use Octave coding conventions in liboctave %!test blocks
Rik <octave@nomad.inbox5.com>
parents:
14138
diff
changeset
|
3552 |
d07e989686b0
Use Octave coding conventions in liboctave %!test blocks
Rik <octave@nomad.inbox5.com>
parents:
14138
diff
changeset
|
3553 ## Simple Dot Product, Matrix-Vector, and Matrix-Matrix Unit tests |
d07e989686b0
Use Octave coding conventions in liboctave %!test blocks
Rik <octave@nomad.inbox5.com>
parents:
14138
diff
changeset
|
3554 %!assert ([1+i 2+i 3+i] * [ 4+i ; 5+i ; 6+i], 29+21i, 1e-14) |
d07e989686b0
Use Octave coding conventions in liboctave %!test blocks
Rik <octave@nomad.inbox5.com>
parents:
14138
diff
changeset
|
3555 %!assert ([1+i 2+i ; 3+i 4+i ] * [5+i ; 6+i], [15 + 14i ; 37 + 18i], 1e-14) |
d07e989686b0
Use Octave coding conventions in liboctave %!test blocks
Rik <octave@nomad.inbox5.com>
parents:
14138
diff
changeset
|
3556 %!assert ([1+i 2+i ; 3+i 4+i ] * [5+i 6+i ; 7+i 8+i], [17 + 15i 20 + 17i; 41 + 19i 48 + 21i], 1e-14) |
21317
a4faec57f4c8
maint: remove semicolon after %!assert tests to follow Octave conventions.
Rik <rik@octave.org>
parents:
21301
diff
changeset
|
3557 %!assert ([1 i]*[i 0]', -i) |
14427
d07e989686b0
Use Octave coding conventions in liboctave %!test blocks
Rik <octave@nomad.inbox5.com>
parents:
14138
diff
changeset
|
3558 |
d07e989686b0
Use Octave coding conventions in liboctave %!test blocks
Rik <octave@nomad.inbox5.com>
parents:
14138
diff
changeset
|
3559 ## Test some simple identities |
6162 | 3560 %!shared M, cv, rv |
14427
d07e989686b0
Use Octave coding conventions in liboctave %!test blocks
Rik <octave@nomad.inbox5.com>
parents:
14138
diff
changeset
|
3561 %! M = randn (10,10) + i*rand (10,10); |
d07e989686b0
Use Octave coding conventions in liboctave %!test blocks
Rik <octave@nomad.inbox5.com>
parents:
14138
diff
changeset
|
3562 %! cv = randn (10,1) + i*rand (10,1); |
d07e989686b0
Use Octave coding conventions in liboctave %!test blocks
Rik <octave@nomad.inbox5.com>
parents:
14138
diff
changeset
|
3563 %! rv = randn (1,10) + i*rand (1,10); |
d07e989686b0
Use Octave coding conventions in liboctave %!test blocks
Rik <octave@nomad.inbox5.com>
parents:
14138
diff
changeset
|
3564 %!assert ([M*cv,M*cv], M*[cv,cv], 1e-14) |
d07e989686b0
Use Octave coding conventions in liboctave %!test blocks
Rik <octave@nomad.inbox5.com>
parents:
14138
diff
changeset
|
3565 %!assert ([M.'*cv,M.'*cv], M.'*[cv,cv], 1e-14) |
d07e989686b0
Use Octave coding conventions in liboctave %!test blocks
Rik <octave@nomad.inbox5.com>
parents:
14138
diff
changeset
|
3566 %!assert ([M'*cv,M'*cv], M'*[cv,cv], 1e-14) |
d07e989686b0
Use Octave coding conventions in liboctave %!test blocks
Rik <octave@nomad.inbox5.com>
parents:
14138
diff
changeset
|
3567 %!assert ([rv*M;rv*M], [rv;rv]*M, 1e-14) |
d07e989686b0
Use Octave coding conventions in liboctave %!test blocks
Rik <octave@nomad.inbox5.com>
parents:
14138
diff
changeset
|
3568 %!assert ([rv*M.';rv*M.'], [rv;rv]*M.', 1e-14) |
d07e989686b0
Use Octave coding conventions in liboctave %!test blocks
Rik <octave@nomad.inbox5.com>
parents:
14138
diff
changeset
|
3569 %!assert ([rv*M';rv*M'], [rv;rv]*M', 1e-14) |
d07e989686b0
Use Octave coding conventions in liboctave %!test blocks
Rik <octave@nomad.inbox5.com>
parents:
14138
diff
changeset
|
3570 %!assert (2*rv*cv, [rv,rv]*[cv;cv], 1e-14) |
d07e989686b0
Use Octave coding conventions in liboctave %!test blocks
Rik <octave@nomad.inbox5.com>
parents:
14138
diff
changeset
|
3571 |
6162 | 3572 */ |
3573 | |
11516 | 3574 static inline char |
7800
5861b95e9879
support for compound operators, implement trans_mul, mul_trans, herm_mul and mul_herm
Jaroslav Hajek <highegg@gmail.com>
parents:
7789
diff
changeset
|
3575 get_blas_trans_arg (bool trans, bool conj) |
5861b95e9879
support for compound operators, implement trans_mul, mul_trans, herm_mul and mul_herm
Jaroslav Hajek <highegg@gmail.com>
parents:
7789
diff
changeset
|
3576 { |
11516 | 3577 return trans ? (conj ? 'C' : 'T') : 'N'; |
7800
5861b95e9879
support for compound operators, implement trans_mul, mul_trans, herm_mul and mul_herm
Jaroslav Hajek <highegg@gmail.com>
parents:
7789
diff
changeset
|
3578 } |
5861b95e9879
support for compound operators, implement trans_mul, mul_trans, herm_mul and mul_herm
Jaroslav Hajek <highegg@gmail.com>
parents:
7789
diff
changeset
|
3579 |
5861b95e9879
support for compound operators, implement trans_mul, mul_trans, herm_mul and mul_herm
Jaroslav Hajek <highegg@gmail.com>
parents:
7789
diff
changeset
|
3580 // the general GEMM operation |
5861b95e9879
support for compound operators, implement trans_mul, mul_trans, herm_mul and mul_herm
Jaroslav Hajek <highegg@gmail.com>
parents:
7789
diff
changeset
|
3581 |
2828 | 3582 ComplexMatrix |
11586
12df7854fa7c
strip trailing whitespace from source files
John W. Eaton <jwe@octave.org>
parents:
11574
diff
changeset
|
3583 xgemm (const ComplexMatrix& a, const ComplexMatrix& b, |
9665
1dba57e9d08d
use blas_trans_type for xgemm
Jaroslav Hajek <highegg@gmail.com>
parents:
9663
diff
changeset
|
3584 blas_trans_type transa, blas_trans_type transb) |
2828 | 3585 { |
3586 ComplexMatrix retval; | |
3587 | |
18084
8e056300994b
Follow coding convention of defining and initializing only 1 variable per line in liboctave.
Rik <rik@octave.org>
parents:
18083
diff
changeset
|
3588 bool tra = transa != blas_no_trans; |
8e056300994b
Follow coding convention of defining and initializing only 1 variable per line in liboctave.
Rik <rik@octave.org>
parents:
18083
diff
changeset
|
3589 bool trb = transb != blas_no_trans; |
8e056300994b
Follow coding convention of defining and initializing only 1 variable per line in liboctave.
Rik <rik@octave.org>
parents:
18083
diff
changeset
|
3590 bool cja = transa == blas_conj_trans; |
8e056300994b
Follow coding convention of defining and initializing only 1 variable per line in liboctave.
Rik <rik@octave.org>
parents:
18083
diff
changeset
|
3591 bool cjb = transb == blas_conj_trans; |
9665
1dba57e9d08d
use blas_trans_type for xgemm
Jaroslav Hajek <highegg@gmail.com>
parents:
9663
diff
changeset
|
3592 |
1dba57e9d08d
use blas_trans_type for xgemm
Jaroslav Hajek <highegg@gmail.com>
parents:
9663
diff
changeset
|
3593 octave_idx_type a_nr = tra ? a.cols () : a.rows (); |
1dba57e9d08d
use blas_trans_type for xgemm
Jaroslav Hajek <highegg@gmail.com>
parents:
9663
diff
changeset
|
3594 octave_idx_type a_nc = tra ? a.rows () : a.cols (); |
1dba57e9d08d
use blas_trans_type for xgemm
Jaroslav Hajek <highegg@gmail.com>
parents:
9663
diff
changeset
|
3595 |
1dba57e9d08d
use blas_trans_type for xgemm
Jaroslav Hajek <highegg@gmail.com>
parents:
9663
diff
changeset
|
3596 octave_idx_type b_nr = trb ? b.cols () : b.rows (); |
1dba57e9d08d
use blas_trans_type for xgemm
Jaroslav Hajek <highegg@gmail.com>
parents:
9663
diff
changeset
|
3597 octave_idx_type b_nc = trb ? b.rows () : b.cols (); |
7800
5861b95e9879
support for compound operators, implement trans_mul, mul_trans, herm_mul and mul_herm
Jaroslav Hajek <highegg@gmail.com>
parents:
7789
diff
changeset
|
3598 |
5861b95e9879
support for compound operators, implement trans_mul, mul_trans, herm_mul and mul_herm
Jaroslav Hajek <highegg@gmail.com>
parents:
7789
diff
changeset
|
3599 if (a_nc != b_nr) |
21100
e39e05d90788
Switch gripe_XXX to either err_XXX or warn_XXX naming scheme.
Rik <rik@octave.org>
parents:
20955
diff
changeset
|
3600 err_nonconformant ("operator *", a_nr, a_nc, b_nr, b_nc); |
21120
499b851fbfae
Replace pattern if/err_XXX/else/code with if/err_XXX/ code.
Rik <rik@octave.org>
parents:
21112
diff
changeset
|
3601 |
499b851fbfae
Replace pattern if/err_XXX/else/code with if/err_XXX/ code.
Rik <rik@octave.org>
parents:
21112
diff
changeset
|
3602 if (a_nr == 0 || a_nc == 0 || b_nc == 0) |
499b851fbfae
Replace pattern if/err_XXX/else/code with if/err_XXX/ code.
Rik <rik@octave.org>
parents:
21112
diff
changeset
|
3603 retval = ComplexMatrix (a_nr, b_nc, 0.0); |
499b851fbfae
Replace pattern if/err_XXX/else/code with if/err_XXX/ code.
Rik <rik@octave.org>
parents:
21112
diff
changeset
|
3604 else if (a.data () == b.data () && a_nr == b_nc && tra != trb) |
2828 | 3605 { |
21120
499b851fbfae
Replace pattern if/err_XXX/else/code with if/err_XXX/ code.
Rik <rik@octave.org>
parents:
21112
diff
changeset
|
3606 octave_idx_type lda = a.rows (); |
499b851fbfae
Replace pattern if/err_XXX/else/code with if/err_XXX/ code.
Rik <rik@octave.org>
parents:
21112
diff
changeset
|
3607 |
499b851fbfae
Replace pattern if/err_XXX/else/code with if/err_XXX/ code.
Rik <rik@octave.org>
parents:
21112
diff
changeset
|
3608 // FIXME: looking at the reference BLAS, it appears that it |
499b851fbfae
Replace pattern if/err_XXX/else/code with if/err_XXX/ code.
Rik <rik@octave.org>
parents:
21112
diff
changeset
|
3609 // should not be necessary to initialize the output matrix if |
499b851fbfae
Replace pattern if/err_XXX/else/code with if/err_XXX/ code.
Rik <rik@octave.org>
parents:
21112
diff
changeset
|
3610 // BETA is 0 in the call to ZHERK, but ATLAS appears to |
499b851fbfae
Replace pattern if/err_XXX/else/code with if/err_XXX/ code.
Rik <rik@octave.org>
parents:
21112
diff
changeset
|
3611 // use the result matrix before zeroing the elements. |
499b851fbfae
Replace pattern if/err_XXX/else/code with if/err_XXX/ code.
Rik <rik@octave.org>
parents:
21112
diff
changeset
|
3612 |
499b851fbfae
Replace pattern if/err_XXX/else/code with if/err_XXX/ code.
Rik <rik@octave.org>
parents:
21112
diff
changeset
|
3613 retval = ComplexMatrix (a_nr, b_nc, 0.0); |
499b851fbfae
Replace pattern if/err_XXX/else/code with if/err_XXX/ code.
Rik <rik@octave.org>
parents:
21112
diff
changeset
|
3614 Complex *c = retval.fortran_vec (); |
499b851fbfae
Replace pattern if/err_XXX/else/code with if/err_XXX/ code.
Rik <rik@octave.org>
parents:
21112
diff
changeset
|
3615 |
499b851fbfae
Replace pattern if/err_XXX/else/code with if/err_XXX/ code.
Rik <rik@octave.org>
parents:
21112
diff
changeset
|
3616 const char ctra = get_blas_trans_arg (tra, cja); |
499b851fbfae
Replace pattern if/err_XXX/else/code with if/err_XXX/ code.
Rik <rik@octave.org>
parents:
21112
diff
changeset
|
3617 if (cja || cjb) |
7801
776791438957
map symmetric cases to xHERK, xSYRK
Jaroslav Hajek <highegg@gmail.com>
parents:
7800
diff
changeset
|
3618 { |
21120
499b851fbfae
Replace pattern if/err_XXX/else/code with if/err_XXX/ code.
Rik <rik@octave.org>
parents:
21112
diff
changeset
|
3619 F77_XFCN (zherk, ZHERK, (F77_CONST_CHAR_ARG2 ("U", 1), |
499b851fbfae
Replace pattern if/err_XXX/else/code with if/err_XXX/ code.
Rik <rik@octave.org>
parents:
21112
diff
changeset
|
3620 F77_CONST_CHAR_ARG2 (&ctra, 1), |
499b851fbfae
Replace pattern if/err_XXX/else/code with if/err_XXX/ code.
Rik <rik@octave.org>
parents:
21112
diff
changeset
|
3621 a_nr, a_nc, 1.0, |
22135
407c66ae1e20
reduce warnings from GCC's link-time optimization feature (bug #48531)
John W. Eaton <jwe@octave.org>
parents:
22133
diff
changeset
|
3622 F77_CONST_DBLE_CMPLX_ARG (a.data ()), lda, 0.0, F77_DBLE_CMPLX_ARG (c), a_nr |
21120
499b851fbfae
Replace pattern if/err_XXX/else/code with if/err_XXX/ code.
Rik <rik@octave.org>
parents:
21112
diff
changeset
|
3623 F77_CHAR_ARG_LEN (1) |
499b851fbfae
Replace pattern if/err_XXX/else/code with if/err_XXX/ code.
Rik <rik@octave.org>
parents:
21112
diff
changeset
|
3624 F77_CHAR_ARG_LEN (1))); |
499b851fbfae
Replace pattern if/err_XXX/else/code with if/err_XXX/ code.
Rik <rik@octave.org>
parents:
21112
diff
changeset
|
3625 for (octave_idx_type j = 0; j < a_nr; j++) |
499b851fbfae
Replace pattern if/err_XXX/else/code with if/err_XXX/ code.
Rik <rik@octave.org>
parents:
21112
diff
changeset
|
3626 for (octave_idx_type i = 0; i < j; i++) |
499b851fbfae
Replace pattern if/err_XXX/else/code with if/err_XXX/ code.
Rik <rik@octave.org>
parents:
21112
diff
changeset
|
3627 retval.xelem (j,i) = std::conj (retval.xelem (i,j)); |
7801
776791438957
map symmetric cases to xHERK, xSYRK
Jaroslav Hajek <highegg@gmail.com>
parents:
7800
diff
changeset
|
3628 } |
2828 | 3629 else |
10314
07ebe522dac2
untabify liboctave C++ sources
John W. Eaton <jwe@octave.org>
parents:
10213
diff
changeset
|
3630 { |
21120
499b851fbfae
Replace pattern if/err_XXX/else/code with if/err_XXX/ code.
Rik <rik@octave.org>
parents:
21112
diff
changeset
|
3631 F77_XFCN (zsyrk, ZSYRK, (F77_CONST_CHAR_ARG2 ("U", 1), |
499b851fbfae
Replace pattern if/err_XXX/else/code with if/err_XXX/ code.
Rik <rik@octave.org>
parents:
21112
diff
changeset
|
3632 F77_CONST_CHAR_ARG2 (&ctra, 1), |
499b851fbfae
Replace pattern if/err_XXX/else/code with if/err_XXX/ code.
Rik <rik@octave.org>
parents:
21112
diff
changeset
|
3633 a_nr, a_nc, 1.0, |
22135
407c66ae1e20
reduce warnings from GCC's link-time optimization feature (bug #48531)
John W. Eaton <jwe@octave.org>
parents:
22133
diff
changeset
|
3634 F77_CONST_DBLE_CMPLX_ARG (a.data ()), lda, 0.0, F77_DBLE_CMPLX_ARG (c), a_nr |
21120
499b851fbfae
Replace pattern if/err_XXX/else/code with if/err_XXX/ code.
Rik <rik@octave.org>
parents:
21112
diff
changeset
|
3635 F77_CHAR_ARG_LEN (1) |
499b851fbfae
Replace pattern if/err_XXX/else/code with if/err_XXX/ code.
Rik <rik@octave.org>
parents:
21112
diff
changeset
|
3636 F77_CHAR_ARG_LEN (1))); |
499b851fbfae
Replace pattern if/err_XXX/else/code with if/err_XXX/ code.
Rik <rik@octave.org>
parents:
21112
diff
changeset
|
3637 for (octave_idx_type j = 0; j < a_nr; j++) |
499b851fbfae
Replace pattern if/err_XXX/else/code with if/err_XXX/ code.
Rik <rik@octave.org>
parents:
21112
diff
changeset
|
3638 for (octave_idx_type i = 0; i < j; i++) |
499b851fbfae
Replace pattern if/err_XXX/else/code with if/err_XXX/ code.
Rik <rik@octave.org>
parents:
21112
diff
changeset
|
3639 retval.xelem (j,i) = retval.xelem (i,j); |
499b851fbfae
Replace pattern if/err_XXX/else/code with if/err_XXX/ code.
Rik <rik@octave.org>
parents:
21112
diff
changeset
|
3640 |
499b851fbfae
Replace pattern if/err_XXX/else/code with if/err_XXX/ code.
Rik <rik@octave.org>
parents:
21112
diff
changeset
|
3641 } |
499b851fbfae
Replace pattern if/err_XXX/else/code with if/err_XXX/ code.
Rik <rik@octave.org>
parents:
21112
diff
changeset
|
3642 |
499b851fbfae
Replace pattern if/err_XXX/else/code with if/err_XXX/ code.
Rik <rik@octave.org>
parents:
21112
diff
changeset
|
3643 } |
499b851fbfae
Replace pattern if/err_XXX/else/code with if/err_XXX/ code.
Rik <rik@octave.org>
parents:
21112
diff
changeset
|
3644 else |
499b851fbfae
Replace pattern if/err_XXX/else/code with if/err_XXX/ code.
Rik <rik@octave.org>
parents:
21112
diff
changeset
|
3645 { |
499b851fbfae
Replace pattern if/err_XXX/else/code with if/err_XXX/ code.
Rik <rik@octave.org>
parents:
21112
diff
changeset
|
3646 octave_idx_type lda = a.rows (); |
499b851fbfae
Replace pattern if/err_XXX/else/code with if/err_XXX/ code.
Rik <rik@octave.org>
parents:
21112
diff
changeset
|
3647 octave_idx_type tda = a.cols (); |
499b851fbfae
Replace pattern if/err_XXX/else/code with if/err_XXX/ code.
Rik <rik@octave.org>
parents:
21112
diff
changeset
|
3648 octave_idx_type ldb = b.rows (); |
499b851fbfae
Replace pattern if/err_XXX/else/code with if/err_XXX/ code.
Rik <rik@octave.org>
parents:
21112
diff
changeset
|
3649 octave_idx_type tdb = b.cols (); |
499b851fbfae
Replace pattern if/err_XXX/else/code with if/err_XXX/ code.
Rik <rik@octave.org>
parents:
21112
diff
changeset
|
3650 |
499b851fbfae
Replace pattern if/err_XXX/else/code with if/err_XXX/ code.
Rik <rik@octave.org>
parents:
21112
diff
changeset
|
3651 retval = ComplexMatrix (a_nr, b_nc, 0.0); |
499b851fbfae
Replace pattern if/err_XXX/else/code with if/err_XXX/ code.
Rik <rik@octave.org>
parents:
21112
diff
changeset
|
3652 Complex *c = retval.fortran_vec (); |
499b851fbfae
Replace pattern if/err_XXX/else/code with if/err_XXX/ code.
Rik <rik@octave.org>
parents:
21112
diff
changeset
|
3653 |
499b851fbfae
Replace pattern if/err_XXX/else/code with if/err_XXX/ code.
Rik <rik@octave.org>
parents:
21112
diff
changeset
|
3654 if (b_nc == 1 && a_nr == 1) |
499b851fbfae
Replace pattern if/err_XXX/else/code with if/err_XXX/ code.
Rik <rik@octave.org>
parents:
21112
diff
changeset
|
3655 { |
499b851fbfae
Replace pattern if/err_XXX/else/code with if/err_XXX/ code.
Rik <rik@octave.org>
parents:
21112
diff
changeset
|
3656 if (cja == cjb) |
7800
5861b95e9879
support for compound operators, implement trans_mul, mul_trans, herm_mul and mul_herm
Jaroslav Hajek <highegg@gmail.com>
parents:
7789
diff
changeset
|
3657 { |
22135
407c66ae1e20
reduce warnings from GCC's link-time optimization feature (bug #48531)
John W. Eaton <jwe@octave.org>
parents:
22133
diff
changeset
|
3658 F77_FUNC (xzdotu, XZDOTU) (a_nc, F77_CONST_DBLE_CMPLX_ARG (a.data ()), 1, F77_CONST_DBLE_CMPLX_ARG (b.data ()), 1, |
407c66ae1e20
reduce warnings from GCC's link-time optimization feature (bug #48531)
John W. Eaton <jwe@octave.org>
parents:
22133
diff
changeset
|
3659 F77_DBLE_CMPLX_ARG (c)); |
21120
499b851fbfae
Replace pattern if/err_XXX/else/code with if/err_XXX/ code.
Rik <rik@octave.org>
parents:
21112
diff
changeset
|
3660 if (cja) *c = std::conj (*c); |
7800
5861b95e9879
support for compound operators, implement trans_mul, mul_trans, herm_mul and mul_herm
Jaroslav Hajek <highegg@gmail.com>
parents:
7789
diff
changeset
|
3661 } |
21120
499b851fbfae
Replace pattern if/err_XXX/else/code with if/err_XXX/ code.
Rik <rik@octave.org>
parents:
21112
diff
changeset
|
3662 else if (cja) |
22135
407c66ae1e20
reduce warnings from GCC's link-time optimization feature (bug #48531)
John W. Eaton <jwe@octave.org>
parents:
22133
diff
changeset
|
3663 F77_FUNC (xzdotc, XZDOTC) (a_nc, F77_CONST_DBLE_CMPLX_ARG (a.data ()), 1, F77_CONST_DBLE_CMPLX_ARG (b.data ()), 1, |
407c66ae1e20
reduce warnings from GCC's link-time optimization feature (bug #48531)
John W. Eaton <jwe@octave.org>
parents:
22133
diff
changeset
|
3664 F77_DBLE_CMPLX_ARG (c)); |
10314
07ebe522dac2
untabify liboctave C++ sources
John W. Eaton <jwe@octave.org>
parents:
10213
diff
changeset
|
3665 else |
22135
407c66ae1e20
reduce warnings from GCC's link-time optimization feature (bug #48531)
John W. Eaton <jwe@octave.org>
parents:
22133
diff
changeset
|
3666 F77_FUNC (xzdotc, XZDOTC) (a_nc, F77_CONST_DBLE_CMPLX_ARG (b.data ()), 1, F77_CONST_DBLE_CMPLX_ARG (a.data ()), 1, |
407c66ae1e20
reduce warnings from GCC's link-time optimization feature (bug #48531)
John W. Eaton <jwe@octave.org>
parents:
22133
diff
changeset
|
3667 F77_DBLE_CMPLX_ARG (c)); |
21120
499b851fbfae
Replace pattern if/err_XXX/else/code with if/err_XXX/ code.
Rik <rik@octave.org>
parents:
21112
diff
changeset
|
3668 } |
499b851fbfae
Replace pattern if/err_XXX/else/code with if/err_XXX/ code.
Rik <rik@octave.org>
parents:
21112
diff
changeset
|
3669 else if (b_nc == 1 && ! cjb) |
499b851fbfae
Replace pattern if/err_XXX/else/code with if/err_XXX/ code.
Rik <rik@octave.org>
parents:
21112
diff
changeset
|
3670 { |
499b851fbfae
Replace pattern if/err_XXX/else/code with if/err_XXX/ code.
Rik <rik@octave.org>
parents:
21112
diff
changeset
|
3671 const char ctra = get_blas_trans_arg (tra, cja); |
499b851fbfae
Replace pattern if/err_XXX/else/code with if/err_XXX/ code.
Rik <rik@octave.org>
parents:
21112
diff
changeset
|
3672 F77_XFCN (zgemv, ZGEMV, (F77_CONST_CHAR_ARG2 (&ctra, 1), |
22135
407c66ae1e20
reduce warnings from GCC's link-time optimization feature (bug #48531)
John W. Eaton <jwe@octave.org>
parents:
22133
diff
changeset
|
3673 lda, tda, 1.0, F77_CONST_DBLE_CMPLX_ARG (a.data ()), lda, |
407c66ae1e20
reduce warnings from GCC's link-time optimization feature (bug #48531)
John W. Eaton <jwe@octave.org>
parents:
22133
diff
changeset
|
3674 F77_CONST_DBLE_CMPLX_ARG (b.data ()), 1, 0.0, F77_DBLE_CMPLX_ARG (c), 1 |
21120
499b851fbfae
Replace pattern if/err_XXX/else/code with if/err_XXX/ code.
Rik <rik@octave.org>
parents:
21112
diff
changeset
|
3675 F77_CHAR_ARG_LEN (1))); |
499b851fbfae
Replace pattern if/err_XXX/else/code with if/err_XXX/ code.
Rik <rik@octave.org>
parents:
21112
diff
changeset
|
3676 } |
499b851fbfae
Replace pattern if/err_XXX/else/code with if/err_XXX/ code.
Rik <rik@octave.org>
parents:
21112
diff
changeset
|
3677 else if (a_nr == 1 && ! cja && ! cjb) |
499b851fbfae
Replace pattern if/err_XXX/else/code with if/err_XXX/ code.
Rik <rik@octave.org>
parents:
21112
diff
changeset
|
3678 { |
499b851fbfae
Replace pattern if/err_XXX/else/code with if/err_XXX/ code.
Rik <rik@octave.org>
parents:
21112
diff
changeset
|
3679 const char crevtrb = get_blas_trans_arg (! trb, cjb); |
499b851fbfae
Replace pattern if/err_XXX/else/code with if/err_XXX/ code.
Rik <rik@octave.org>
parents:
21112
diff
changeset
|
3680 F77_XFCN (zgemv, ZGEMV, (F77_CONST_CHAR_ARG2 (&crevtrb, 1), |
22135
407c66ae1e20
reduce warnings from GCC's link-time optimization feature (bug #48531)
John W. Eaton <jwe@octave.org>
parents:
22133
diff
changeset
|
3681 ldb, tdb, 1.0, F77_CONST_DBLE_CMPLX_ARG (b.data ()), ldb, |
407c66ae1e20
reduce warnings from GCC's link-time optimization feature (bug #48531)
John W. Eaton <jwe@octave.org>
parents:
22133
diff
changeset
|
3682 F77_CONST_DBLE_CMPLX_ARG (a.data ()), 1, 0.0, F77_DBLE_CMPLX_ARG (c), 1 |
21120
499b851fbfae
Replace pattern if/err_XXX/else/code with if/err_XXX/ code.
Rik <rik@octave.org>
parents:
21112
diff
changeset
|
3683 F77_CHAR_ARG_LEN (1))); |
499b851fbfae
Replace pattern if/err_XXX/else/code with if/err_XXX/ code.
Rik <rik@octave.org>
parents:
21112
diff
changeset
|
3684 } |
499b851fbfae
Replace pattern if/err_XXX/else/code with if/err_XXX/ code.
Rik <rik@octave.org>
parents:
21112
diff
changeset
|
3685 else |
499b851fbfae
Replace pattern if/err_XXX/else/code with if/err_XXX/ code.
Rik <rik@octave.org>
parents:
21112
diff
changeset
|
3686 { |
499b851fbfae
Replace pattern if/err_XXX/else/code with if/err_XXX/ code.
Rik <rik@octave.org>
parents:
21112
diff
changeset
|
3687 const char ctra = get_blas_trans_arg (tra, cja); |
499b851fbfae
Replace pattern if/err_XXX/else/code with if/err_XXX/ code.
Rik <rik@octave.org>
parents:
21112
diff
changeset
|
3688 const char ctrb = get_blas_trans_arg (trb, cjb); |
499b851fbfae
Replace pattern if/err_XXX/else/code with if/err_XXX/ code.
Rik <rik@octave.org>
parents:
21112
diff
changeset
|
3689 F77_XFCN (zgemm, ZGEMM, (F77_CONST_CHAR_ARG2 (&ctra, 1), |
499b851fbfae
Replace pattern if/err_XXX/else/code with if/err_XXX/ code.
Rik <rik@octave.org>
parents:
21112
diff
changeset
|
3690 F77_CONST_CHAR_ARG2 (&ctrb, 1), |
22135
407c66ae1e20
reduce warnings from GCC's link-time optimization feature (bug #48531)
John W. Eaton <jwe@octave.org>
parents:
22133
diff
changeset
|
3691 a_nr, b_nc, a_nc, 1.0, F77_CONST_DBLE_CMPLX_ARG (a.data ()), |
407c66ae1e20
reduce warnings from GCC's link-time optimization feature (bug #48531)
John W. Eaton <jwe@octave.org>
parents:
22133
diff
changeset
|
3692 lda, F77_CONST_DBLE_CMPLX_ARG (b.data ()), ldb, 0.0, F77_DBLE_CMPLX_ARG (c), a_nr |
21120
499b851fbfae
Replace pattern if/err_XXX/else/code with if/err_XXX/ code.
Rik <rik@octave.org>
parents:
21112
diff
changeset
|
3693 F77_CHAR_ARG_LEN (1) |
499b851fbfae
Replace pattern if/err_XXX/else/code with if/err_XXX/ code.
Rik <rik@octave.org>
parents:
21112
diff
changeset
|
3694 F77_CHAR_ARG_LEN (1))); |
10314
07ebe522dac2
untabify liboctave C++ sources
John W. Eaton <jwe@octave.org>
parents:
10213
diff
changeset
|
3695 } |
2828 | 3696 } |
3697 | |
3698 return retval; | |
3699 } | |
3700 | |
7800
5861b95e9879
support for compound operators, implement trans_mul, mul_trans, herm_mul and mul_herm
Jaroslav Hajek <highegg@gmail.com>
parents:
7789
diff
changeset
|
3701 ComplexMatrix |
5861b95e9879
support for compound operators, implement trans_mul, mul_trans, herm_mul and mul_herm
Jaroslav Hajek <highegg@gmail.com>
parents:
7789
diff
changeset
|
3702 operator * (const ComplexMatrix& a, const ComplexMatrix& b) |
5861b95e9879
support for compound operators, implement trans_mul, mul_trans, herm_mul and mul_herm
Jaroslav Hajek <highegg@gmail.com>
parents:
7789
diff
changeset
|
3703 { |
9665
1dba57e9d08d
use blas_trans_type for xgemm
Jaroslav Hajek <highegg@gmail.com>
parents:
9663
diff
changeset
|
3704 return xgemm (a, b); |
7800
5861b95e9879
support for compound operators, implement trans_mul, mul_trans, herm_mul and mul_herm
Jaroslav Hajek <highegg@gmail.com>
parents:
7789
diff
changeset
|
3705 } |
5861b95e9879
support for compound operators, implement trans_mul, mul_trans, herm_mul and mul_herm
Jaroslav Hajek <highegg@gmail.com>
parents:
7789
diff
changeset
|
3706 |
17769
49a5a4be04a1
maint: Use GNU style coding conventions for code in liboctave/
Rik <rik@octave.org>
parents:
17744
diff
changeset
|
3707 // FIXME: it would be nice to share code among the min/max functions below. |
4309 | 3708 |
22197
e43d83253e28
refill multi-line macro definitions
John W. Eaton <jwe@octave.org>
parents:
22135
diff
changeset
|
3709 #define EMPTY_RETURN_CHECK(T) \ |
e43d83253e28
refill multi-line macro definitions
John W. Eaton <jwe@octave.org>
parents:
22135
diff
changeset
|
3710 if (nr == 0 || nc == 0) \ |
4309 | 3711 return T (nr, nc); |
3712 | |
3713 ComplexMatrix | |
3714 min (const Complex& c, const ComplexMatrix& m) | |
3715 { | |
5275 | 3716 octave_idx_type nr = m.rows (); |
3717 octave_idx_type nc = m.columns (); | |
4309 | 3718 |
3719 EMPTY_RETURN_CHECK (ComplexMatrix); | |
3720 | |
3721 ComplexMatrix result (nr, nc); | |
3722 | |
5275 | 3723 for (octave_idx_type j = 0; j < nc; j++) |
3724 for (octave_idx_type i = 0; i < nr; i++) | |
4309 | 3725 { |
10314
07ebe522dac2
untabify liboctave C++ sources
John W. Eaton <jwe@octave.org>
parents:
10213
diff
changeset
|
3726 octave_quit (); |
21782
2aef506f3fec
use namespace for lo-mappers.h functions
John W. Eaton <jwe@octave.org>
parents:
21751
diff
changeset
|
3727 result(i, j) = octave::math::min (c, m(i, j)); |
4309 | 3728 } |
3729 | |
3730 return result; | |
3731 } | |
3732 | |
3733 ComplexMatrix | |
3734 min (const ComplexMatrix& m, const Complex& c) | |
3735 { | |
22085
bf5fbf347aaf
Avoid segfault with complex matrices using LAPACK (bug #46330).
Kai T. Ohlhus <k.ohlhus@gmail.com>
parents:
22044
diff
changeset
|
3736 return min (c, m); |
4309 | 3737 } |
3738 | |
3739 ComplexMatrix | |
3740 min (const ComplexMatrix& a, const ComplexMatrix& b) | |
3741 { | |
5275 | 3742 octave_idx_type nr = a.rows (); |
3743 octave_idx_type nc = a.columns (); | |
4309 | 3744 |
3745 if (nr != b.rows () || nc != b.columns ()) | |
21136
7cac4e7458f2
maint: clean up code around calls to current_liboctave_error_handler.
Rik <rik@octave.org>
parents:
21129
diff
changeset
|
3746 (*current_liboctave_error_handler) |
7cac4e7458f2
maint: clean up code around calls to current_liboctave_error_handler.
Rik <rik@octave.org>
parents:
21129
diff
changeset
|
3747 ("two-arg min requires same size arguments"); |
4309 | 3748 |
3749 EMPTY_RETURN_CHECK (ComplexMatrix); | |
3750 | |
3751 ComplexMatrix result (nr, nc); | |
3752 | |
5275 | 3753 for (octave_idx_type j = 0; j < nc; j++) |
4309 | 3754 { |
21719
ff054947d132
use bool instead of int for some logical flags
John W. Eaton <jwe@octave.org>
parents:
21317
diff
changeset
|
3755 bool columns_are_real_only = true; |
5275 | 3756 for (octave_idx_type i = 0; i < nr; i++) |
10314
07ebe522dac2
untabify liboctave C++ sources
John W. Eaton <jwe@octave.org>
parents:
10213
diff
changeset
|
3757 { |
07ebe522dac2
untabify liboctave C++ sources
John W. Eaton <jwe@octave.org>
parents:
10213
diff
changeset
|
3758 octave_quit (); |
18083
938f01339043
maint: Use Octave coding convention for indexing vs. function calls in liboctave/array.
Rik <rik@octave.org>
parents:
17769
diff
changeset
|
3759 if (std::imag (a(i, j)) != 0.0 || std::imag (b(i, j)) != 0.0) |
10314
07ebe522dac2
untabify liboctave C++ sources
John W. Eaton <jwe@octave.org>
parents:
10213
diff
changeset
|
3760 { |
21719
ff054947d132
use bool instead of int for some logical flags
John W. Eaton <jwe@octave.org>
parents:
21317
diff
changeset
|
3761 columns_are_real_only = false; |
10314
07ebe522dac2
untabify liboctave C++ sources
John W. Eaton <jwe@octave.org>
parents:
10213
diff
changeset
|
3762 break; |
07ebe522dac2
untabify liboctave C++ sources
John W. Eaton <jwe@octave.org>
parents:
10213
diff
changeset
|
3763 } |
07ebe522dac2
untabify liboctave C++ sources
John W. Eaton <jwe@octave.org>
parents:
10213
diff
changeset
|
3764 } |
4309 | 3765 |
3766 if (columns_are_real_only) | |
10314
07ebe522dac2
untabify liboctave C++ sources
John W. Eaton <jwe@octave.org>
parents:
10213
diff
changeset
|
3767 { |
07ebe522dac2
untabify liboctave C++ sources
John W. Eaton <jwe@octave.org>
parents:
10213
diff
changeset
|
3768 for (octave_idx_type i = 0; i < nr; i++) |
21782
2aef506f3fec
use namespace for lo-mappers.h functions
John W. Eaton <jwe@octave.org>
parents:
21751
diff
changeset
|
3769 result(i, j) = octave::math::min (std::real (a(i, j)), std::real (b(i, j))); |
10314
07ebe522dac2
untabify liboctave C++ sources
John W. Eaton <jwe@octave.org>
parents:
10213
diff
changeset
|
3770 } |
4309 | 3771 else |
10314
07ebe522dac2
untabify liboctave C++ sources
John W. Eaton <jwe@octave.org>
parents:
10213
diff
changeset
|
3772 { |
07ebe522dac2
untabify liboctave C++ sources
John W. Eaton <jwe@octave.org>
parents:
10213
diff
changeset
|
3773 for (octave_idx_type i = 0; i < nr; i++) |
07ebe522dac2
untabify liboctave C++ sources
John W. Eaton <jwe@octave.org>
parents:
10213
diff
changeset
|
3774 { |
07ebe522dac2
untabify liboctave C++ sources
John W. Eaton <jwe@octave.org>
parents:
10213
diff
changeset
|
3775 octave_quit (); |
21782
2aef506f3fec
use namespace for lo-mappers.h functions
John W. Eaton <jwe@octave.org>
parents:
21751
diff
changeset
|
3776 result(i, j) = octave::math::min (a(i, j), b(i, j)); |
10314
07ebe522dac2
untabify liboctave C++ sources
John W. Eaton <jwe@octave.org>
parents:
10213
diff
changeset
|
3777 } |
07ebe522dac2
untabify liboctave C++ sources
John W. Eaton <jwe@octave.org>
parents:
10213
diff
changeset
|
3778 } |
4309 | 3779 } |
3780 | |
3781 return result; | |
3782 } | |
3783 | |
3784 ComplexMatrix | |
3785 max (const Complex& c, const ComplexMatrix& m) | |
3786 { | |
5275 | 3787 octave_idx_type nr = m.rows (); |
3788 octave_idx_type nc = m.columns (); | |
4309 | 3789 |
3790 EMPTY_RETURN_CHECK (ComplexMatrix); | |
3791 | |
3792 ComplexMatrix result (nr, nc); | |
3793 | |
5275 | 3794 for (octave_idx_type j = 0; j < nc; j++) |
3795 for (octave_idx_type i = 0; i < nr; i++) | |
4309 | 3796 { |
10314
07ebe522dac2
untabify liboctave C++ sources
John W. Eaton <jwe@octave.org>
parents:
10213
diff
changeset
|
3797 octave_quit (); |
21782
2aef506f3fec
use namespace for lo-mappers.h functions
John W. Eaton <jwe@octave.org>
parents:
21751
diff
changeset
|
3798 result(i, j) = octave::math::max (c, m(i, j)); |
4309 | 3799 } |
3800 | |
3801 return result; | |
3802 } | |
3803 | |
3804 ComplexMatrix | |
3805 max (const ComplexMatrix& m, const Complex& c) | |
3806 { | |
22085
bf5fbf347aaf
Avoid segfault with complex matrices using LAPACK (bug #46330).
Kai T. Ohlhus <k.ohlhus@gmail.com>
parents:
22044
diff
changeset
|
3807 return max (c, m); |
4309 | 3808 } |
3809 | |
3810 ComplexMatrix | |
3811 max (const ComplexMatrix& a, const ComplexMatrix& b) | |
3812 { | |
5275 | 3813 octave_idx_type nr = a.rows (); |
3814 octave_idx_type nc = a.columns (); | |
4309 | 3815 |
3816 if (nr != b.rows () || nc != b.columns ()) | |
21136
7cac4e7458f2
maint: clean up code around calls to current_liboctave_error_handler.
Rik <rik@octave.org>
parents:
21129
diff
changeset
|
3817 (*current_liboctave_error_handler) |
7cac4e7458f2
maint: clean up code around calls to current_liboctave_error_handler.
Rik <rik@octave.org>
parents:
21129
diff
changeset
|
3818 ("two-arg max requires same size arguments"); |
4309 | 3819 |
3820 EMPTY_RETURN_CHECK (ComplexMatrix); | |
3821 | |
3822 ComplexMatrix result (nr, nc); | |
3823 | |
5275 | 3824 for (octave_idx_type j = 0; j < nc; j++) |
4309 | 3825 { |
21719
ff054947d132
use bool instead of int for some logical flags
John W. Eaton <jwe@octave.org>
parents:
21317
diff
changeset
|
3826 bool columns_are_real_only = true; |
5275 | 3827 for (octave_idx_type i = 0; i < nr; i++) |
10314
07ebe522dac2
untabify liboctave C++ sources
John W. Eaton <jwe@octave.org>
parents:
10213
diff
changeset
|
3828 { |
07ebe522dac2
untabify liboctave C++ sources
John W. Eaton <jwe@octave.org>
parents:
10213
diff
changeset
|
3829 octave_quit (); |
18083
938f01339043
maint: Use Octave coding convention for indexing vs. function calls in liboctave/array.
Rik <rik@octave.org>
parents:
17769
diff
changeset
|
3830 if (std::imag (a(i, j)) != 0.0 || std::imag (b(i, j)) != 0.0) |
10314
07ebe522dac2
untabify liboctave C++ sources
John W. Eaton <jwe@octave.org>
parents:
10213
diff
changeset
|
3831 { |
21719
ff054947d132
use bool instead of int for some logical flags
John W. Eaton <jwe@octave.org>
parents:
21317
diff
changeset
|
3832 columns_are_real_only = false; |
10314
07ebe522dac2
untabify liboctave C++ sources
John W. Eaton <jwe@octave.org>
parents:
10213
diff
changeset
|
3833 break; |
07ebe522dac2
untabify liboctave C++ sources
John W. Eaton <jwe@octave.org>
parents:
10213
diff
changeset
|
3834 } |
07ebe522dac2
untabify liboctave C++ sources
John W. Eaton <jwe@octave.org>
parents:
10213
diff
changeset
|
3835 } |
4309 | 3836 |
22085
bf5fbf347aaf
Avoid segfault with complex matrices using LAPACK (bug #46330).
Kai T. Ohlhus <k.ohlhus@gmail.com>
parents:
22044
diff
changeset
|
3837 // FIXME: is it so much faster? |
4309 | 3838 if (columns_are_real_only) |
10314
07ebe522dac2
untabify liboctave C++ sources
John W. Eaton <jwe@octave.org>
parents:
10213
diff
changeset
|
3839 { |
07ebe522dac2
untabify liboctave C++ sources
John W. Eaton <jwe@octave.org>
parents:
10213
diff
changeset
|
3840 for (octave_idx_type i = 0; i < nr; i++) |
07ebe522dac2
untabify liboctave C++ sources
John W. Eaton <jwe@octave.org>
parents:
10213
diff
changeset
|
3841 { |
07ebe522dac2
untabify liboctave C++ sources
John W. Eaton <jwe@octave.org>
parents:
10213
diff
changeset
|
3842 octave_quit (); |
21782
2aef506f3fec
use namespace for lo-mappers.h functions
John W. Eaton <jwe@octave.org>
parents:
21751
diff
changeset
|
3843 result(i, j) = octave::math::max (std::real (a(i, j)), std::real (b(i, j))); |
10314
07ebe522dac2
untabify liboctave C++ sources
John W. Eaton <jwe@octave.org>
parents:
10213
diff
changeset
|
3844 } |
07ebe522dac2
untabify liboctave C++ sources
John W. Eaton <jwe@octave.org>
parents:
10213
diff
changeset
|
3845 } |
4309 | 3846 else |
10314
07ebe522dac2
untabify liboctave C++ sources
John W. Eaton <jwe@octave.org>
parents:
10213
diff
changeset
|
3847 { |
07ebe522dac2
untabify liboctave C++ sources
John W. Eaton <jwe@octave.org>
parents:
10213
diff
changeset
|
3848 for (octave_idx_type i = 0; i < nr; i++) |
07ebe522dac2
untabify liboctave C++ sources
John W. Eaton <jwe@octave.org>
parents:
10213
diff
changeset
|
3849 { |
07ebe522dac2
untabify liboctave C++ sources
John W. Eaton <jwe@octave.org>
parents:
10213
diff
changeset
|
3850 octave_quit (); |
21782
2aef506f3fec
use namespace for lo-mappers.h functions
John W. Eaton <jwe@octave.org>
parents:
21751
diff
changeset
|
3851 result(i, j) = octave::math::max (a(i, j), b(i, j)); |
10314
07ebe522dac2
untabify liboctave C++ sources
John W. Eaton <jwe@octave.org>
parents:
10213
diff
changeset
|
3852 } |
07ebe522dac2
untabify liboctave C++ sources
John W. Eaton <jwe@octave.org>
parents:
10213
diff
changeset
|
3853 } |
4309 | 3854 } |
3855 | |
3856 return result; | |
3857 } | |
3858 | |
11586
12df7854fa7c
strip trailing whitespace from source files
John W. Eaton <jwe@octave.org>
parents:
11574
diff
changeset
|
3859 ComplexMatrix linspace (const ComplexColumnVector& x1, |
12df7854fa7c
strip trailing whitespace from source files
John W. Eaton <jwe@octave.org>
parents:
11574
diff
changeset
|
3860 const ComplexColumnVector& x2, |
9653
e087d7c77ff9
improve linspace in liboctave
Jaroslav Hajek <highegg@gmail.com>
parents:
9601
diff
changeset
|
3861 octave_idx_type n) |
e087d7c77ff9
improve linspace in liboctave
Jaroslav Hajek <highegg@gmail.com>
parents:
9601
diff
changeset
|
3862 { |
20232
a9574e3c6e9e
Deprecate Array::length() and Sparse::length() in favour of ::numel().
Carnë Draug <carandraug@octave.org>
parents:
20218
diff
changeset
|
3863 octave_idx_type m = x1.numel (); |
a9574e3c6e9e
Deprecate Array::length() and Sparse::length() in favour of ::numel().
Carnë Draug <carandraug@octave.org>
parents:
20218
diff
changeset
|
3864 |
a9574e3c6e9e
Deprecate Array::length() and Sparse::length() in favour of ::numel().
Carnë Draug <carandraug@octave.org>
parents:
20218
diff
changeset
|
3865 if (x2.numel () != m) |
17769
49a5a4be04a1
maint: Use GNU style coding conventions for code in liboctave/
Rik <rik@octave.org>
parents:
17744
diff
changeset
|
3866 (*current_liboctave_error_handler) |
49a5a4be04a1
maint: Use GNU style coding conventions for code in liboctave/
Rik <rik@octave.org>
parents:
17744
diff
changeset
|
3867 ("linspace: vectors must be of equal length"); |
9653
e087d7c77ff9
improve linspace in liboctave
Jaroslav Hajek <highegg@gmail.com>
parents:
9601
diff
changeset
|
3868 |
e087d7c77ff9
improve linspace in liboctave
Jaroslav Hajek <highegg@gmail.com>
parents:
9601
diff
changeset
|
3869 NoAlias<ComplexMatrix> retval; |
e087d7c77ff9
improve linspace in liboctave
Jaroslav Hajek <highegg@gmail.com>
parents:
9601
diff
changeset
|
3870 |
20466
16b9ec39ff46
Return empty matrix when linspace called with 0 points (bug #45820)
Rik <rik@octave.org>
parents:
20462
diff
changeset
|
3871 if (n < 1) |
16b9ec39ff46
Return empty matrix when linspace called with 0 points (bug #45820)
Rik <rik@octave.org>
parents:
20462
diff
changeset
|
3872 { |
16b9ec39ff46
Return empty matrix when linspace called with 0 points (bug #45820)
Rik <rik@octave.org>
parents:
20462
diff
changeset
|
3873 retval.clear (m, 0); |
16b9ec39ff46
Return empty matrix when linspace called with 0 points (bug #45820)
Rik <rik@octave.org>
parents:
20462
diff
changeset
|
3874 return retval; |
16b9ec39ff46
Return empty matrix when linspace called with 0 points (bug #45820)
Rik <rik@octave.org>
parents:
20462
diff
changeset
|
3875 } |
16b9ec39ff46
Return empty matrix when linspace called with 0 points (bug #45820)
Rik <rik@octave.org>
parents:
20462
diff
changeset
|
3876 |
9653
e087d7c77ff9
improve linspace in liboctave
Jaroslav Hajek <highegg@gmail.com>
parents:
9601
diff
changeset
|
3877 retval.clear (m, n); |
e087d7c77ff9
improve linspace in liboctave
Jaroslav Hajek <highegg@gmail.com>
parents:
9601
diff
changeset
|
3878 for (octave_idx_type i = 0; i < m; i++) |
e087d7c77ff9
improve linspace in liboctave
Jaroslav Hajek <highegg@gmail.com>
parents:
9601
diff
changeset
|
3879 retval(i, 0) = x1(i); |
e087d7c77ff9
improve linspace in liboctave
Jaroslav Hajek <highegg@gmail.com>
parents:
9601
diff
changeset
|
3880 |
20466
16b9ec39ff46
Return empty matrix when linspace called with 0 points (bug #45820)
Rik <rik@octave.org>
parents:
20462
diff
changeset
|
3881 // The last column is unused so temporarily store delta there |
11586
12df7854fa7c
strip trailing whitespace from source files
John W. Eaton <jwe@octave.org>
parents:
11574
diff
changeset
|
3882 Complex *delta = &retval(0, n-1); |
9653
e087d7c77ff9
improve linspace in liboctave
Jaroslav Hajek <highegg@gmail.com>
parents:
9601
diff
changeset
|
3883 for (octave_idx_type i = 0; i < m; i++) |
e087d7c77ff9
improve linspace in liboctave
Jaroslav Hajek <highegg@gmail.com>
parents:
9601
diff
changeset
|
3884 delta[i] = (x2(i) - x1(i)) / (n - 1.0); |
e087d7c77ff9
improve linspace in liboctave
Jaroslav Hajek <highegg@gmail.com>
parents:
9601
diff
changeset
|
3885 |
e087d7c77ff9
improve linspace in liboctave
Jaroslav Hajek <highegg@gmail.com>
parents:
9601
diff
changeset
|
3886 for (octave_idx_type j = 1; j < n-1; j++) |
e087d7c77ff9
improve linspace in liboctave
Jaroslav Hajek <highegg@gmail.com>
parents:
9601
diff
changeset
|
3887 for (octave_idx_type i = 0; i < m; i++) |
9658
3429c956de6f
extend linspace & fix up liboctave rewrite
Jaroslav Hajek <highegg@gmail.com>
parents:
9653
diff
changeset
|
3888 retval(i, j) = x1(i) + static_cast<double> (j)*delta[i]; |
9653
e087d7c77ff9
improve linspace in liboctave
Jaroslav Hajek <highegg@gmail.com>
parents:
9601
diff
changeset
|
3889 |
e087d7c77ff9
improve linspace in liboctave
Jaroslav Hajek <highegg@gmail.com>
parents:
9601
diff
changeset
|
3890 for (octave_idx_type i = 0; i < m; i++) |
e087d7c77ff9
improve linspace in liboctave
Jaroslav Hajek <highegg@gmail.com>
parents:
9601
diff
changeset
|
3891 retval(i, n-1) = x2(i); |
e087d7c77ff9
improve linspace in liboctave
Jaroslav Hajek <highegg@gmail.com>
parents:
9601
diff
changeset
|
3892 |
e087d7c77ff9
improve linspace in liboctave
Jaroslav Hajek <highegg@gmail.com>
parents:
9601
diff
changeset
|
3893 return retval; |
e087d7c77ff9
improve linspace in liboctave
Jaroslav Hajek <highegg@gmail.com>
parents:
9601
diff
changeset
|
3894 } |
e087d7c77ff9
improve linspace in liboctave
Jaroslav Hajek <highegg@gmail.com>
parents:
9601
diff
changeset
|
3895 |
9578
7dafdb8b062f
refactor comparison ops implementations
Jaroslav Hajek <highegg@gmail.com>
parents:
9553
diff
changeset
|
3896 MS_CMP_OPS (ComplexMatrix, Complex) |
9550
3d6a9aea2aea
refactor binary & bool ops in liboctave
Jaroslav Hajek <highegg@gmail.com>
parents:
9528
diff
changeset
|
3897 MS_BOOL_OPS (ComplexMatrix, Complex) |
2870 | 3898 |
9578
7dafdb8b062f
refactor comparison ops implementations
Jaroslav Hajek <highegg@gmail.com>
parents:
9553
diff
changeset
|
3899 SM_CMP_OPS (Complex, ComplexMatrix) |
9550
3d6a9aea2aea
refactor binary & bool ops in liboctave
Jaroslav Hajek <highegg@gmail.com>
parents:
9528
diff
changeset
|
3900 SM_BOOL_OPS (Complex, ComplexMatrix) |
2870 | 3901 |
9578
7dafdb8b062f
refactor comparison ops implementations
Jaroslav Hajek <highegg@gmail.com>
parents:
9553
diff
changeset
|
3902 MM_CMP_OPS (ComplexMatrix, ComplexMatrix) |
9550
3d6a9aea2aea
refactor binary & bool ops in liboctave
Jaroslav Hajek <highegg@gmail.com>
parents:
9528
diff
changeset
|
3903 MM_BOOL_OPS (ComplexMatrix, ComplexMatrix) |