annotate src/xpow.cc @ 9103:10bed8fbec99

optimize scalar .^ range operation
author Jaroslav Hajek <highegg@gmail.com>
date Wed, 08 Apr 2009 10:53:06 +0200
parents a7c00773a089
children f39b98237d5c
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
1
78fd87e624cb [project @ 1993-08-08 01:13:40 by jwe]
jwe
parents:
diff changeset
1 /*
78fd87e624cb [project @ 1993-08-08 01:13:40 by jwe]
jwe
parents:
diff changeset
2
7017
a1dbe9d80eee [project @ 2007-10-12 21:27:11 by jwe]
jwe
parents: 7016
diff changeset
3 Copyright (C) 1993, 1994, 1995, 1996, 1997, 1998, 2000, 2002, 2003,
8920
eb63fbe60fab update copyright notices
John W. Eaton <jwe@octave.org>
parents: 8382
diff changeset
4 2004, 2005, 2006, 2007, 2008 John W. Eaton
1
78fd87e624cb [project @ 1993-08-08 01:13:40 by jwe]
jwe
parents:
diff changeset
5
78fd87e624cb [project @ 1993-08-08 01:13:40 by jwe]
jwe
parents:
diff changeset
6 This file is part of Octave.
78fd87e624cb [project @ 1993-08-08 01:13:40 by jwe]
jwe
parents:
diff changeset
7
78fd87e624cb [project @ 1993-08-08 01:13:40 by jwe]
jwe
parents:
diff changeset
8 Octave is free software; you can redistribute it and/or modify it
78fd87e624cb [project @ 1993-08-08 01:13:40 by jwe]
jwe
parents:
diff changeset
9 under the terms of the GNU General Public License as published by the
7016
93c65f2a5668 [project @ 2007-10-12 06:40:56 by jwe]
jwe
parents: 6207
diff changeset
10 Free Software Foundation; either version 3 of the License, or (at your
93c65f2a5668 [project @ 2007-10-12 06:40:56 by jwe]
jwe
parents: 6207
diff changeset
11 option) any later version.
1
78fd87e624cb [project @ 1993-08-08 01:13:40 by jwe]
jwe
parents:
diff changeset
12
78fd87e624cb [project @ 1993-08-08 01:13:40 by jwe]
jwe
parents:
diff changeset
13 Octave is distributed in the hope that it will be useful, but WITHOUT
78fd87e624cb [project @ 1993-08-08 01:13:40 by jwe]
jwe
parents:
diff changeset
14 ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
78fd87e624cb [project @ 1993-08-08 01:13:40 by jwe]
jwe
parents:
diff changeset
15 FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
78fd87e624cb [project @ 1993-08-08 01:13:40 by jwe]
jwe
parents:
diff changeset
16 for more details.
78fd87e624cb [project @ 1993-08-08 01:13:40 by jwe]
jwe
parents:
diff changeset
17
78fd87e624cb [project @ 1993-08-08 01:13:40 by jwe]
jwe
parents:
diff changeset
18 You should have received a copy of the GNU General Public License
7016
93c65f2a5668 [project @ 2007-10-12 06:40:56 by jwe]
jwe
parents: 6207
diff changeset
19 along with Octave; see the file COPYING. If not, see
93c65f2a5668 [project @ 2007-10-12 06:40:56 by jwe]
jwe
parents: 6207
diff changeset
20 <http://www.gnu.org/licenses/>.
1
78fd87e624cb [project @ 1993-08-08 01:13:40 by jwe]
jwe
parents:
diff changeset
21
78fd87e624cb [project @ 1993-08-08 01:13:40 by jwe]
jwe
parents:
diff changeset
22 */
78fd87e624cb [project @ 1993-08-08 01:13:40 by jwe]
jwe
parents:
diff changeset
23
240
a99f28f5e351 [project @ 1993-11-30 20:24:36 by jwe]
jwe
parents: 164
diff changeset
24 #ifdef HAVE_CONFIG_H
1192
b6360f2d4fa6 [project @ 1995-03-30 21:38:35 by jwe]
jwe
parents: 1009
diff changeset
25 #include <config.h>
1
78fd87e624cb [project @ 1993-08-08 01:13:40 by jwe]
jwe
parents:
diff changeset
26 #endif
78fd87e624cb [project @ 1993-08-08 01:13:40 by jwe]
jwe
parents:
diff changeset
27
1343
94bedeb289e5 [project @ 1995-09-04 00:29:21 by jwe]
jwe
parents: 1321
diff changeset
28 #include <cassert>
1580
0c49e5e8dd5b [project @ 1995-10-19 21:26:43 by jwe]
jwe
parents: 1567
diff changeset
29 #include <climits>
1343
94bedeb289e5 [project @ 1995-09-04 00:29:21 by jwe]
jwe
parents: 1321
diff changeset
30
4669
334a27c8f453 [project @ 2003-11-26 07:02:42 by jwe]
jwe
parents: 4543
diff changeset
31 #include "Array-util.h"
1352
19c10b8657d5 [project @ 1995-09-05 08:11:57 by jwe]
jwe
parents: 1343
diff changeset
32 #include "CColVector.h"
453
393e95f46b51 [project @ 1994-06-06 00:05:20 by jwe]
jwe
parents: 240
diff changeset
33 #include "CDiagMatrix.h"
8382
9b20a4847056 implement scalar powers of diag matrices
Jaroslav Hajek <highegg@gmail.com>
parents: 7789
diff changeset
34 #include "fCDiagMatrix.h"
1352
19c10b8657d5 [project @ 1995-09-05 08:11:57 by jwe]
jwe
parents: 1343
diff changeset
35 #include "CMatrix.h"
453
393e95f46b51 [project @ 1994-06-06 00:05:20 by jwe]
jwe
parents: 240
diff changeset
36 #include "EIG.h"
7789
82be108cc558 First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents: 7578
diff changeset
37 #include "fEIG.h"
1352
19c10b8657d5 [project @ 1995-09-05 08:11:57 by jwe]
jwe
parents: 1343
diff changeset
38 #include "dDiagMatrix.h"
8382
9b20a4847056 implement scalar powers of diag matrices
Jaroslav Hajek <highegg@gmail.com>
parents: 7789
diff changeset
39 #include "fDiagMatrix.h"
1352
19c10b8657d5 [project @ 1995-09-05 08:11:57 by jwe]
jwe
parents: 1343
diff changeset
40 #include "dMatrix.h"
8958
6ccc12cc65ef implement raising a permutation matrix to integer power
Jaroslav Hajek <highegg@gmail.com>
parents: 8920
diff changeset
41 #include "PermMatrix.h"
3585
d9803711e047 [project @ 2000-02-08 04:35:39 by jwe]
jwe
parents: 3178
diff changeset
42 #include "mx-cm-cdm.h"
1651
e846e361a265 [project @ 1995-12-20 06:59:12 by jwe]
jwe
parents: 1580
diff changeset
43 #include "oct-cmplx.h"
9103
10bed8fbec99 optimize scalar .^ range operation
Jaroslav Hajek <highegg@gmail.com>
parents: 8979
diff changeset
44 #include "Range.h"
4153
6b96ce9f5743 [project @ 2002-11-06 20:38:49 by jwe]
jwe
parents: 4055
diff changeset
45 #include "quit.h"
1352
19c10b8657d5 [project @ 1995-09-05 08:11:57 by jwe]
jwe
parents: 1343
diff changeset
46
19c10b8657d5 [project @ 1995-09-05 08:11:57 by jwe]
jwe
parents: 1343
diff changeset
47 #include "error.h"
4055
7690958e7726 [project @ 2002-08-18 01:56:58 by jwe]
jwe
parents: 3585
diff changeset
48 #include "oct-obj.h"
1567
1da33230f424 [project @ 1995-10-18 00:47:12 by jwe]
jwe
parents: 1358
diff changeset
49 #include "utils.h"
1352
19c10b8657d5 [project @ 1995-09-05 08:11:57 by jwe]
jwe
parents: 1343
diff changeset
50 #include "xpow.h"
1
78fd87e624cb [project @ 1993-08-08 01:13:40 by jwe]
jwe
parents:
diff changeset
51
5275
23b37da9fd5b [project @ 2005-04-08 16:07:35 by jwe]
jwe
parents: 5260
diff changeset
52 #ifdef _OPENMP
23b37da9fd5b [project @ 2005-04-08 16:07:35 by jwe]
jwe
parents: 5260
diff changeset
53 #include <omp.h>
23b37da9fd5b [project @ 2005-04-08 16:07:35 by jwe]
jwe
parents: 5260
diff changeset
54 #endif
23b37da9fd5b [project @ 2005-04-08 16:07:35 by jwe]
jwe
parents: 5260
diff changeset
55
1567
1da33230f424 [project @ 1995-10-18 00:47:12 by jwe]
jwe
parents: 1358
diff changeset
56 static inline int
1da33230f424 [project @ 1995-10-18 00:47:12 by jwe]
jwe
parents: 1358
diff changeset
57 xisint (double x)
1da33230f424 [project @ 1995-10-18 00:47:12 by jwe]
jwe
parents: 1358
diff changeset
58 {
1da33230f424 [project @ 1995-10-18 00:47:12 by jwe]
jwe
parents: 1358
diff changeset
59 return (D_NINT (x) == x
1da33230f424 [project @ 1995-10-18 00:47:12 by jwe]
jwe
parents: 1358
diff changeset
60 && ((x >= 0 && x < INT_MAX)
1da33230f424 [project @ 1995-10-18 00:47:12 by jwe]
jwe
parents: 1358
diff changeset
61 || (x <= 0 && x > INT_MIN)));
1da33230f424 [project @ 1995-10-18 00:47:12 by jwe]
jwe
parents: 1358
diff changeset
62 }
1da33230f424 [project @ 1995-10-18 00:47:12 by jwe]
jwe
parents: 1358
diff changeset
63
767
42731861ee09 [project @ 1994-10-05 21:26:54 by jwe]
jwe
parents: 453
diff changeset
64 // Safer pow functions.
42731861ee09 [project @ 1994-10-05 21:26:54 by jwe]
jwe
parents: 453
diff changeset
65 //
42731861ee09 [project @ 1994-10-05 21:26:54 by jwe]
jwe
parents: 453
diff changeset
66 // op2 \ op1: s m cs cm
42731861ee09 [project @ 1994-10-05 21:26:54 by jwe]
jwe
parents: 453
diff changeset
67 // +-- +---+---+----+----+
42731861ee09 [project @ 1994-10-05 21:26:54 by jwe]
jwe
parents: 453
diff changeset
68 // scalar | | 1 | 5 | 7 | 11 |
42731861ee09 [project @ 1994-10-05 21:26:54 by jwe]
jwe
parents: 453
diff changeset
69 // +---+---+----+----+
2365
7c60f8a6e6a0 [project @ 1996-10-11 23:03:52 by jwe]
jwe
parents: 2305
diff changeset
70 // matrix | 2 | * | 8 | * |
767
42731861ee09 [project @ 1994-10-05 21:26:54 by jwe]
jwe
parents: 453
diff changeset
71 // +---+---+----+----+
42731861ee09 [project @ 1994-10-05 21:26:54 by jwe]
jwe
parents: 453
diff changeset
72 // complex_scalar | 3 | 6 | 9 | 12 |
42731861ee09 [project @ 1994-10-05 21:26:54 by jwe]
jwe
parents: 453
diff changeset
73 // +---+---+----+----+
2365
7c60f8a6e6a0 [project @ 1996-10-11 23:03:52 by jwe]
jwe
parents: 2305
diff changeset
74 // complex_matrix | 4 | * | 10 | * |
767
42731861ee09 [project @ 1994-10-05 21:26:54 by jwe]
jwe
parents: 453
diff changeset
75 // +---+---+----+----+
1
78fd87e624cb [project @ 1993-08-08 01:13:40 by jwe]
jwe
parents:
diff changeset
76
767
42731861ee09 [project @ 1994-10-05 21:26:54 by jwe]
jwe
parents: 453
diff changeset
77 // -*- 1 -*-
2086
bfb775fb6fe8 [project @ 1996-04-25 05:55:19 by jwe]
jwe
parents: 1996
diff changeset
78 octave_value
1
78fd87e624cb [project @ 1993-08-08 01:13:40 by jwe]
jwe
parents:
diff changeset
79 xpow (double a, double b)
78fd87e624cb [project @ 1993-08-08 01:13:40 by jwe]
jwe
parents:
diff changeset
80 {
7543
b84c5cbc0812 print.m: handle gif and jpg devices
John W. Eaton <jwe@octave.org>
parents: 7017
diff changeset
81 double retval;
b84c5cbc0812 print.m: handle gif and jpg devices
John W. Eaton <jwe@octave.org>
parents: 7017
diff changeset
82
8978
0a58c4cd1405 optimize element-wise power
Jaroslav Hajek <highegg@gmail.com>
parents: 8960
diff changeset
83 if (a < 0.0 && ! xisint (b))
1
78fd87e624cb [project @ 1993-08-08 01:13:40 by jwe]
jwe
parents:
diff changeset
84 {
5260
deed800e7bef [project @ 2005-03-30 23:18:58 by jwe]
jwe
parents: 4790
diff changeset
85 Complex atmp (a);
4682
994f449a1eba [project @ 2003-12-19 15:37:14 by jwe]
jwe
parents: 4669
diff changeset
86
5260
deed800e7bef [project @ 2005-03-30 23:18:58 by jwe]
jwe
parents: 4790
diff changeset
87 return std::pow (atmp, b);
1
78fd87e624cb [project @ 1993-08-08 01:13:40 by jwe]
jwe
parents:
diff changeset
88 }
78fd87e624cb [project @ 1993-08-08 01:13:40 by jwe]
jwe
parents:
diff changeset
89 else
7543
b84c5cbc0812 print.m: handle gif and jpg devices
John W. Eaton <jwe@octave.org>
parents: 7017
diff changeset
90 retval = std::pow (a, b);
b84c5cbc0812 print.m: handle gif and jpg devices
John W. Eaton <jwe@octave.org>
parents: 7017
diff changeset
91
b84c5cbc0812 print.m: handle gif and jpg devices
John W. Eaton <jwe@octave.org>
parents: 7017
diff changeset
92 return retval;
1
78fd87e624cb [project @ 1993-08-08 01:13:40 by jwe]
jwe
parents:
diff changeset
93 }
78fd87e624cb [project @ 1993-08-08 01:13:40 by jwe]
jwe
parents:
diff changeset
94
767
42731861ee09 [project @ 1994-10-05 21:26:54 by jwe]
jwe
parents: 453
diff changeset
95 // -*- 2 -*-
2086
bfb775fb6fe8 [project @ 1996-04-25 05:55:19 by jwe]
jwe
parents: 1996
diff changeset
96 octave_value
164
e2c950dd96d2 [project @ 1993-10-18 19:32:00 by jwe]
jwe
parents: 1
diff changeset
97 xpow (double a, const Matrix& b)
1
78fd87e624cb [project @ 1993-08-08 01:13:40 by jwe]
jwe
parents:
diff changeset
98 {
2086
bfb775fb6fe8 [project @ 1996-04-25 05:55:19 by jwe]
jwe
parents: 1996
diff changeset
99 octave_value retval;
1
78fd87e624cb [project @ 1993-08-08 01:13:40 by jwe]
jwe
parents:
diff changeset
100
5275
23b37da9fd5b [project @ 2005-04-08 16:07:35 by jwe]
jwe
parents: 5260
diff changeset
101 octave_idx_type nr = b.rows ();
23b37da9fd5b [project @ 2005-04-08 16:07:35 by jwe]
jwe
parents: 5260
diff changeset
102 octave_idx_type nc = b.cols ();
1
78fd87e624cb [project @ 1993-08-08 01:13:40 by jwe]
jwe
parents:
diff changeset
103
78fd87e624cb [project @ 1993-08-08 01:13:40 by jwe]
jwe
parents:
diff changeset
104 if (nr == 0 || nc == 0 || nr != nc)
78fd87e624cb [project @ 1993-08-08 01:13:40 by jwe]
jwe
parents:
diff changeset
105 error ("for x^A, A must be square");
78fd87e624cb [project @ 1993-08-08 01:13:40 by jwe]
jwe
parents:
diff changeset
106 else
78fd87e624cb [project @ 1993-08-08 01:13:40 by jwe]
jwe
parents:
diff changeset
107 {
78fd87e624cb [project @ 1993-08-08 01:13:40 by jwe]
jwe
parents:
diff changeset
108 EIG b_eig (b);
78fd87e624cb [project @ 1993-08-08 01:13:40 by jwe]
jwe
parents:
diff changeset
109
7578
91f8446ce4ae handle possible error from EIG
John W. Eaton <jwe@octave.org>
parents: 7543
diff changeset
110 if (! error_state)
1
78fd87e624cb [project @ 1993-08-08 01:13:40 by jwe]
jwe
parents:
diff changeset
111 {
7578
91f8446ce4ae handle possible error from EIG
John W. Eaton <jwe@octave.org>
parents: 7543
diff changeset
112 ComplexColumnVector lambda (b_eig.eigenvalues ());
91f8446ce4ae handle possible error from EIG
John W. Eaton <jwe@octave.org>
parents: 7543
diff changeset
113 ComplexMatrix Q (b_eig.eigenvectors ());
91f8446ce4ae handle possible error from EIG
John W. Eaton <jwe@octave.org>
parents: 7543
diff changeset
114
91f8446ce4ae handle possible error from EIG
John W. Eaton <jwe@octave.org>
parents: 7543
diff changeset
115 for (octave_idx_type i = 0; i < nr; i++)
91f8446ce4ae handle possible error from EIG
John W. Eaton <jwe@octave.org>
parents: 7543
diff changeset
116 {
91f8446ce4ae handle possible error from EIG
John W. Eaton <jwe@octave.org>
parents: 7543
diff changeset
117 Complex elt = lambda(i);
91f8446ce4ae handle possible error from EIG
John W. Eaton <jwe@octave.org>
parents: 7543
diff changeset
118 if (std::imag (elt) == 0.0)
91f8446ce4ae handle possible error from EIG
John W. Eaton <jwe@octave.org>
parents: 7543
diff changeset
119 lambda(i) = std::pow (a, std::real (elt));
91f8446ce4ae handle possible error from EIG
John W. Eaton <jwe@octave.org>
parents: 7543
diff changeset
120 else
91f8446ce4ae handle possible error from EIG
John W. Eaton <jwe@octave.org>
parents: 7543
diff changeset
121 lambda(i) = std::pow (a, elt);
91f8446ce4ae handle possible error from EIG
John W. Eaton <jwe@octave.org>
parents: 7543
diff changeset
122 }
91f8446ce4ae handle possible error from EIG
John W. Eaton <jwe@octave.org>
parents: 7543
diff changeset
123 ComplexDiagMatrix D (lambda);
91f8446ce4ae handle possible error from EIG
John W. Eaton <jwe@octave.org>
parents: 7543
diff changeset
124
91f8446ce4ae handle possible error from EIG
John W. Eaton <jwe@octave.org>
parents: 7543
diff changeset
125 retval = ComplexMatrix (Q * D * Q.inverse ());
1
78fd87e624cb [project @ 1993-08-08 01:13:40 by jwe]
jwe
parents:
diff changeset
126 }
7578
91f8446ce4ae handle possible error from EIG
John W. Eaton <jwe@octave.org>
parents: 7543
diff changeset
127 else
91f8446ce4ae handle possible error from EIG
John W. Eaton <jwe@octave.org>
parents: 7543
diff changeset
128 error ("xpow: matrix diagonalization failed");
1
78fd87e624cb [project @ 1993-08-08 01:13:40 by jwe]
jwe
parents:
diff changeset
129 }
78fd87e624cb [project @ 1993-08-08 01:13:40 by jwe]
jwe
parents:
diff changeset
130
78fd87e624cb [project @ 1993-08-08 01:13:40 by jwe]
jwe
parents:
diff changeset
131 return retval;
78fd87e624cb [project @ 1993-08-08 01:13:40 by jwe]
jwe
parents:
diff changeset
132 }
78fd87e624cb [project @ 1993-08-08 01:13:40 by jwe]
jwe
parents:
diff changeset
133
767
42731861ee09 [project @ 1994-10-05 21:26:54 by jwe]
jwe
parents: 453
diff changeset
134 // -*- 3 -*-
2086
bfb775fb6fe8 [project @ 1996-04-25 05:55:19 by jwe]
jwe
parents: 1996
diff changeset
135 octave_value
164
e2c950dd96d2 [project @ 1993-10-18 19:32:00 by jwe]
jwe
parents: 1
diff changeset
136 xpow (double a, const Complex& b)
1
78fd87e624cb [project @ 1993-08-08 01:13:40 by jwe]
jwe
parents:
diff changeset
137 {
78fd87e624cb [project @ 1993-08-08 01:13:40 by jwe]
jwe
parents:
diff changeset
138 Complex result;
78fd87e624cb [project @ 1993-08-08 01:13:40 by jwe]
jwe
parents:
diff changeset
139 Complex atmp (a);
5260
deed800e7bef [project @ 2005-03-30 23:18:58 by jwe]
jwe
parents: 4790
diff changeset
140 result = std::pow (atmp, b);
1567
1da33230f424 [project @ 1995-10-18 00:47:12 by jwe]
jwe
parents: 1358
diff changeset
141 return result;
1
78fd87e624cb [project @ 1993-08-08 01:13:40 by jwe]
jwe
parents:
diff changeset
142 }
78fd87e624cb [project @ 1993-08-08 01:13:40 by jwe]
jwe
parents:
diff changeset
143
767
42731861ee09 [project @ 1994-10-05 21:26:54 by jwe]
jwe
parents: 453
diff changeset
144 // -*- 4 -*-
2086
bfb775fb6fe8 [project @ 1996-04-25 05:55:19 by jwe]
jwe
parents: 1996
diff changeset
145 octave_value
164
e2c950dd96d2 [project @ 1993-10-18 19:32:00 by jwe]
jwe
parents: 1
diff changeset
146 xpow (double a, const ComplexMatrix& b)
1
78fd87e624cb [project @ 1993-08-08 01:13:40 by jwe]
jwe
parents:
diff changeset
147 {
2086
bfb775fb6fe8 [project @ 1996-04-25 05:55:19 by jwe]
jwe
parents: 1996
diff changeset
148 octave_value retval;
1
78fd87e624cb [project @ 1993-08-08 01:13:40 by jwe]
jwe
parents:
diff changeset
149
5275
23b37da9fd5b [project @ 2005-04-08 16:07:35 by jwe]
jwe
parents: 5260
diff changeset
150 octave_idx_type nr = b.rows ();
23b37da9fd5b [project @ 2005-04-08 16:07:35 by jwe]
jwe
parents: 5260
diff changeset
151 octave_idx_type nc = b.cols ();
1
78fd87e624cb [project @ 1993-08-08 01:13:40 by jwe]
jwe
parents:
diff changeset
152
78fd87e624cb [project @ 1993-08-08 01:13:40 by jwe]
jwe
parents:
diff changeset
153 if (nr == 0 || nc == 0 || nr != nc)
2365
7c60f8a6e6a0 [project @ 1996-10-11 23:03:52 by jwe]
jwe
parents: 2305
diff changeset
154 error ("for x^A, A must be square");
1
78fd87e624cb [project @ 1993-08-08 01:13:40 by jwe]
jwe
parents:
diff changeset
155 else
78fd87e624cb [project @ 1993-08-08 01:13:40 by jwe]
jwe
parents:
diff changeset
156 {
78fd87e624cb [project @ 1993-08-08 01:13:40 by jwe]
jwe
parents:
diff changeset
157 EIG b_eig (b);
78fd87e624cb [project @ 1993-08-08 01:13:40 by jwe]
jwe
parents:
diff changeset
158
7578
91f8446ce4ae handle possible error from EIG
John W. Eaton <jwe@octave.org>
parents: 7543
diff changeset
159 if (! error_state)
1
78fd87e624cb [project @ 1993-08-08 01:13:40 by jwe]
jwe
parents:
diff changeset
160 {
7578
91f8446ce4ae handle possible error from EIG
John W. Eaton <jwe@octave.org>
parents: 7543
diff changeset
161 ComplexColumnVector lambda (b_eig.eigenvalues ());
91f8446ce4ae handle possible error from EIG
John W. Eaton <jwe@octave.org>
parents: 7543
diff changeset
162 ComplexMatrix Q (b_eig.eigenvectors ());
91f8446ce4ae handle possible error from EIG
John W. Eaton <jwe@octave.org>
parents: 7543
diff changeset
163
91f8446ce4ae handle possible error from EIG
John W. Eaton <jwe@octave.org>
parents: 7543
diff changeset
164 for (octave_idx_type i = 0; i < nr; i++)
91f8446ce4ae handle possible error from EIG
John W. Eaton <jwe@octave.org>
parents: 7543
diff changeset
165 {
91f8446ce4ae handle possible error from EIG
John W. Eaton <jwe@octave.org>
parents: 7543
diff changeset
166 Complex elt = lambda(i);
91f8446ce4ae handle possible error from EIG
John W. Eaton <jwe@octave.org>
parents: 7543
diff changeset
167 if (std::imag (elt) == 0.0)
91f8446ce4ae handle possible error from EIG
John W. Eaton <jwe@octave.org>
parents: 7543
diff changeset
168 lambda(i) = std::pow (a, std::real (elt));
91f8446ce4ae handle possible error from EIG
John W. Eaton <jwe@octave.org>
parents: 7543
diff changeset
169 else
91f8446ce4ae handle possible error from EIG
John W. Eaton <jwe@octave.org>
parents: 7543
diff changeset
170 lambda(i) = std::pow (a, elt);
91f8446ce4ae handle possible error from EIG
John W. Eaton <jwe@octave.org>
parents: 7543
diff changeset
171 }
91f8446ce4ae handle possible error from EIG
John W. Eaton <jwe@octave.org>
parents: 7543
diff changeset
172 ComplexDiagMatrix D (lambda);
91f8446ce4ae handle possible error from EIG
John W. Eaton <jwe@octave.org>
parents: 7543
diff changeset
173
91f8446ce4ae handle possible error from EIG
John W. Eaton <jwe@octave.org>
parents: 7543
diff changeset
174 retval = ComplexMatrix (Q * D * Q.inverse ());
1
78fd87e624cb [project @ 1993-08-08 01:13:40 by jwe]
jwe
parents:
diff changeset
175 }
7578
91f8446ce4ae handle possible error from EIG
John W. Eaton <jwe@octave.org>
parents: 7543
diff changeset
176 else
91f8446ce4ae handle possible error from EIG
John W. Eaton <jwe@octave.org>
parents: 7543
diff changeset
177 error ("xpow: matrix diagonalization failed");
1
78fd87e624cb [project @ 1993-08-08 01:13:40 by jwe]
jwe
parents:
diff changeset
178 }
78fd87e624cb [project @ 1993-08-08 01:13:40 by jwe]
jwe
parents:
diff changeset
179
78fd87e624cb [project @ 1993-08-08 01:13:40 by jwe]
jwe
parents:
diff changeset
180 return retval;
78fd87e624cb [project @ 1993-08-08 01:13:40 by jwe]
jwe
parents:
diff changeset
181 }
78fd87e624cb [project @ 1993-08-08 01:13:40 by jwe]
jwe
parents:
diff changeset
182
767
42731861ee09 [project @ 1994-10-05 21:26:54 by jwe]
jwe
parents: 453
diff changeset
183 // -*- 5 -*-
2086
bfb775fb6fe8 [project @ 1996-04-25 05:55:19 by jwe]
jwe
parents: 1996
diff changeset
184 octave_value
164
e2c950dd96d2 [project @ 1993-10-18 19:32:00 by jwe]
jwe
parents: 1
diff changeset
185 xpow (const Matrix& a, double b)
1
78fd87e624cb [project @ 1993-08-08 01:13:40 by jwe]
jwe
parents:
diff changeset
186 {
2086
bfb775fb6fe8 [project @ 1996-04-25 05:55:19 by jwe]
jwe
parents: 1996
diff changeset
187 octave_value retval;
1
78fd87e624cb [project @ 1993-08-08 01:13:40 by jwe]
jwe
parents:
diff changeset
188
5275
23b37da9fd5b [project @ 2005-04-08 16:07:35 by jwe]
jwe
parents: 5260
diff changeset
189 octave_idx_type nr = a.rows ();
23b37da9fd5b [project @ 2005-04-08 16:07:35 by jwe]
jwe
parents: 5260
diff changeset
190 octave_idx_type nc = a.cols ();
1
78fd87e624cb [project @ 1993-08-08 01:13:40 by jwe]
jwe
parents:
diff changeset
191
78fd87e624cb [project @ 1993-08-08 01:13:40 by jwe]
jwe
parents:
diff changeset
192 if (nr == 0 || nc == 0 || nr != nc)
2365
7c60f8a6e6a0 [project @ 1996-10-11 23:03:52 by jwe]
jwe
parents: 2305
diff changeset
193 error ("for A^b, A must be square");
1567
1da33230f424 [project @ 1995-10-18 00:47:12 by jwe]
jwe
parents: 1358
diff changeset
194 else
1
78fd87e624cb [project @ 1993-08-08 01:13:40 by jwe]
jwe
parents:
diff changeset
195 {
2800
9aeba8e006a4 [project @ 1997-03-09 09:50:20 by jwe]
jwe
parents: 2365
diff changeset
196 if (static_cast<int> (b) == b)
1
78fd87e624cb [project @ 1993-08-08 01:13:40 by jwe]
jwe
parents:
diff changeset
197 {
2804
eedc2f3f61f7 [project @ 1997-03-11 04:34:50 by jwe]
jwe
parents: 2800
diff changeset
198 int btmp = static_cast<int> (b);
1567
1da33230f424 [project @ 1995-10-18 00:47:12 by jwe]
jwe
parents: 1358
diff changeset
199 if (btmp == 0)
1da33230f424 [project @ 1995-10-18 00:47:12 by jwe]
jwe
parents: 1358
diff changeset
200 {
1da33230f424 [project @ 1995-10-18 00:47:12 by jwe]
jwe
parents: 1358
diff changeset
201 retval = DiagMatrix (nr, nr, 1.0);
1da33230f424 [project @ 1995-10-18 00:47:12 by jwe]
jwe
parents: 1358
diff changeset
202 }
1da33230f424 [project @ 1995-10-18 00:47:12 by jwe]
jwe
parents: 1358
diff changeset
203 else
1da33230f424 [project @ 1995-10-18 00:47:12 by jwe]
jwe
parents: 1358
diff changeset
204 {
1da33230f424 [project @ 1995-10-18 00:47:12 by jwe]
jwe
parents: 1358
diff changeset
205 // Too much copying?
5775
ace8d8d26933 [project @ 2006-04-24 19:13:06 by jwe]
jwe
parents: 5667
diff changeset
206 // FIXME -- we shouldn't do this if the exponent is
1567
1da33230f424 [project @ 1995-10-18 00:47:12 by jwe]
jwe
parents: 1358
diff changeset
207 // large...
1da33230f424 [project @ 1995-10-18 00:47:12 by jwe]
jwe
parents: 1358
diff changeset
208
1da33230f424 [project @ 1995-10-18 00:47:12 by jwe]
jwe
parents: 1358
diff changeset
209 Matrix atmp;
1da33230f424 [project @ 1995-10-18 00:47:12 by jwe]
jwe
parents: 1358
diff changeset
210 if (btmp < 0)
1da33230f424 [project @ 1995-10-18 00:47:12 by jwe]
jwe
parents: 1358
diff changeset
211 {
1da33230f424 [project @ 1995-10-18 00:47:12 by jwe]
jwe
parents: 1358
diff changeset
212 btmp = -btmp;
1655
593fff2e7e39 [project @ 1995-12-20 10:50:16 by jwe]
jwe
parents: 1651
diff changeset
213
5275
23b37da9fd5b [project @ 2005-04-08 16:07:35 by jwe]
jwe
parents: 5260
diff changeset
214 octave_idx_type info;
1655
593fff2e7e39 [project @ 1995-12-20 10:50:16 by jwe]
jwe
parents: 1651
diff changeset
215 double rcond = 0.0;
6207
3c92b8d892dd [project @ 2006-12-06 20:19:14 by dbateman]
dbateman
parents: 5775
diff changeset
216 MatrixType mattype (a);
1655
593fff2e7e39 [project @ 1995-12-20 10:50:16 by jwe]
jwe
parents: 1651
diff changeset
217
6207
3c92b8d892dd [project @ 2006-12-06 20:19:14 by dbateman]
dbateman
parents: 5775
diff changeset
218 atmp = a.inverse (mattype, info, rcond, 1);
1655
593fff2e7e39 [project @ 1995-12-20 10:50:16 by jwe]
jwe
parents: 1651
diff changeset
219
593fff2e7e39 [project @ 1995-12-20 10:50:16 by jwe]
jwe
parents: 1651
diff changeset
220 if (info == -1)
593fff2e7e39 [project @ 1995-12-20 10:50:16 by jwe]
jwe
parents: 1651
diff changeset
221 warning ("inverse: matrix singular to machine\
593fff2e7e39 [project @ 1995-12-20 10:50:16 by jwe]
jwe
parents: 1651
diff changeset
222 precision, rcond = %g", rcond);
1567
1da33230f424 [project @ 1995-10-18 00:47:12 by jwe]
jwe
parents: 1358
diff changeset
223 }
1da33230f424 [project @ 1995-10-18 00:47:12 by jwe]
jwe
parents: 1358
diff changeset
224 else
1da33230f424 [project @ 1995-10-18 00:47:12 by jwe]
jwe
parents: 1358
diff changeset
225 atmp = a;
1da33230f424 [project @ 1995-10-18 00:47:12 by jwe]
jwe
parents: 1358
diff changeset
226
1da33230f424 [project @ 1995-10-18 00:47:12 by jwe]
jwe
parents: 1358
diff changeset
227 Matrix result (atmp);
3178
09a3064a3a17 [project @ 1998-06-23 03:46:42 by jwe]
jwe
parents: 3162
diff changeset
228
09a3064a3a17 [project @ 1998-06-23 03:46:42 by jwe]
jwe
parents: 3162
diff changeset
229 btmp--;
09a3064a3a17 [project @ 1998-06-23 03:46:42 by jwe]
jwe
parents: 3162
diff changeset
230
09a3064a3a17 [project @ 1998-06-23 03:46:42 by jwe]
jwe
parents: 3162
diff changeset
231 while (btmp > 0)
09a3064a3a17 [project @ 1998-06-23 03:46:42 by jwe]
jwe
parents: 3162
diff changeset
232 {
09a3064a3a17 [project @ 1998-06-23 03:46:42 by jwe]
jwe
parents: 3162
diff changeset
233 if (btmp & 1)
09a3064a3a17 [project @ 1998-06-23 03:46:42 by jwe]
jwe
parents: 3162
diff changeset
234 result = result * atmp;
09a3064a3a17 [project @ 1998-06-23 03:46:42 by jwe]
jwe
parents: 3162
diff changeset
235
09a3064a3a17 [project @ 1998-06-23 03:46:42 by jwe]
jwe
parents: 3162
diff changeset
236 btmp >>= 1;
09a3064a3a17 [project @ 1998-06-23 03:46:42 by jwe]
jwe
parents: 3162
diff changeset
237
09a3064a3a17 [project @ 1998-06-23 03:46:42 by jwe]
jwe
parents: 3162
diff changeset
238 if (btmp > 0)
09a3064a3a17 [project @ 1998-06-23 03:46:42 by jwe]
jwe
parents: 3162
diff changeset
239 atmp = atmp * atmp;
09a3064a3a17 [project @ 1998-06-23 03:46:42 by jwe]
jwe
parents: 3162
diff changeset
240 }
1567
1da33230f424 [project @ 1995-10-18 00:47:12 by jwe]
jwe
parents: 1358
diff changeset
241
1da33230f424 [project @ 1995-10-18 00:47:12 by jwe]
jwe
parents: 1358
diff changeset
242 retval = result;
1da33230f424 [project @ 1995-10-18 00:47:12 by jwe]
jwe
parents: 1358
diff changeset
243 }
1
78fd87e624cb [project @ 1993-08-08 01:13:40 by jwe]
jwe
parents:
diff changeset
244 }
78fd87e624cb [project @ 1993-08-08 01:13:40 by jwe]
jwe
parents:
diff changeset
245 else
78fd87e624cb [project @ 1993-08-08 01:13:40 by jwe]
jwe
parents:
diff changeset
246 {
1567
1da33230f424 [project @ 1995-10-18 00:47:12 by jwe]
jwe
parents: 1358
diff changeset
247 EIG a_eig (a);
7578
91f8446ce4ae handle possible error from EIG
John W. Eaton <jwe@octave.org>
parents: 7543
diff changeset
248
91f8446ce4ae handle possible error from EIG
John W. Eaton <jwe@octave.org>
parents: 7543
diff changeset
249 if (! error_state)
91f8446ce4ae handle possible error from EIG
John W. Eaton <jwe@octave.org>
parents: 7543
diff changeset
250 {
91f8446ce4ae handle possible error from EIG
John W. Eaton <jwe@octave.org>
parents: 7543
diff changeset
251 ComplexColumnVector lambda (a_eig.eigenvalues ());
91f8446ce4ae handle possible error from EIG
John W. Eaton <jwe@octave.org>
parents: 7543
diff changeset
252 ComplexMatrix Q (a_eig.eigenvectors ());
1567
1da33230f424 [project @ 1995-10-18 00:47:12 by jwe]
jwe
parents: 1358
diff changeset
253
7578
91f8446ce4ae handle possible error from EIG
John W. Eaton <jwe@octave.org>
parents: 7543
diff changeset
254 for (octave_idx_type i = 0; i < nr; i++)
91f8446ce4ae handle possible error from EIG
John W. Eaton <jwe@octave.org>
parents: 7543
diff changeset
255 lambda(i) = std::pow (lambda(i), b);
91f8446ce4ae handle possible error from EIG
John W. Eaton <jwe@octave.org>
parents: 7543
diff changeset
256
91f8446ce4ae handle possible error from EIG
John W. Eaton <jwe@octave.org>
parents: 7543
diff changeset
257 ComplexDiagMatrix D (lambda);
1567
1da33230f424 [project @ 1995-10-18 00:47:12 by jwe]
jwe
parents: 1358
diff changeset
258
7578
91f8446ce4ae handle possible error from EIG
John W. Eaton <jwe@octave.org>
parents: 7543
diff changeset
259 retval = ComplexMatrix (Q * D * Q.inverse ());
91f8446ce4ae handle possible error from EIG
John W. Eaton <jwe@octave.org>
parents: 7543
diff changeset
260 }
91f8446ce4ae handle possible error from EIG
John W. Eaton <jwe@octave.org>
parents: 7543
diff changeset
261 else
91f8446ce4ae handle possible error from EIG
John W. Eaton <jwe@octave.org>
parents: 7543
diff changeset
262 error ("xpow: matrix diagonalization failed");
1567
1da33230f424 [project @ 1995-10-18 00:47:12 by jwe]
jwe
parents: 1358
diff changeset
263 }
1da33230f424 [project @ 1995-10-18 00:47:12 by jwe]
jwe
parents: 1358
diff changeset
264 }
1358
dc9c01f66a19 [project @ 1995-09-05 21:10:01 by jwe]
jwe
parents: 1352
diff changeset
265
1567
1da33230f424 [project @ 1995-10-18 00:47:12 by jwe]
jwe
parents: 1358
diff changeset
266 return retval;
1da33230f424 [project @ 1995-10-18 00:47:12 by jwe]
jwe
parents: 1358
diff changeset
267 }
1
78fd87e624cb [project @ 1993-08-08 01:13:40 by jwe]
jwe
parents:
diff changeset
268
8382
9b20a4847056 implement scalar powers of diag matrices
Jaroslav Hajek <highegg@gmail.com>
parents: 7789
diff changeset
269 // -*- 5d -*-
9b20a4847056 implement scalar powers of diag matrices
Jaroslav Hajek <highegg@gmail.com>
parents: 7789
diff changeset
270 octave_value
9b20a4847056 implement scalar powers of diag matrices
Jaroslav Hajek <highegg@gmail.com>
parents: 7789
diff changeset
271 xpow (const DiagMatrix& a, double b)
9b20a4847056 implement scalar powers of diag matrices
Jaroslav Hajek <highegg@gmail.com>
parents: 7789
diff changeset
272 {
9b20a4847056 implement scalar powers of diag matrices
Jaroslav Hajek <highegg@gmail.com>
parents: 7789
diff changeset
273 octave_value retval;
9b20a4847056 implement scalar powers of diag matrices
Jaroslav Hajek <highegg@gmail.com>
parents: 7789
diff changeset
274
9b20a4847056 implement scalar powers of diag matrices
Jaroslav Hajek <highegg@gmail.com>
parents: 7789
diff changeset
275 octave_idx_type nr = a.rows ();
9b20a4847056 implement scalar powers of diag matrices
Jaroslav Hajek <highegg@gmail.com>
parents: 7789
diff changeset
276 octave_idx_type nc = a.cols ();
9b20a4847056 implement scalar powers of diag matrices
Jaroslav Hajek <highegg@gmail.com>
parents: 7789
diff changeset
277
9b20a4847056 implement scalar powers of diag matrices
Jaroslav Hajek <highegg@gmail.com>
parents: 7789
diff changeset
278 if (nr == 0 || nc == 0 || nr != nc)
9b20a4847056 implement scalar powers of diag matrices
Jaroslav Hajek <highegg@gmail.com>
parents: 7789
diff changeset
279 error ("for A^b, A must be square");
9b20a4847056 implement scalar powers of diag matrices
Jaroslav Hajek <highegg@gmail.com>
parents: 7789
diff changeset
280 else
9b20a4847056 implement scalar powers of diag matrices
Jaroslav Hajek <highegg@gmail.com>
parents: 7789
diff changeset
281 {
9b20a4847056 implement scalar powers of diag matrices
Jaroslav Hajek <highegg@gmail.com>
parents: 7789
diff changeset
282 if (static_cast<int> (b) == b)
9b20a4847056 implement scalar powers of diag matrices
Jaroslav Hajek <highegg@gmail.com>
parents: 7789
diff changeset
283 {
9b20a4847056 implement scalar powers of diag matrices
Jaroslav Hajek <highegg@gmail.com>
parents: 7789
diff changeset
284 DiagMatrix r (nr, nc);
9b20a4847056 implement scalar powers of diag matrices
Jaroslav Hajek <highegg@gmail.com>
parents: 7789
diff changeset
285 for (octave_idx_type i = 0; i < nc; i++)
9b20a4847056 implement scalar powers of diag matrices
Jaroslav Hajek <highegg@gmail.com>
parents: 7789
diff changeset
286 r(i, i) = std::pow (a(i, i), b);
9b20a4847056 implement scalar powers of diag matrices
Jaroslav Hajek <highegg@gmail.com>
parents: 7789
diff changeset
287 retval = r;
9b20a4847056 implement scalar powers of diag matrices
Jaroslav Hajek <highegg@gmail.com>
parents: 7789
diff changeset
288 }
9b20a4847056 implement scalar powers of diag matrices
Jaroslav Hajek <highegg@gmail.com>
parents: 7789
diff changeset
289 else
9b20a4847056 implement scalar powers of diag matrices
Jaroslav Hajek <highegg@gmail.com>
parents: 7789
diff changeset
290 {
9b20a4847056 implement scalar powers of diag matrices
Jaroslav Hajek <highegg@gmail.com>
parents: 7789
diff changeset
291 ComplexDiagMatrix r (nr, nc);
9b20a4847056 implement scalar powers of diag matrices
Jaroslav Hajek <highegg@gmail.com>
parents: 7789
diff changeset
292 for (octave_idx_type i = 0; i < nc; i++)
9b20a4847056 implement scalar powers of diag matrices
Jaroslav Hajek <highegg@gmail.com>
parents: 7789
diff changeset
293 r(i, i) = std::pow (static_cast<Complex> (a(i, i)), b);
9b20a4847056 implement scalar powers of diag matrices
Jaroslav Hajek <highegg@gmail.com>
parents: 7789
diff changeset
294 retval = r;
9b20a4847056 implement scalar powers of diag matrices
Jaroslav Hajek <highegg@gmail.com>
parents: 7789
diff changeset
295 }
9b20a4847056 implement scalar powers of diag matrices
Jaroslav Hajek <highegg@gmail.com>
parents: 7789
diff changeset
296 }
9b20a4847056 implement scalar powers of diag matrices
Jaroslav Hajek <highegg@gmail.com>
parents: 7789
diff changeset
297
9b20a4847056 implement scalar powers of diag matrices
Jaroslav Hajek <highegg@gmail.com>
parents: 7789
diff changeset
298 return retval;
9b20a4847056 implement scalar powers of diag matrices
Jaroslav Hajek <highegg@gmail.com>
parents: 7789
diff changeset
299 }
9b20a4847056 implement scalar powers of diag matrices
Jaroslav Hajek <highegg@gmail.com>
parents: 7789
diff changeset
300
8958
6ccc12cc65ef implement raising a permutation matrix to integer power
Jaroslav Hajek <highegg@gmail.com>
parents: 8920
diff changeset
301 // -*- 5p -*-
6ccc12cc65ef implement raising a permutation matrix to integer power
Jaroslav Hajek <highegg@gmail.com>
parents: 8920
diff changeset
302 octave_value
6ccc12cc65ef implement raising a permutation matrix to integer power
Jaroslav Hajek <highegg@gmail.com>
parents: 8920
diff changeset
303 xpow (const PermMatrix& a, double b)
6ccc12cc65ef implement raising a permutation matrix to integer power
Jaroslav Hajek <highegg@gmail.com>
parents: 8920
diff changeset
304 {
6ccc12cc65ef implement raising a permutation matrix to integer power
Jaroslav Hajek <highegg@gmail.com>
parents: 8920
diff changeset
305 octave_value retval;
6ccc12cc65ef implement raising a permutation matrix to integer power
Jaroslav Hajek <highegg@gmail.com>
parents: 8920
diff changeset
306 int btmp = static_cast<int> (b);
6ccc12cc65ef implement raising a permutation matrix to integer power
Jaroslav Hajek <highegg@gmail.com>
parents: 8920
diff changeset
307 if (btmp == b)
6ccc12cc65ef implement raising a permutation matrix to integer power
Jaroslav Hajek <highegg@gmail.com>
parents: 8920
diff changeset
308 return a.power (btmp);
6ccc12cc65ef implement raising a permutation matrix to integer power
Jaroslav Hajek <highegg@gmail.com>
parents: 8920
diff changeset
309 else
6ccc12cc65ef implement raising a permutation matrix to integer power
Jaroslav Hajek <highegg@gmail.com>
parents: 8920
diff changeset
310 return xpow (Matrix (a), b);
6ccc12cc65ef implement raising a permutation matrix to integer power
Jaroslav Hajek <highegg@gmail.com>
parents: 8920
diff changeset
311 }
6ccc12cc65ef implement raising a permutation matrix to integer power
Jaroslav Hajek <highegg@gmail.com>
parents: 8920
diff changeset
312
1567
1da33230f424 [project @ 1995-10-18 00:47:12 by jwe]
jwe
parents: 1358
diff changeset
313 // -*- 6 -*-
2086
bfb775fb6fe8 [project @ 1996-04-25 05:55:19 by jwe]
jwe
parents: 1996
diff changeset
314 octave_value
1567
1da33230f424 [project @ 1995-10-18 00:47:12 by jwe]
jwe
parents: 1358
diff changeset
315 xpow (const Matrix& a, const Complex& b)
1da33230f424 [project @ 1995-10-18 00:47:12 by jwe]
jwe
parents: 1358
diff changeset
316 {
2086
bfb775fb6fe8 [project @ 1996-04-25 05:55:19 by jwe]
jwe
parents: 1996
diff changeset
317 octave_value retval;
1
78fd87e624cb [project @ 1993-08-08 01:13:40 by jwe]
jwe
parents:
diff changeset
318
5275
23b37da9fd5b [project @ 2005-04-08 16:07:35 by jwe]
jwe
parents: 5260
diff changeset
319 octave_idx_type nr = a.rows ();
23b37da9fd5b [project @ 2005-04-08 16:07:35 by jwe]
jwe
parents: 5260
diff changeset
320 octave_idx_type nc = a.cols ();
1567
1da33230f424 [project @ 1995-10-18 00:47:12 by jwe]
jwe
parents: 1358
diff changeset
321
1da33230f424 [project @ 1995-10-18 00:47:12 by jwe]
jwe
parents: 1358
diff changeset
322 if (nr == 0 || nc == 0 || nr != nc)
2365
7c60f8a6e6a0 [project @ 1996-10-11 23:03:52 by jwe]
jwe
parents: 2305
diff changeset
323 error ("for A^b, A must be square");
1
78fd87e624cb [project @ 1993-08-08 01:13:40 by jwe]
jwe
parents:
diff changeset
324 else
78fd87e624cb [project @ 1993-08-08 01:13:40 by jwe]
jwe
parents:
diff changeset
325 {
78fd87e624cb [project @ 1993-08-08 01:13:40 by jwe]
jwe
parents:
diff changeset
326 EIG a_eig (a);
7578
91f8446ce4ae handle possible error from EIG
John W. Eaton <jwe@octave.org>
parents: 7543
diff changeset
327
91f8446ce4ae handle possible error from EIG
John W. Eaton <jwe@octave.org>
parents: 7543
diff changeset
328 if (! error_state)
91f8446ce4ae handle possible error from EIG
John W. Eaton <jwe@octave.org>
parents: 7543
diff changeset
329 {
91f8446ce4ae handle possible error from EIG
John W. Eaton <jwe@octave.org>
parents: 7543
diff changeset
330 ComplexColumnVector lambda (a_eig.eigenvalues ());
91f8446ce4ae handle possible error from EIG
John W. Eaton <jwe@octave.org>
parents: 7543
diff changeset
331 ComplexMatrix Q (a_eig.eigenvectors ());
1
78fd87e624cb [project @ 1993-08-08 01:13:40 by jwe]
jwe
parents:
diff changeset
332
7578
91f8446ce4ae handle possible error from EIG
John W. Eaton <jwe@octave.org>
parents: 7543
diff changeset
333 for (octave_idx_type i = 0; i < nr; i++)
91f8446ce4ae handle possible error from EIG
John W. Eaton <jwe@octave.org>
parents: 7543
diff changeset
334 lambda(i) = std::pow (lambda(i), b);
91f8446ce4ae handle possible error from EIG
John W. Eaton <jwe@octave.org>
parents: 7543
diff changeset
335
91f8446ce4ae handle possible error from EIG
John W. Eaton <jwe@octave.org>
parents: 7543
diff changeset
336 ComplexDiagMatrix D (lambda);
1
78fd87e624cb [project @ 1993-08-08 01:13:40 by jwe]
jwe
parents:
diff changeset
337
7578
91f8446ce4ae handle possible error from EIG
John W. Eaton <jwe@octave.org>
parents: 7543
diff changeset
338 retval = ComplexMatrix (Q * D * Q.inverse ());
91f8446ce4ae handle possible error from EIG
John W. Eaton <jwe@octave.org>
parents: 7543
diff changeset
339 }
91f8446ce4ae handle possible error from EIG
John W. Eaton <jwe@octave.org>
parents: 7543
diff changeset
340 else
91f8446ce4ae handle possible error from EIG
John W. Eaton <jwe@octave.org>
parents: 7543
diff changeset
341 error ("xpow: matrix diagonalization failed");
1
78fd87e624cb [project @ 1993-08-08 01:13:40 by jwe]
jwe
parents:
diff changeset
342 }
78fd87e624cb [project @ 1993-08-08 01:13:40 by jwe]
jwe
parents:
diff changeset
343
78fd87e624cb [project @ 1993-08-08 01:13:40 by jwe]
jwe
parents:
diff changeset
344 return retval;
78fd87e624cb [project @ 1993-08-08 01:13:40 by jwe]
jwe
parents:
diff changeset
345 }
78fd87e624cb [project @ 1993-08-08 01:13:40 by jwe]
jwe
parents:
diff changeset
346
767
42731861ee09 [project @ 1994-10-05 21:26:54 by jwe]
jwe
parents: 453
diff changeset
347 // -*- 7 -*-
2086
bfb775fb6fe8 [project @ 1996-04-25 05:55:19 by jwe]
jwe
parents: 1996
diff changeset
348 octave_value
164
e2c950dd96d2 [project @ 1993-10-18 19:32:00 by jwe]
jwe
parents: 1
diff changeset
349 xpow (const Complex& a, double b)
1
78fd87e624cb [project @ 1993-08-08 01:13:40 by jwe]
jwe
parents:
diff changeset
350 {
78fd87e624cb [project @ 1993-08-08 01:13:40 by jwe]
jwe
parents:
diff changeset
351 Complex result;
1567
1da33230f424 [project @ 1995-10-18 00:47:12 by jwe]
jwe
parents: 1358
diff changeset
352
1da33230f424 [project @ 1995-10-18 00:47:12 by jwe]
jwe
parents: 1358
diff changeset
353 if (xisint (b))
5260
deed800e7bef [project @ 2005-03-30 23:18:58 by jwe]
jwe
parents: 4790
diff changeset
354 result = std::pow (a, static_cast<int> (b));
1567
1da33230f424 [project @ 1995-10-18 00:47:12 by jwe]
jwe
parents: 1358
diff changeset
355 else
5260
deed800e7bef [project @ 2005-03-30 23:18:58 by jwe]
jwe
parents: 4790
diff changeset
356 result = std::pow (a, b);
1567
1da33230f424 [project @ 1995-10-18 00:47:12 by jwe]
jwe
parents: 1358
diff changeset
357
1da33230f424 [project @ 1995-10-18 00:47:12 by jwe]
jwe
parents: 1358
diff changeset
358 return result;
1
78fd87e624cb [project @ 1993-08-08 01:13:40 by jwe]
jwe
parents:
diff changeset
359 }
78fd87e624cb [project @ 1993-08-08 01:13:40 by jwe]
jwe
parents:
diff changeset
360
767
42731861ee09 [project @ 1994-10-05 21:26:54 by jwe]
jwe
parents: 453
diff changeset
361 // -*- 8 -*-
2086
bfb775fb6fe8 [project @ 1996-04-25 05:55:19 by jwe]
jwe
parents: 1996
diff changeset
362 octave_value
164
e2c950dd96d2 [project @ 1993-10-18 19:32:00 by jwe]
jwe
parents: 1
diff changeset
363 xpow (const Complex& a, const Matrix& b)
1
78fd87e624cb [project @ 1993-08-08 01:13:40 by jwe]
jwe
parents:
diff changeset
364 {
2086
bfb775fb6fe8 [project @ 1996-04-25 05:55:19 by jwe]
jwe
parents: 1996
diff changeset
365 octave_value retval;
1
78fd87e624cb [project @ 1993-08-08 01:13:40 by jwe]
jwe
parents:
diff changeset
366
5275
23b37da9fd5b [project @ 2005-04-08 16:07:35 by jwe]
jwe
parents: 5260
diff changeset
367 octave_idx_type nr = b.rows ();
23b37da9fd5b [project @ 2005-04-08 16:07:35 by jwe]
jwe
parents: 5260
diff changeset
368 octave_idx_type nc = b.cols ();
1
78fd87e624cb [project @ 1993-08-08 01:13:40 by jwe]
jwe
parents:
diff changeset
369
78fd87e624cb [project @ 1993-08-08 01:13:40 by jwe]
jwe
parents:
diff changeset
370 if (nr == 0 || nc == 0 || nr != nc)
2365
7c60f8a6e6a0 [project @ 1996-10-11 23:03:52 by jwe]
jwe
parents: 2305
diff changeset
371 error ("for x^A, A must be square");
1
78fd87e624cb [project @ 1993-08-08 01:13:40 by jwe]
jwe
parents:
diff changeset
372 else
78fd87e624cb [project @ 1993-08-08 01:13:40 by jwe]
jwe
parents:
diff changeset
373 {
78fd87e624cb [project @ 1993-08-08 01:13:40 by jwe]
jwe
parents:
diff changeset
374 EIG b_eig (b);
78fd87e624cb [project @ 1993-08-08 01:13:40 by jwe]
jwe
parents:
diff changeset
375
7578
91f8446ce4ae handle possible error from EIG
John W. Eaton <jwe@octave.org>
parents: 7543
diff changeset
376 if (! error_state)
1
78fd87e624cb [project @ 1993-08-08 01:13:40 by jwe]
jwe
parents:
diff changeset
377 {
7578
91f8446ce4ae handle possible error from EIG
John W. Eaton <jwe@octave.org>
parents: 7543
diff changeset
378 ComplexColumnVector lambda (b_eig.eigenvalues ());
91f8446ce4ae handle possible error from EIG
John W. Eaton <jwe@octave.org>
parents: 7543
diff changeset
379 ComplexMatrix Q (b_eig.eigenvectors ());
91f8446ce4ae handle possible error from EIG
John W. Eaton <jwe@octave.org>
parents: 7543
diff changeset
380
91f8446ce4ae handle possible error from EIG
John W. Eaton <jwe@octave.org>
parents: 7543
diff changeset
381 for (octave_idx_type i = 0; i < nr; i++)
91f8446ce4ae handle possible error from EIG
John W. Eaton <jwe@octave.org>
parents: 7543
diff changeset
382 {
91f8446ce4ae handle possible error from EIG
John W. Eaton <jwe@octave.org>
parents: 7543
diff changeset
383 Complex elt = lambda(i);
91f8446ce4ae handle possible error from EIG
John W. Eaton <jwe@octave.org>
parents: 7543
diff changeset
384 if (std::imag (elt) == 0.0)
91f8446ce4ae handle possible error from EIG
John W. Eaton <jwe@octave.org>
parents: 7543
diff changeset
385 lambda(i) = std::pow (a, std::real (elt));
91f8446ce4ae handle possible error from EIG
John W. Eaton <jwe@octave.org>
parents: 7543
diff changeset
386 else
91f8446ce4ae handle possible error from EIG
John W. Eaton <jwe@octave.org>
parents: 7543
diff changeset
387 lambda(i) = std::pow (a, elt);
91f8446ce4ae handle possible error from EIG
John W. Eaton <jwe@octave.org>
parents: 7543
diff changeset
388 }
91f8446ce4ae handle possible error from EIG
John W. Eaton <jwe@octave.org>
parents: 7543
diff changeset
389 ComplexDiagMatrix D (lambda);
91f8446ce4ae handle possible error from EIG
John W. Eaton <jwe@octave.org>
parents: 7543
diff changeset
390
91f8446ce4ae handle possible error from EIG
John W. Eaton <jwe@octave.org>
parents: 7543
diff changeset
391 retval = ComplexMatrix (Q * D * Q.inverse ());
1
78fd87e624cb [project @ 1993-08-08 01:13:40 by jwe]
jwe
parents:
diff changeset
392 }
7578
91f8446ce4ae handle possible error from EIG
John W. Eaton <jwe@octave.org>
parents: 7543
diff changeset
393 else
91f8446ce4ae handle possible error from EIG
John W. Eaton <jwe@octave.org>
parents: 7543
diff changeset
394 error ("xpow: matrix diagonalization failed");
1
78fd87e624cb [project @ 1993-08-08 01:13:40 by jwe]
jwe
parents:
diff changeset
395 }
78fd87e624cb [project @ 1993-08-08 01:13:40 by jwe]
jwe
parents:
diff changeset
396
78fd87e624cb [project @ 1993-08-08 01:13:40 by jwe]
jwe
parents:
diff changeset
397 return retval;
78fd87e624cb [project @ 1993-08-08 01:13:40 by jwe]
jwe
parents:
diff changeset
398 }
78fd87e624cb [project @ 1993-08-08 01:13:40 by jwe]
jwe
parents:
diff changeset
399
767
42731861ee09 [project @ 1994-10-05 21:26:54 by jwe]
jwe
parents: 453
diff changeset
400 // -*- 9 -*-
2086
bfb775fb6fe8 [project @ 1996-04-25 05:55:19 by jwe]
jwe
parents: 1996
diff changeset
401 octave_value
164
e2c950dd96d2 [project @ 1993-10-18 19:32:00 by jwe]
jwe
parents: 1
diff changeset
402 xpow (const Complex& a, const Complex& b)
1
78fd87e624cb [project @ 1993-08-08 01:13:40 by jwe]
jwe
parents:
diff changeset
403 {
78fd87e624cb [project @ 1993-08-08 01:13:40 by jwe]
jwe
parents:
diff changeset
404 Complex result;
5260
deed800e7bef [project @ 2005-03-30 23:18:58 by jwe]
jwe
parents: 4790
diff changeset
405 result = std::pow (a, b);
1567
1da33230f424 [project @ 1995-10-18 00:47:12 by jwe]
jwe
parents: 1358
diff changeset
406 return result;
1
78fd87e624cb [project @ 1993-08-08 01:13:40 by jwe]
jwe
parents:
diff changeset
407 }
78fd87e624cb [project @ 1993-08-08 01:13:40 by jwe]
jwe
parents:
diff changeset
408
767
42731861ee09 [project @ 1994-10-05 21:26:54 by jwe]
jwe
parents: 453
diff changeset
409 // -*- 10 -*-
2086
bfb775fb6fe8 [project @ 1996-04-25 05:55:19 by jwe]
jwe
parents: 1996
diff changeset
410 octave_value
164
e2c950dd96d2 [project @ 1993-10-18 19:32:00 by jwe]
jwe
parents: 1
diff changeset
411 xpow (const Complex& a, const ComplexMatrix& b)
1
78fd87e624cb [project @ 1993-08-08 01:13:40 by jwe]
jwe
parents:
diff changeset
412 {
2086
bfb775fb6fe8 [project @ 1996-04-25 05:55:19 by jwe]
jwe
parents: 1996
diff changeset
413 octave_value retval;
1
78fd87e624cb [project @ 1993-08-08 01:13:40 by jwe]
jwe
parents:
diff changeset
414
5275
23b37da9fd5b [project @ 2005-04-08 16:07:35 by jwe]
jwe
parents: 5260
diff changeset
415 octave_idx_type nr = b.rows ();
23b37da9fd5b [project @ 2005-04-08 16:07:35 by jwe]
jwe
parents: 5260
diff changeset
416 octave_idx_type nc = b.cols ();
1
78fd87e624cb [project @ 1993-08-08 01:13:40 by jwe]
jwe
parents:
diff changeset
417
78fd87e624cb [project @ 1993-08-08 01:13:40 by jwe]
jwe
parents:
diff changeset
418 if (nr == 0 || nc == 0 || nr != nc)
2365
7c60f8a6e6a0 [project @ 1996-10-11 23:03:52 by jwe]
jwe
parents: 2305
diff changeset
419 error ("for x^A, A must be square");
1
78fd87e624cb [project @ 1993-08-08 01:13:40 by jwe]
jwe
parents:
diff changeset
420 else
78fd87e624cb [project @ 1993-08-08 01:13:40 by jwe]
jwe
parents:
diff changeset
421 {
78fd87e624cb [project @ 1993-08-08 01:13:40 by jwe]
jwe
parents:
diff changeset
422 EIG b_eig (b);
78fd87e624cb [project @ 1993-08-08 01:13:40 by jwe]
jwe
parents:
diff changeset
423
7578
91f8446ce4ae handle possible error from EIG
John W. Eaton <jwe@octave.org>
parents: 7543
diff changeset
424 if (! error_state)
1
78fd87e624cb [project @ 1993-08-08 01:13:40 by jwe]
jwe
parents:
diff changeset
425 {
7578
91f8446ce4ae handle possible error from EIG
John W. Eaton <jwe@octave.org>
parents: 7543
diff changeset
426 ComplexColumnVector lambda (b_eig.eigenvalues ());
91f8446ce4ae handle possible error from EIG
John W. Eaton <jwe@octave.org>
parents: 7543
diff changeset
427 ComplexMatrix Q (b_eig.eigenvectors ());
91f8446ce4ae handle possible error from EIG
John W. Eaton <jwe@octave.org>
parents: 7543
diff changeset
428
91f8446ce4ae handle possible error from EIG
John W. Eaton <jwe@octave.org>
parents: 7543
diff changeset
429 for (octave_idx_type i = 0; i < nr; i++)
91f8446ce4ae handle possible error from EIG
John W. Eaton <jwe@octave.org>
parents: 7543
diff changeset
430 {
91f8446ce4ae handle possible error from EIG
John W. Eaton <jwe@octave.org>
parents: 7543
diff changeset
431 Complex elt = lambda(i);
91f8446ce4ae handle possible error from EIG
John W. Eaton <jwe@octave.org>
parents: 7543
diff changeset
432 if (std::imag (elt) == 0.0)
91f8446ce4ae handle possible error from EIG
John W. Eaton <jwe@octave.org>
parents: 7543
diff changeset
433 lambda(i) = std::pow (a, std::real (elt));
91f8446ce4ae handle possible error from EIG
John W. Eaton <jwe@octave.org>
parents: 7543
diff changeset
434 else
91f8446ce4ae handle possible error from EIG
John W. Eaton <jwe@octave.org>
parents: 7543
diff changeset
435 lambda(i) = std::pow (a, elt);
91f8446ce4ae handle possible error from EIG
John W. Eaton <jwe@octave.org>
parents: 7543
diff changeset
436 }
91f8446ce4ae handle possible error from EIG
John W. Eaton <jwe@octave.org>
parents: 7543
diff changeset
437 ComplexDiagMatrix D (lambda);
91f8446ce4ae handle possible error from EIG
John W. Eaton <jwe@octave.org>
parents: 7543
diff changeset
438
91f8446ce4ae handle possible error from EIG
John W. Eaton <jwe@octave.org>
parents: 7543
diff changeset
439 retval = ComplexMatrix (Q * D * Q.inverse ());
1
78fd87e624cb [project @ 1993-08-08 01:13:40 by jwe]
jwe
parents:
diff changeset
440 }
7578
91f8446ce4ae handle possible error from EIG
John W. Eaton <jwe@octave.org>
parents: 7543
diff changeset
441 else
91f8446ce4ae handle possible error from EIG
John W. Eaton <jwe@octave.org>
parents: 7543
diff changeset
442 error ("xpow: matrix diagonalization failed");
1
78fd87e624cb [project @ 1993-08-08 01:13:40 by jwe]
jwe
parents:
diff changeset
443 }
78fd87e624cb [project @ 1993-08-08 01:13:40 by jwe]
jwe
parents:
diff changeset
444
78fd87e624cb [project @ 1993-08-08 01:13:40 by jwe]
jwe
parents:
diff changeset
445 return retval;
78fd87e624cb [project @ 1993-08-08 01:13:40 by jwe]
jwe
parents:
diff changeset
446 }
78fd87e624cb [project @ 1993-08-08 01:13:40 by jwe]
jwe
parents:
diff changeset
447
767
42731861ee09 [project @ 1994-10-05 21:26:54 by jwe]
jwe
parents: 453
diff changeset
448 // -*- 11 -*-
2086
bfb775fb6fe8 [project @ 1996-04-25 05:55:19 by jwe]
jwe
parents: 1996
diff changeset
449 octave_value
164
e2c950dd96d2 [project @ 1993-10-18 19:32:00 by jwe]
jwe
parents: 1
diff changeset
450 xpow (const ComplexMatrix& a, double b)
1
78fd87e624cb [project @ 1993-08-08 01:13:40 by jwe]
jwe
parents:
diff changeset
451 {
2086
bfb775fb6fe8 [project @ 1996-04-25 05:55:19 by jwe]
jwe
parents: 1996
diff changeset
452 octave_value retval;
1
78fd87e624cb [project @ 1993-08-08 01:13:40 by jwe]
jwe
parents:
diff changeset
453
5275
23b37da9fd5b [project @ 2005-04-08 16:07:35 by jwe]
jwe
parents: 5260
diff changeset
454 octave_idx_type nr = a.rows ();
23b37da9fd5b [project @ 2005-04-08 16:07:35 by jwe]
jwe
parents: 5260
diff changeset
455 octave_idx_type nc = a.cols ();
1
78fd87e624cb [project @ 1993-08-08 01:13:40 by jwe]
jwe
parents:
diff changeset
456
78fd87e624cb [project @ 1993-08-08 01:13:40 by jwe]
jwe
parents:
diff changeset
457 if (nr == 0 || nc == 0 || nr != nc)
2365
7c60f8a6e6a0 [project @ 1996-10-11 23:03:52 by jwe]
jwe
parents: 2305
diff changeset
458 error ("for A^b, A must be square");
1567
1da33230f424 [project @ 1995-10-18 00:47:12 by jwe]
jwe
parents: 1358
diff changeset
459 else
1
78fd87e624cb [project @ 1993-08-08 01:13:40 by jwe]
jwe
parents:
diff changeset
460 {
2800
9aeba8e006a4 [project @ 1997-03-09 09:50:20 by jwe]
jwe
parents: 2365
diff changeset
461 if (static_cast<int> (b) == b)
1
78fd87e624cb [project @ 1993-08-08 01:13:40 by jwe]
jwe
parents:
diff changeset
462 {
2804
eedc2f3f61f7 [project @ 1997-03-11 04:34:50 by jwe]
jwe
parents: 2800
diff changeset
463 int btmp = static_cast<int> (b);
1567
1da33230f424 [project @ 1995-10-18 00:47:12 by jwe]
jwe
parents: 1358
diff changeset
464 if (btmp == 0)
1da33230f424 [project @ 1995-10-18 00:47:12 by jwe]
jwe
parents: 1358
diff changeset
465 {
1da33230f424 [project @ 1995-10-18 00:47:12 by jwe]
jwe
parents: 1358
diff changeset
466 retval = DiagMatrix (nr, nr, 1.0);
1da33230f424 [project @ 1995-10-18 00:47:12 by jwe]
jwe
parents: 1358
diff changeset
467 }
1da33230f424 [project @ 1995-10-18 00:47:12 by jwe]
jwe
parents: 1358
diff changeset
468 else
1da33230f424 [project @ 1995-10-18 00:47:12 by jwe]
jwe
parents: 1358
diff changeset
469 {
1da33230f424 [project @ 1995-10-18 00:47:12 by jwe]
jwe
parents: 1358
diff changeset
470 // Too much copying?
5775
ace8d8d26933 [project @ 2006-04-24 19:13:06 by jwe]
jwe
parents: 5667
diff changeset
471 // FIXME -- we shouldn't do this if the exponent is
1567
1da33230f424 [project @ 1995-10-18 00:47:12 by jwe]
jwe
parents: 1358
diff changeset
472 // large...
1da33230f424 [project @ 1995-10-18 00:47:12 by jwe]
jwe
parents: 1358
diff changeset
473
1da33230f424 [project @ 1995-10-18 00:47:12 by jwe]
jwe
parents: 1358
diff changeset
474 ComplexMatrix atmp;
1da33230f424 [project @ 1995-10-18 00:47:12 by jwe]
jwe
parents: 1358
diff changeset
475 if (btmp < 0)
1da33230f424 [project @ 1995-10-18 00:47:12 by jwe]
jwe
parents: 1358
diff changeset
476 {
1da33230f424 [project @ 1995-10-18 00:47:12 by jwe]
jwe
parents: 1358
diff changeset
477 btmp = -btmp;
1655
593fff2e7e39 [project @ 1995-12-20 10:50:16 by jwe]
jwe
parents: 1651
diff changeset
478
5275
23b37da9fd5b [project @ 2005-04-08 16:07:35 by jwe]
jwe
parents: 5260
diff changeset
479 octave_idx_type info;
1655
593fff2e7e39 [project @ 1995-12-20 10:50:16 by jwe]
jwe
parents: 1651
diff changeset
480 double rcond = 0.0;
6207
3c92b8d892dd [project @ 2006-12-06 20:19:14 by dbateman]
dbateman
parents: 5775
diff changeset
481 MatrixType mattype (a);
1655
593fff2e7e39 [project @ 1995-12-20 10:50:16 by jwe]
jwe
parents: 1651
diff changeset
482
6207
3c92b8d892dd [project @ 2006-12-06 20:19:14 by dbateman]
dbateman
parents: 5775
diff changeset
483 atmp = a.inverse (mattype, info, rcond, 1);
1655
593fff2e7e39 [project @ 1995-12-20 10:50:16 by jwe]
jwe
parents: 1651
diff changeset
484
593fff2e7e39 [project @ 1995-12-20 10:50:16 by jwe]
jwe
parents: 1651
diff changeset
485 if (info == -1)
593fff2e7e39 [project @ 1995-12-20 10:50:16 by jwe]
jwe
parents: 1651
diff changeset
486 warning ("inverse: matrix singular to machine\
593fff2e7e39 [project @ 1995-12-20 10:50:16 by jwe]
jwe
parents: 1651
diff changeset
487 precision, rcond = %g", rcond);
1567
1da33230f424 [project @ 1995-10-18 00:47:12 by jwe]
jwe
parents: 1358
diff changeset
488 }
1da33230f424 [project @ 1995-10-18 00:47:12 by jwe]
jwe
parents: 1358
diff changeset
489 else
1da33230f424 [project @ 1995-10-18 00:47:12 by jwe]
jwe
parents: 1358
diff changeset
490 atmp = a;
1da33230f424 [project @ 1995-10-18 00:47:12 by jwe]
jwe
parents: 1358
diff changeset
491
1da33230f424 [project @ 1995-10-18 00:47:12 by jwe]
jwe
parents: 1358
diff changeset
492 ComplexMatrix result (atmp);
3178
09a3064a3a17 [project @ 1998-06-23 03:46:42 by jwe]
jwe
parents: 3162
diff changeset
493
09a3064a3a17 [project @ 1998-06-23 03:46:42 by jwe]
jwe
parents: 3162
diff changeset
494 btmp--;
09a3064a3a17 [project @ 1998-06-23 03:46:42 by jwe]
jwe
parents: 3162
diff changeset
495
09a3064a3a17 [project @ 1998-06-23 03:46:42 by jwe]
jwe
parents: 3162
diff changeset
496 while (btmp > 0)
09a3064a3a17 [project @ 1998-06-23 03:46:42 by jwe]
jwe
parents: 3162
diff changeset
497 {
09a3064a3a17 [project @ 1998-06-23 03:46:42 by jwe]
jwe
parents: 3162
diff changeset
498 if (btmp & 1)
09a3064a3a17 [project @ 1998-06-23 03:46:42 by jwe]
jwe
parents: 3162
diff changeset
499 result = result * atmp;
09a3064a3a17 [project @ 1998-06-23 03:46:42 by jwe]
jwe
parents: 3162
diff changeset
500
09a3064a3a17 [project @ 1998-06-23 03:46:42 by jwe]
jwe
parents: 3162
diff changeset
501 btmp >>= 1;
09a3064a3a17 [project @ 1998-06-23 03:46:42 by jwe]
jwe
parents: 3162
diff changeset
502
09a3064a3a17 [project @ 1998-06-23 03:46:42 by jwe]
jwe
parents: 3162
diff changeset
503 if (btmp > 0)
09a3064a3a17 [project @ 1998-06-23 03:46:42 by jwe]
jwe
parents: 3162
diff changeset
504 atmp = atmp * atmp;
09a3064a3a17 [project @ 1998-06-23 03:46:42 by jwe]
jwe
parents: 3162
diff changeset
505 }
1567
1da33230f424 [project @ 1995-10-18 00:47:12 by jwe]
jwe
parents: 1358
diff changeset
506
1da33230f424 [project @ 1995-10-18 00:47:12 by jwe]
jwe
parents: 1358
diff changeset
507 retval = result;
1da33230f424 [project @ 1995-10-18 00:47:12 by jwe]
jwe
parents: 1358
diff changeset
508 }
1
78fd87e624cb [project @ 1993-08-08 01:13:40 by jwe]
jwe
parents:
diff changeset
509 }
78fd87e624cb [project @ 1993-08-08 01:13:40 by jwe]
jwe
parents:
diff changeset
510 else
78fd87e624cb [project @ 1993-08-08 01:13:40 by jwe]
jwe
parents:
diff changeset
511 {
1567
1da33230f424 [project @ 1995-10-18 00:47:12 by jwe]
jwe
parents: 1358
diff changeset
512 EIG a_eig (a);
7578
91f8446ce4ae handle possible error from EIG
John W. Eaton <jwe@octave.org>
parents: 7543
diff changeset
513
91f8446ce4ae handle possible error from EIG
John W. Eaton <jwe@octave.org>
parents: 7543
diff changeset
514 if (! error_state)
91f8446ce4ae handle possible error from EIG
John W. Eaton <jwe@octave.org>
parents: 7543
diff changeset
515 {
91f8446ce4ae handle possible error from EIG
John W. Eaton <jwe@octave.org>
parents: 7543
diff changeset
516 ComplexColumnVector lambda (a_eig.eigenvalues ());
91f8446ce4ae handle possible error from EIG
John W. Eaton <jwe@octave.org>
parents: 7543
diff changeset
517 ComplexMatrix Q (a_eig.eigenvectors ());
1567
1da33230f424 [project @ 1995-10-18 00:47:12 by jwe]
jwe
parents: 1358
diff changeset
518
7578
91f8446ce4ae handle possible error from EIG
John W. Eaton <jwe@octave.org>
parents: 7543
diff changeset
519 for (octave_idx_type i = 0; i < nr; i++)
91f8446ce4ae handle possible error from EIG
John W. Eaton <jwe@octave.org>
parents: 7543
diff changeset
520 lambda(i) = std::pow (lambda(i), b);
91f8446ce4ae handle possible error from EIG
John W. Eaton <jwe@octave.org>
parents: 7543
diff changeset
521
91f8446ce4ae handle possible error from EIG
John W. Eaton <jwe@octave.org>
parents: 7543
diff changeset
522 ComplexDiagMatrix D (lambda);
1567
1da33230f424 [project @ 1995-10-18 00:47:12 by jwe]
jwe
parents: 1358
diff changeset
523
7578
91f8446ce4ae handle possible error from EIG
John W. Eaton <jwe@octave.org>
parents: 7543
diff changeset
524 retval = ComplexMatrix (Q * D * Q.inverse ());
91f8446ce4ae handle possible error from EIG
John W. Eaton <jwe@octave.org>
parents: 7543
diff changeset
525 }
91f8446ce4ae handle possible error from EIG
John W. Eaton <jwe@octave.org>
parents: 7543
diff changeset
526 else
91f8446ce4ae handle possible error from EIG
John W. Eaton <jwe@octave.org>
parents: 7543
diff changeset
527 error ("xpow: matrix diagonalization failed");
1567
1da33230f424 [project @ 1995-10-18 00:47:12 by jwe]
jwe
parents: 1358
diff changeset
528 }
1da33230f424 [project @ 1995-10-18 00:47:12 by jwe]
jwe
parents: 1358
diff changeset
529 }
1358
dc9c01f66a19 [project @ 1995-09-05 21:10:01 by jwe]
jwe
parents: 1352
diff changeset
530
1567
1da33230f424 [project @ 1995-10-18 00:47:12 by jwe]
jwe
parents: 1358
diff changeset
531 return retval;
1da33230f424 [project @ 1995-10-18 00:47:12 by jwe]
jwe
parents: 1358
diff changeset
532 }
1
78fd87e624cb [project @ 1993-08-08 01:13:40 by jwe]
jwe
parents:
diff changeset
533
1567
1da33230f424 [project @ 1995-10-18 00:47:12 by jwe]
jwe
parents: 1358
diff changeset
534 // -*- 12 -*-
2086
bfb775fb6fe8 [project @ 1996-04-25 05:55:19 by jwe]
jwe
parents: 1996
diff changeset
535 octave_value
1567
1da33230f424 [project @ 1995-10-18 00:47:12 by jwe]
jwe
parents: 1358
diff changeset
536 xpow (const ComplexMatrix& a, const Complex& b)
1da33230f424 [project @ 1995-10-18 00:47:12 by jwe]
jwe
parents: 1358
diff changeset
537 {
2086
bfb775fb6fe8 [project @ 1996-04-25 05:55:19 by jwe]
jwe
parents: 1996
diff changeset
538 octave_value retval;
1
78fd87e624cb [project @ 1993-08-08 01:13:40 by jwe]
jwe
parents:
diff changeset
539
5275
23b37da9fd5b [project @ 2005-04-08 16:07:35 by jwe]
jwe
parents: 5260
diff changeset
540 octave_idx_type nr = a.rows ();
23b37da9fd5b [project @ 2005-04-08 16:07:35 by jwe]
jwe
parents: 5260
diff changeset
541 octave_idx_type nc = a.cols ();
1567
1da33230f424 [project @ 1995-10-18 00:47:12 by jwe]
jwe
parents: 1358
diff changeset
542
1da33230f424 [project @ 1995-10-18 00:47:12 by jwe]
jwe
parents: 1358
diff changeset
543 if (nr == 0 || nc == 0 || nr != nc)
2365
7c60f8a6e6a0 [project @ 1996-10-11 23:03:52 by jwe]
jwe
parents: 2305
diff changeset
544 error ("for A^b, A must be square");
1
78fd87e624cb [project @ 1993-08-08 01:13:40 by jwe]
jwe
parents:
diff changeset
545 else
78fd87e624cb [project @ 1993-08-08 01:13:40 by jwe]
jwe
parents:
diff changeset
546 {
78fd87e624cb [project @ 1993-08-08 01:13:40 by jwe]
jwe
parents:
diff changeset
547 EIG a_eig (a);
7578
91f8446ce4ae handle possible error from EIG
John W. Eaton <jwe@octave.org>
parents: 7543
diff changeset
548
91f8446ce4ae handle possible error from EIG
John W. Eaton <jwe@octave.org>
parents: 7543
diff changeset
549 if (! error_state)
91f8446ce4ae handle possible error from EIG
John W. Eaton <jwe@octave.org>
parents: 7543
diff changeset
550 {
91f8446ce4ae handle possible error from EIG
John W. Eaton <jwe@octave.org>
parents: 7543
diff changeset
551 ComplexColumnVector lambda (a_eig.eigenvalues ());
91f8446ce4ae handle possible error from EIG
John W. Eaton <jwe@octave.org>
parents: 7543
diff changeset
552 ComplexMatrix Q (a_eig.eigenvectors ());
1
78fd87e624cb [project @ 1993-08-08 01:13:40 by jwe]
jwe
parents:
diff changeset
553
7578
91f8446ce4ae handle possible error from EIG
John W. Eaton <jwe@octave.org>
parents: 7543
diff changeset
554 for (octave_idx_type i = 0; i < nr; i++)
91f8446ce4ae handle possible error from EIG
John W. Eaton <jwe@octave.org>
parents: 7543
diff changeset
555 lambda(i) = std::pow (lambda(i), b);
91f8446ce4ae handle possible error from EIG
John W. Eaton <jwe@octave.org>
parents: 7543
diff changeset
556
91f8446ce4ae handle possible error from EIG
John W. Eaton <jwe@octave.org>
parents: 7543
diff changeset
557 ComplexDiagMatrix D (lambda);
1
78fd87e624cb [project @ 1993-08-08 01:13:40 by jwe]
jwe
parents:
diff changeset
558
7578
91f8446ce4ae handle possible error from EIG
John W. Eaton <jwe@octave.org>
parents: 7543
diff changeset
559 retval = ComplexMatrix (Q * D * Q.inverse ());
91f8446ce4ae handle possible error from EIG
John W. Eaton <jwe@octave.org>
parents: 7543
diff changeset
560 }
91f8446ce4ae handle possible error from EIG
John W. Eaton <jwe@octave.org>
parents: 7543
diff changeset
561 else
91f8446ce4ae handle possible error from EIG
John W. Eaton <jwe@octave.org>
parents: 7543
diff changeset
562 error ("xpow: matrix diagonalization failed");
1
78fd87e624cb [project @ 1993-08-08 01:13:40 by jwe]
jwe
parents:
diff changeset
563 }
78fd87e624cb [project @ 1993-08-08 01:13:40 by jwe]
jwe
parents:
diff changeset
564
78fd87e624cb [project @ 1993-08-08 01:13:40 by jwe]
jwe
parents:
diff changeset
565 return retval;
78fd87e624cb [project @ 1993-08-08 01:13:40 by jwe]
jwe
parents:
diff changeset
566 }
78fd87e624cb [project @ 1993-08-08 01:13:40 by jwe]
jwe
parents:
diff changeset
567
8382
9b20a4847056 implement scalar powers of diag matrices
Jaroslav Hajek <highegg@gmail.com>
parents: 7789
diff changeset
568 // -*- 12d -*-
9b20a4847056 implement scalar powers of diag matrices
Jaroslav Hajek <highegg@gmail.com>
parents: 7789
diff changeset
569 octave_value
9b20a4847056 implement scalar powers of diag matrices
Jaroslav Hajek <highegg@gmail.com>
parents: 7789
diff changeset
570 xpow (const ComplexDiagMatrix& a, const Complex& b)
9b20a4847056 implement scalar powers of diag matrices
Jaroslav Hajek <highegg@gmail.com>
parents: 7789
diff changeset
571 {
9b20a4847056 implement scalar powers of diag matrices
Jaroslav Hajek <highegg@gmail.com>
parents: 7789
diff changeset
572 octave_value retval;
9b20a4847056 implement scalar powers of diag matrices
Jaroslav Hajek <highegg@gmail.com>
parents: 7789
diff changeset
573
9b20a4847056 implement scalar powers of diag matrices
Jaroslav Hajek <highegg@gmail.com>
parents: 7789
diff changeset
574 octave_idx_type nr = a.rows ();
9b20a4847056 implement scalar powers of diag matrices
Jaroslav Hajek <highegg@gmail.com>
parents: 7789
diff changeset
575 octave_idx_type nc = a.cols ();
9b20a4847056 implement scalar powers of diag matrices
Jaroslav Hajek <highegg@gmail.com>
parents: 7789
diff changeset
576
9b20a4847056 implement scalar powers of diag matrices
Jaroslav Hajek <highegg@gmail.com>
parents: 7789
diff changeset
577 if (nr == 0 || nc == 0 || nr != nc)
9b20a4847056 implement scalar powers of diag matrices
Jaroslav Hajek <highegg@gmail.com>
parents: 7789
diff changeset
578 error ("for A^b, A must be square");
9b20a4847056 implement scalar powers of diag matrices
Jaroslav Hajek <highegg@gmail.com>
parents: 7789
diff changeset
579 else
9b20a4847056 implement scalar powers of diag matrices
Jaroslav Hajek <highegg@gmail.com>
parents: 7789
diff changeset
580 {
9b20a4847056 implement scalar powers of diag matrices
Jaroslav Hajek <highegg@gmail.com>
parents: 7789
diff changeset
581 ComplexDiagMatrix r (nr, nc);
9b20a4847056 implement scalar powers of diag matrices
Jaroslav Hajek <highegg@gmail.com>
parents: 7789
diff changeset
582 for (octave_idx_type i = 0; i < nc; i++)
9b20a4847056 implement scalar powers of diag matrices
Jaroslav Hajek <highegg@gmail.com>
parents: 7789
diff changeset
583 r(i, i) = std::pow (a(i, i), b);
9b20a4847056 implement scalar powers of diag matrices
Jaroslav Hajek <highegg@gmail.com>
parents: 7789
diff changeset
584 retval = r;
9b20a4847056 implement scalar powers of diag matrices
Jaroslav Hajek <highegg@gmail.com>
parents: 7789
diff changeset
585 }
9b20a4847056 implement scalar powers of diag matrices
Jaroslav Hajek <highegg@gmail.com>
parents: 7789
diff changeset
586
9b20a4847056 implement scalar powers of diag matrices
Jaroslav Hajek <highegg@gmail.com>
parents: 7789
diff changeset
587 return retval;
9b20a4847056 implement scalar powers of diag matrices
Jaroslav Hajek <highegg@gmail.com>
parents: 7789
diff changeset
588 }
9b20a4847056 implement scalar powers of diag matrices
Jaroslav Hajek <highegg@gmail.com>
parents: 7789
diff changeset
589
9b20a4847056 implement scalar powers of diag matrices
Jaroslav Hajek <highegg@gmail.com>
parents: 7789
diff changeset
590 // mixed
9b20a4847056 implement scalar powers of diag matrices
Jaroslav Hajek <highegg@gmail.com>
parents: 7789
diff changeset
591 octave_value
9b20a4847056 implement scalar powers of diag matrices
Jaroslav Hajek <highegg@gmail.com>
parents: 7789
diff changeset
592 xpow (const ComplexDiagMatrix& a, double b)
9b20a4847056 implement scalar powers of diag matrices
Jaroslav Hajek <highegg@gmail.com>
parents: 7789
diff changeset
593 {
9b20a4847056 implement scalar powers of diag matrices
Jaroslav Hajek <highegg@gmail.com>
parents: 7789
diff changeset
594 return xpow (a, static_cast<Complex> (b));
9b20a4847056 implement scalar powers of diag matrices
Jaroslav Hajek <highegg@gmail.com>
parents: 7789
diff changeset
595 }
9b20a4847056 implement scalar powers of diag matrices
Jaroslav Hajek <highegg@gmail.com>
parents: 7789
diff changeset
596
9b20a4847056 implement scalar powers of diag matrices
Jaroslav Hajek <highegg@gmail.com>
parents: 7789
diff changeset
597 octave_value
9b20a4847056 implement scalar powers of diag matrices
Jaroslav Hajek <highegg@gmail.com>
parents: 7789
diff changeset
598 xpow (const DiagMatrix& a, const Complex& b)
9b20a4847056 implement scalar powers of diag matrices
Jaroslav Hajek <highegg@gmail.com>
parents: 7789
diff changeset
599 {
9b20a4847056 implement scalar powers of diag matrices
Jaroslav Hajek <highegg@gmail.com>
parents: 7789
diff changeset
600 return xpow (ComplexDiagMatrix (a), b);
9b20a4847056 implement scalar powers of diag matrices
Jaroslav Hajek <highegg@gmail.com>
parents: 7789
diff changeset
601 }
9b20a4847056 implement scalar powers of diag matrices
Jaroslav Hajek <highegg@gmail.com>
parents: 7789
diff changeset
602
9b20a4847056 implement scalar powers of diag matrices
Jaroslav Hajek <highegg@gmail.com>
parents: 7789
diff changeset
603
767
42731861ee09 [project @ 1994-10-05 21:26:54 by jwe]
jwe
parents: 453
diff changeset
604 // Safer pow functions that work elementwise for matrices.
42731861ee09 [project @ 1994-10-05 21:26:54 by jwe]
jwe
parents: 453
diff changeset
605 //
42731861ee09 [project @ 1994-10-05 21:26:54 by jwe]
jwe
parents: 453
diff changeset
606 // op2 \ op1: s m cs cm
42731861ee09 [project @ 1994-10-05 21:26:54 by jwe]
jwe
parents: 453
diff changeset
607 // +-- +---+---+----+----+
42731861ee09 [project @ 1994-10-05 21:26:54 by jwe]
jwe
parents: 453
diff changeset
608 // scalar | | * | 3 | * | 9 |
42731861ee09 [project @ 1994-10-05 21:26:54 by jwe]
jwe
parents: 453
diff changeset
609 // +---+---+----+----+
42731861ee09 [project @ 1994-10-05 21:26:54 by jwe]
jwe
parents: 453
diff changeset
610 // matrix | 1 | 4 | 7 | 10 |
42731861ee09 [project @ 1994-10-05 21:26:54 by jwe]
jwe
parents: 453
diff changeset
611 // +---+---+----+----+
42731861ee09 [project @ 1994-10-05 21:26:54 by jwe]
jwe
parents: 453
diff changeset
612 // complex_scalar | * | 5 | * | 11 |
42731861ee09 [project @ 1994-10-05 21:26:54 by jwe]
jwe
parents: 453
diff changeset
613 // +---+---+----+----+
42731861ee09 [project @ 1994-10-05 21:26:54 by jwe]
jwe
parents: 453
diff changeset
614 // complex_matrix | 2 | 6 | 8 | 12 |
42731861ee09 [project @ 1994-10-05 21:26:54 by jwe]
jwe
parents: 453
diff changeset
615 // +---+---+----+----+
42731861ee09 [project @ 1994-10-05 21:26:54 by jwe]
jwe
parents: 453
diff changeset
616 //
42731861ee09 [project @ 1994-10-05 21:26:54 by jwe]
jwe
parents: 453
diff changeset
617 // * -> not needed.
1
78fd87e624cb [project @ 1993-08-08 01:13:40 by jwe]
jwe
parents:
diff changeset
618
5775
ace8d8d26933 [project @ 2006-04-24 19:13:06 by jwe]
jwe
parents: 5667
diff changeset
619 // FIXME -- these functions need to be fixed so that things
3162
7c96e85c76db [project @ 1998-04-08 18:19:35 by jwe]
jwe
parents: 3125
diff changeset
620 // like
7c96e85c76db [project @ 1998-04-08 18:19:35 by jwe]
jwe
parents: 3125
diff changeset
621 //
7c96e85c76db [project @ 1998-04-08 18:19:35 by jwe]
jwe
parents: 3125
diff changeset
622 // a = -1; b = [ 0, 0.5, 1 ]; r = a .^ b
7c96e85c76db [project @ 1998-04-08 18:19:35 by jwe]
jwe
parents: 3125
diff changeset
623 //
7c96e85c76db [project @ 1998-04-08 18:19:35 by jwe]
jwe
parents: 3125
diff changeset
624 // and
7c96e85c76db [project @ 1998-04-08 18:19:35 by jwe]
jwe
parents: 3125
diff changeset
625 //
7c96e85c76db [project @ 1998-04-08 18:19:35 by jwe]
jwe
parents: 3125
diff changeset
626 // a = -1; b = [ 0, 0.5, 1 ]; for i = 1:3, r(i) = a .^ b(i), end
7c96e85c76db [project @ 1998-04-08 18:19:35 by jwe]
jwe
parents: 3125
diff changeset
627 //
7c96e85c76db [project @ 1998-04-08 18:19:35 by jwe]
jwe
parents: 3125
diff changeset
628 // produce identical results. Also, it would be nice if -1^0.5
7c96e85c76db [project @ 1998-04-08 18:19:35 by jwe]
jwe
parents: 3125
diff changeset
629 // produced a pure imaginary result instead of a complex number with a
7c96e85c76db [project @ 1998-04-08 18:19:35 by jwe]
jwe
parents: 3125
diff changeset
630 // small real part. But perhaps that's really a problem with the math
7c96e85c76db [project @ 1998-04-08 18:19:35 by jwe]
jwe
parents: 3125
diff changeset
631 // library...
7c96e85c76db [project @ 1998-04-08 18:19:35 by jwe]
jwe
parents: 3125
diff changeset
632
767
42731861ee09 [project @ 1994-10-05 21:26:54 by jwe]
jwe
parents: 453
diff changeset
633 // -*- 1 -*-
2086
bfb775fb6fe8 [project @ 1996-04-25 05:55:19 by jwe]
jwe
parents: 1996
diff changeset
634 octave_value
164
e2c950dd96d2 [project @ 1993-10-18 19:32:00 by jwe]
jwe
parents: 1
diff changeset
635 elem_xpow (double a, const Matrix& b)
1
78fd87e624cb [project @ 1993-08-08 01:13:40 by jwe]
jwe
parents:
diff changeset
636 {
2086
bfb775fb6fe8 [project @ 1996-04-25 05:55:19 by jwe]
jwe
parents: 1996
diff changeset
637 octave_value retval;
1
78fd87e624cb [project @ 1993-08-08 01:13:40 by jwe]
jwe
parents:
diff changeset
638
5275
23b37da9fd5b [project @ 2005-04-08 16:07:35 by jwe]
jwe
parents: 5260
diff changeset
639 octave_idx_type nr = b.rows ();
23b37da9fd5b [project @ 2005-04-08 16:07:35 by jwe]
jwe
parents: 5260
diff changeset
640 octave_idx_type nc = b.cols ();
1
78fd87e624cb [project @ 1993-08-08 01:13:40 by jwe]
jwe
parents:
diff changeset
641
3162
7c96e85c76db [project @ 1998-04-08 18:19:35 by jwe]
jwe
parents: 3125
diff changeset
642 double d1, d2;
1358
dc9c01f66a19 [project @ 1995-09-05 21:10:01 by jwe]
jwe
parents: 1352
diff changeset
643
3162
7c96e85c76db [project @ 1998-04-08 18:19:35 by jwe]
jwe
parents: 3125
diff changeset
644 if (a < 0.0 && ! b.all_integers (d1, d2))
1
78fd87e624cb [project @ 1993-08-08 01:13:40 by jwe]
jwe
parents:
diff changeset
645 {
78fd87e624cb [project @ 1993-08-08 01:13:40 by jwe]
jwe
parents:
diff changeset
646 Complex atmp (a);
78fd87e624cb [project @ 1993-08-08 01:13:40 by jwe]
jwe
parents:
diff changeset
647 ComplexMatrix result (nr, nc);
5275
23b37da9fd5b [project @ 2005-04-08 16:07:35 by jwe]
jwe
parents: 5260
diff changeset
648
23b37da9fd5b [project @ 2005-04-08 16:07:35 by jwe]
jwe
parents: 5260
diff changeset
649 for (octave_idx_type j = 0; j < nc; j++)
23b37da9fd5b [project @ 2005-04-08 16:07:35 by jwe]
jwe
parents: 5260
diff changeset
650 for (octave_idx_type i = 0; i < nr; i++)
4153
6b96ce9f5743 [project @ 2002-11-06 20:38:49 by jwe]
jwe
parents: 4055
diff changeset
651 {
6b96ce9f5743 [project @ 2002-11-06 20:38:49 by jwe]
jwe
parents: 4055
diff changeset
652 OCTAVE_QUIT;
5260
deed800e7bef [project @ 2005-03-30 23:18:58 by jwe]
jwe
parents: 4790
diff changeset
653 result (i, j) = std::pow (atmp, b (i, j));
4153
6b96ce9f5743 [project @ 2002-11-06 20:38:49 by jwe]
jwe
parents: 4055
diff changeset
654 }
1
78fd87e624cb [project @ 1993-08-08 01:13:40 by jwe]
jwe
parents:
diff changeset
655
1567
1da33230f424 [project @ 1995-10-18 00:47:12 by jwe]
jwe
parents: 1358
diff changeset
656 retval = result;
1
78fd87e624cb [project @ 1993-08-08 01:13:40 by jwe]
jwe
parents:
diff changeset
657 }
78fd87e624cb [project @ 1993-08-08 01:13:40 by jwe]
jwe
parents:
diff changeset
658 else
78fd87e624cb [project @ 1993-08-08 01:13:40 by jwe]
jwe
parents:
diff changeset
659 {
78fd87e624cb [project @ 1993-08-08 01:13:40 by jwe]
jwe
parents:
diff changeset
660 Matrix result (nr, nc);
5275
23b37da9fd5b [project @ 2005-04-08 16:07:35 by jwe]
jwe
parents: 5260
diff changeset
661
23b37da9fd5b [project @ 2005-04-08 16:07:35 by jwe]
jwe
parents: 5260
diff changeset
662 for (octave_idx_type j = 0; j < nc; j++)
23b37da9fd5b [project @ 2005-04-08 16:07:35 by jwe]
jwe
parents: 5260
diff changeset
663 for (octave_idx_type i = 0; i < nr; i++)
4153
6b96ce9f5743 [project @ 2002-11-06 20:38:49 by jwe]
jwe
parents: 4055
diff changeset
664 {
6b96ce9f5743 [project @ 2002-11-06 20:38:49 by jwe]
jwe
parents: 4055
diff changeset
665 OCTAVE_QUIT;
5260
deed800e7bef [project @ 2005-03-30 23:18:58 by jwe]
jwe
parents: 4790
diff changeset
666 result (i, j) = std::pow (a, b (i, j));
4153
6b96ce9f5743 [project @ 2002-11-06 20:38:49 by jwe]
jwe
parents: 4055
diff changeset
667 }
1
78fd87e624cb [project @ 1993-08-08 01:13:40 by jwe]
jwe
parents:
diff changeset
668
1567
1da33230f424 [project @ 1995-10-18 00:47:12 by jwe]
jwe
parents: 1358
diff changeset
669 retval = result;
1
78fd87e624cb [project @ 1993-08-08 01:13:40 by jwe]
jwe
parents:
diff changeset
670 }
78fd87e624cb [project @ 1993-08-08 01:13:40 by jwe]
jwe
parents:
diff changeset
671
78fd87e624cb [project @ 1993-08-08 01:13:40 by jwe]
jwe
parents:
diff changeset
672 return retval;
78fd87e624cb [project @ 1993-08-08 01:13:40 by jwe]
jwe
parents:
diff changeset
673 }
78fd87e624cb [project @ 1993-08-08 01:13:40 by jwe]
jwe
parents:
diff changeset
674
767
42731861ee09 [project @ 1994-10-05 21:26:54 by jwe]
jwe
parents: 453
diff changeset
675 // -*- 2 -*-
2086
bfb775fb6fe8 [project @ 1996-04-25 05:55:19 by jwe]
jwe
parents: 1996
diff changeset
676 octave_value
164
e2c950dd96d2 [project @ 1993-10-18 19:32:00 by jwe]
jwe
parents: 1
diff changeset
677 elem_xpow (double a, const ComplexMatrix& b)
1
78fd87e624cb [project @ 1993-08-08 01:13:40 by jwe]
jwe
parents:
diff changeset
678 {
5275
23b37da9fd5b [project @ 2005-04-08 16:07:35 by jwe]
jwe
parents: 5260
diff changeset
679 octave_idx_type nr = b.rows ();
23b37da9fd5b [project @ 2005-04-08 16:07:35 by jwe]
jwe
parents: 5260
diff changeset
680 octave_idx_type nc = b.cols ();
1
78fd87e624cb [project @ 1993-08-08 01:13:40 by jwe]
jwe
parents:
diff changeset
681
78fd87e624cb [project @ 1993-08-08 01:13:40 by jwe]
jwe
parents:
diff changeset
682 ComplexMatrix result (nr, nc);
3125
dcc6c985d72d [project @ 1998-01-16 05:08:21 by jwe]
jwe
parents: 2847
diff changeset
683 Complex atmp (a);
5275
23b37da9fd5b [project @ 2005-04-08 16:07:35 by jwe]
jwe
parents: 5260
diff changeset
684
23b37da9fd5b [project @ 2005-04-08 16:07:35 by jwe]
jwe
parents: 5260
diff changeset
685 for (octave_idx_type j = 0; j < nc; j++)
23b37da9fd5b [project @ 2005-04-08 16:07:35 by jwe]
jwe
parents: 5260
diff changeset
686 for (octave_idx_type i = 0; i < nr; i++)
4153
6b96ce9f5743 [project @ 2002-11-06 20:38:49 by jwe]
jwe
parents: 4055
diff changeset
687 {
6b96ce9f5743 [project @ 2002-11-06 20:38:49 by jwe]
jwe
parents: 4055
diff changeset
688 OCTAVE_QUIT;
5260
deed800e7bef [project @ 2005-03-30 23:18:58 by jwe]
jwe
parents: 4790
diff changeset
689 result (i, j) = std::pow (atmp, b (i, j));
4153
6b96ce9f5743 [project @ 2002-11-06 20:38:49 by jwe]
jwe
parents: 4055
diff changeset
690 }
1
78fd87e624cb [project @ 1993-08-08 01:13:40 by jwe]
jwe
parents:
diff changeset
691
1567
1da33230f424 [project @ 1995-10-18 00:47:12 by jwe]
jwe
parents: 1358
diff changeset
692 return result;
1
78fd87e624cb [project @ 1993-08-08 01:13:40 by jwe]
jwe
parents:
diff changeset
693 }
78fd87e624cb [project @ 1993-08-08 01:13:40 by jwe]
jwe
parents:
diff changeset
694
9103
10bed8fbec99 optimize scalar .^ range operation
Jaroslav Hajek <highegg@gmail.com>
parents: 8979
diff changeset
695 octave_value
10bed8fbec99 optimize scalar .^ range operation
Jaroslav Hajek <highegg@gmail.com>
parents: 8979
diff changeset
696 elem_xpow (double a, const Range& r)
10bed8fbec99 optimize scalar .^ range operation
Jaroslav Hajek <highegg@gmail.com>
parents: 8979
diff changeset
697 {
10bed8fbec99 optimize scalar .^ range operation
Jaroslav Hajek <highegg@gmail.com>
parents: 8979
diff changeset
698 octave_value retval;
10bed8fbec99 optimize scalar .^ range operation
Jaroslav Hajek <highegg@gmail.com>
parents: 8979
diff changeset
699
10bed8fbec99 optimize scalar .^ range operation
Jaroslav Hajek <highegg@gmail.com>
parents: 8979
diff changeset
700 if (r.nelem () <= 0)
10bed8fbec99 optimize scalar .^ range operation
Jaroslav Hajek <highegg@gmail.com>
parents: 8979
diff changeset
701 retval = Matrix ();
10bed8fbec99 optimize scalar .^ range operation
Jaroslav Hajek <highegg@gmail.com>
parents: 8979
diff changeset
702 else if (a < 0.0 && ! r.all_elements_are_ints ())
10bed8fbec99 optimize scalar .^ range operation
Jaroslav Hajek <highegg@gmail.com>
parents: 8979
diff changeset
703 {
10bed8fbec99 optimize scalar .^ range operation
Jaroslav Hajek <highegg@gmail.com>
parents: 8979
diff changeset
704 ComplexMatrix mat (1, r.nelem ());
10bed8fbec99 optimize scalar .^ range operation
Jaroslav Hajek <highegg@gmail.com>
parents: 8979
diff changeset
705 Complex atmp (a);
10bed8fbec99 optimize scalar .^ range operation
Jaroslav Hajek <highegg@gmail.com>
parents: 8979
diff changeset
706 Complex *pmat = mat.fortran_vec ();
10bed8fbec99 optimize scalar .^ range operation
Jaroslav Hajek <highegg@gmail.com>
parents: 8979
diff changeset
707
10bed8fbec99 optimize scalar .^ range operation
Jaroslav Hajek <highegg@gmail.com>
parents: 8979
diff changeset
708 pmat[0] = std::pow (atmp, r.base ());
10bed8fbec99 optimize scalar .^ range operation
Jaroslav Hajek <highegg@gmail.com>
parents: 8979
diff changeset
709 Complex mul = std::pow (atmp, r.inc ());
10bed8fbec99 optimize scalar .^ range operation
Jaroslav Hajek <highegg@gmail.com>
parents: 8979
diff changeset
710 for (octave_idx_type i = 1; i < r.nelem (); i++)
10bed8fbec99 optimize scalar .^ range operation
Jaroslav Hajek <highegg@gmail.com>
parents: 8979
diff changeset
711 pmat[i] = pmat[i-1] * mul;
10bed8fbec99 optimize scalar .^ range operation
Jaroslav Hajek <highegg@gmail.com>
parents: 8979
diff changeset
712
10bed8fbec99 optimize scalar .^ range operation
Jaroslav Hajek <highegg@gmail.com>
parents: 8979
diff changeset
713 retval = mat;
10bed8fbec99 optimize scalar .^ range operation
Jaroslav Hajek <highegg@gmail.com>
parents: 8979
diff changeset
714 }
10bed8fbec99 optimize scalar .^ range operation
Jaroslav Hajek <highegg@gmail.com>
parents: 8979
diff changeset
715 else
10bed8fbec99 optimize scalar .^ range operation
Jaroslav Hajek <highegg@gmail.com>
parents: 8979
diff changeset
716 {
10bed8fbec99 optimize scalar .^ range operation
Jaroslav Hajek <highegg@gmail.com>
parents: 8979
diff changeset
717 Matrix mat (1, r.nelem ());
10bed8fbec99 optimize scalar .^ range operation
Jaroslav Hajek <highegg@gmail.com>
parents: 8979
diff changeset
718 double *pmat = mat.fortran_vec ();
10bed8fbec99 optimize scalar .^ range operation
Jaroslav Hajek <highegg@gmail.com>
parents: 8979
diff changeset
719
10bed8fbec99 optimize scalar .^ range operation
Jaroslav Hajek <highegg@gmail.com>
parents: 8979
diff changeset
720 double base = std::pow (a, r.base ());
10bed8fbec99 optimize scalar .^ range operation
Jaroslav Hajek <highegg@gmail.com>
parents: 8979
diff changeset
721 pmat[0] = base;
10bed8fbec99 optimize scalar .^ range operation
Jaroslav Hajek <highegg@gmail.com>
parents: 8979
diff changeset
722 double mul = std::pow (a, r.inc ());
10bed8fbec99 optimize scalar .^ range operation
Jaroslav Hajek <highegg@gmail.com>
parents: 8979
diff changeset
723 for (octave_idx_type i = 1; i < r.nelem (); i++)
10bed8fbec99 optimize scalar .^ range operation
Jaroslav Hajek <highegg@gmail.com>
parents: 8979
diff changeset
724 pmat[i] = (base *= mul);
10bed8fbec99 optimize scalar .^ range operation
Jaroslav Hajek <highegg@gmail.com>
parents: 8979
diff changeset
725
10bed8fbec99 optimize scalar .^ range operation
Jaroslav Hajek <highegg@gmail.com>
parents: 8979
diff changeset
726 retval = mat;
10bed8fbec99 optimize scalar .^ range operation
Jaroslav Hajek <highegg@gmail.com>
parents: 8979
diff changeset
727 }
10bed8fbec99 optimize scalar .^ range operation
Jaroslav Hajek <highegg@gmail.com>
parents: 8979
diff changeset
728
10bed8fbec99 optimize scalar .^ range operation
Jaroslav Hajek <highegg@gmail.com>
parents: 8979
diff changeset
729 return retval;
10bed8fbec99 optimize scalar .^ range operation
Jaroslav Hajek <highegg@gmail.com>
parents: 8979
diff changeset
730 }
10bed8fbec99 optimize scalar .^ range operation
Jaroslav Hajek <highegg@gmail.com>
parents: 8979
diff changeset
731
767
42731861ee09 [project @ 1994-10-05 21:26:54 by jwe]
jwe
parents: 453
diff changeset
732 // -*- 3 -*-
2086
bfb775fb6fe8 [project @ 1996-04-25 05:55:19 by jwe]
jwe
parents: 1996
diff changeset
733 octave_value
164
e2c950dd96d2 [project @ 1993-10-18 19:32:00 by jwe]
jwe
parents: 1
diff changeset
734 elem_xpow (const Matrix& a, double b)
1
78fd87e624cb [project @ 1993-08-08 01:13:40 by jwe]
jwe
parents:
diff changeset
735 {
2086
bfb775fb6fe8 [project @ 1996-04-25 05:55:19 by jwe]
jwe
parents: 1996
diff changeset
736 octave_value retval;
1
78fd87e624cb [project @ 1993-08-08 01:13:40 by jwe]
jwe
parents:
diff changeset
737
5275
23b37da9fd5b [project @ 2005-04-08 16:07:35 by jwe]
jwe
parents: 5260
diff changeset
738 octave_idx_type nr = a.rows ();
23b37da9fd5b [project @ 2005-04-08 16:07:35 by jwe]
jwe
parents: 5260
diff changeset
739 octave_idx_type nc = a.cols ();
1
78fd87e624cb [project @ 1993-08-08 01:13:40 by jwe]
jwe
parents:
diff changeset
740
8978
0a58c4cd1405 optimize element-wise power
Jaroslav Hajek <highegg@gmail.com>
parents: 8960
diff changeset
741 if (! xisint (b) && a.any_element_is_negative ())
1
78fd87e624cb [project @ 1993-08-08 01:13:40 by jwe]
jwe
parents:
diff changeset
742 {
78fd87e624cb [project @ 1993-08-08 01:13:40 by jwe]
jwe
parents:
diff changeset
743 ComplexMatrix result (nr, nc);
5275
23b37da9fd5b [project @ 2005-04-08 16:07:35 by jwe]
jwe
parents: 5260
diff changeset
744
23b37da9fd5b [project @ 2005-04-08 16:07:35 by jwe]
jwe
parents: 5260
diff changeset
745 for (octave_idx_type j = 0; j < nc; j++)
23b37da9fd5b [project @ 2005-04-08 16:07:35 by jwe]
jwe
parents: 5260
diff changeset
746 for (octave_idx_type i = 0; i < nr; i++)
1
78fd87e624cb [project @ 1993-08-08 01:13:40 by jwe]
jwe
parents:
diff changeset
747 {
5665
d42bd103de79 [project @ 2006-03-14 19:13:40 by jwe]
jwe
parents: 5664
diff changeset
748 OCTAVE_QUIT;
d42bd103de79 [project @ 2006-03-14 19:13:40 by jwe]
jwe
parents: 5664
diff changeset
749
d42bd103de79 [project @ 2006-03-14 19:13:40 by jwe]
jwe
parents: 5664
diff changeset
750 Complex atmp (a (i, j));
d42bd103de79 [project @ 2006-03-14 19:13:40 by jwe]
jwe
parents: 5664
diff changeset
751
d42bd103de79 [project @ 2006-03-14 19:13:40 by jwe]
jwe
parents: 5664
diff changeset
752 result (i, j) = std::pow (atmp, b);
1
78fd87e624cb [project @ 1993-08-08 01:13:40 by jwe]
jwe
parents:
diff changeset
753 }
78fd87e624cb [project @ 1993-08-08 01:13:40 by jwe]
jwe
parents:
diff changeset
754
1567
1da33230f424 [project @ 1995-10-18 00:47:12 by jwe]
jwe
parents: 1358
diff changeset
755 retval = result;
1
78fd87e624cb [project @ 1993-08-08 01:13:40 by jwe]
jwe
parents:
diff changeset
756 }
78fd87e624cb [project @ 1993-08-08 01:13:40 by jwe]
jwe
parents:
diff changeset
757 else
78fd87e624cb [project @ 1993-08-08 01:13:40 by jwe]
jwe
parents:
diff changeset
758 {
78fd87e624cb [project @ 1993-08-08 01:13:40 by jwe]
jwe
parents:
diff changeset
759 Matrix result (nr, nc);
5275
23b37da9fd5b [project @ 2005-04-08 16:07:35 by jwe]
jwe
parents: 5260
diff changeset
760
23b37da9fd5b [project @ 2005-04-08 16:07:35 by jwe]
jwe
parents: 5260
diff changeset
761 for (octave_idx_type j = 0; j < nc; j++)
23b37da9fd5b [project @ 2005-04-08 16:07:35 by jwe]
jwe
parents: 5260
diff changeset
762 for (octave_idx_type i = 0; i < nr; i++)
4153
6b96ce9f5743 [project @ 2002-11-06 20:38:49 by jwe]
jwe
parents: 4055
diff changeset
763 {
6b96ce9f5743 [project @ 2002-11-06 20:38:49 by jwe]
jwe
parents: 4055
diff changeset
764 OCTAVE_QUIT;
5260
deed800e7bef [project @ 2005-03-30 23:18:58 by jwe]
jwe
parents: 4790
diff changeset
765 result (i, j) = std::pow (a (i, j), b);
4153
6b96ce9f5743 [project @ 2002-11-06 20:38:49 by jwe]
jwe
parents: 4055
diff changeset
766 }
1
78fd87e624cb [project @ 1993-08-08 01:13:40 by jwe]
jwe
parents:
diff changeset
767
1567
1da33230f424 [project @ 1995-10-18 00:47:12 by jwe]
jwe
parents: 1358
diff changeset
768 retval = result;
1
78fd87e624cb [project @ 1993-08-08 01:13:40 by jwe]
jwe
parents:
diff changeset
769 }
78fd87e624cb [project @ 1993-08-08 01:13:40 by jwe]
jwe
parents:
diff changeset
770
78fd87e624cb [project @ 1993-08-08 01:13:40 by jwe]
jwe
parents:
diff changeset
771 return retval;
78fd87e624cb [project @ 1993-08-08 01:13:40 by jwe]
jwe
parents:
diff changeset
772 }
78fd87e624cb [project @ 1993-08-08 01:13:40 by jwe]
jwe
parents:
diff changeset
773
767
42731861ee09 [project @ 1994-10-05 21:26:54 by jwe]
jwe
parents: 453
diff changeset
774 // -*- 4 -*-
2086
bfb775fb6fe8 [project @ 1996-04-25 05:55:19 by jwe]
jwe
parents: 1996
diff changeset
775 octave_value
164
e2c950dd96d2 [project @ 1993-10-18 19:32:00 by jwe]
jwe
parents: 1
diff changeset
776 elem_xpow (const Matrix& a, const Matrix& b)
1
78fd87e624cb [project @ 1993-08-08 01:13:40 by jwe]
jwe
parents:
diff changeset
777 {
2086
bfb775fb6fe8 [project @ 1996-04-25 05:55:19 by jwe]
jwe
parents: 1996
diff changeset
778 octave_value retval;
1567
1da33230f424 [project @ 1995-10-18 00:47:12 by jwe]
jwe
parents: 1358
diff changeset
779
5275
23b37da9fd5b [project @ 2005-04-08 16:07:35 by jwe]
jwe
parents: 5260
diff changeset
780 octave_idx_type nr = a.rows ();
23b37da9fd5b [project @ 2005-04-08 16:07:35 by jwe]
jwe
parents: 5260
diff changeset
781 octave_idx_type nc = a.cols ();
2365
7c60f8a6e6a0 [project @ 1996-10-11 23:03:52 by jwe]
jwe
parents: 2305
diff changeset
782
5275
23b37da9fd5b [project @ 2005-04-08 16:07:35 by jwe]
jwe
parents: 5260
diff changeset
783 octave_idx_type b_nr = b.rows ();
23b37da9fd5b [project @ 2005-04-08 16:07:35 by jwe]
jwe
parents: 5260
diff changeset
784 octave_idx_type b_nc = b.cols ();
1
78fd87e624cb [project @ 1993-08-08 01:13:40 by jwe]
jwe
parents:
diff changeset
785
2365
7c60f8a6e6a0 [project @ 1996-10-11 23:03:52 by jwe]
jwe
parents: 2305
diff changeset
786 if (nr != b_nr || nc != b_nc)
7c60f8a6e6a0 [project @ 1996-10-11 23:03:52 by jwe]
jwe
parents: 2305
diff changeset
787 {
7c60f8a6e6a0 [project @ 1996-10-11 23:03:52 by jwe]
jwe
parents: 2305
diff changeset
788 gripe_nonconformant ("operator .^", nr, nc, b_nr, b_nc);
7c60f8a6e6a0 [project @ 1996-10-11 23:03:52 by jwe]
jwe
parents: 2305
diff changeset
789 return octave_value ();
7c60f8a6e6a0 [project @ 1996-10-11 23:03:52 by jwe]
jwe
parents: 2305
diff changeset
790 }
1
78fd87e624cb [project @ 1993-08-08 01:13:40 by jwe]
jwe
parents:
diff changeset
791
78fd87e624cb [project @ 1993-08-08 01:13:40 by jwe]
jwe
parents:
diff changeset
792 int convert_to_complex = 0;
5275
23b37da9fd5b [project @ 2005-04-08 16:07:35 by jwe]
jwe
parents: 5260
diff changeset
793 for (octave_idx_type j = 0; j < nc; j++)
23b37da9fd5b [project @ 2005-04-08 16:07:35 by jwe]
jwe
parents: 5260
diff changeset
794 for (octave_idx_type i = 0; i < nr; i++)
1
78fd87e624cb [project @ 1993-08-08 01:13:40 by jwe]
jwe
parents:
diff changeset
795 {
4153
6b96ce9f5743 [project @ 2002-11-06 20:38:49 by jwe]
jwe
parents: 4055
diff changeset
796 OCTAVE_QUIT;
2305
5a3f1d00a474 [project @ 1996-07-09 16:20:40 by jwe]
jwe
parents: 2086
diff changeset
797 double atmp = a (i, j);
5a3f1d00a474 [project @ 1996-07-09 16:20:40 by jwe]
jwe
parents: 2086
diff changeset
798 double btmp = b (i, j);
2800
9aeba8e006a4 [project @ 1997-03-09 09:50:20 by jwe]
jwe
parents: 2365
diff changeset
799 if (atmp < 0.0 && static_cast<int> (btmp) != btmp)
1
78fd87e624cb [project @ 1993-08-08 01:13:40 by jwe]
jwe
parents:
diff changeset
800 {
78fd87e624cb [project @ 1993-08-08 01:13:40 by jwe]
jwe
parents:
diff changeset
801 convert_to_complex = 1;
78fd87e624cb [project @ 1993-08-08 01:13:40 by jwe]
jwe
parents:
diff changeset
802 goto done;
78fd87e624cb [project @ 1993-08-08 01:13:40 by jwe]
jwe
parents:
diff changeset
803 }
78fd87e624cb [project @ 1993-08-08 01:13:40 by jwe]
jwe
parents:
diff changeset
804 }
78fd87e624cb [project @ 1993-08-08 01:13:40 by jwe]
jwe
parents:
diff changeset
805
2365
7c60f8a6e6a0 [project @ 1996-10-11 23:03:52 by jwe]
jwe
parents: 2305
diff changeset
806 done:
1
78fd87e624cb [project @ 1993-08-08 01:13:40 by jwe]
jwe
parents:
diff changeset
807
78fd87e624cb [project @ 1993-08-08 01:13:40 by jwe]
jwe
parents:
diff changeset
808 if (convert_to_complex)
78fd87e624cb [project @ 1993-08-08 01:13:40 by jwe]
jwe
parents:
diff changeset
809 {
78fd87e624cb [project @ 1993-08-08 01:13:40 by jwe]
jwe
parents:
diff changeset
810 ComplexMatrix complex_result (nr, nc);
78fd87e624cb [project @ 1993-08-08 01:13:40 by jwe]
jwe
parents:
diff changeset
811
5275
23b37da9fd5b [project @ 2005-04-08 16:07:35 by jwe]
jwe
parents: 5260
diff changeset
812 for (octave_idx_type j = 0; j < nc; j++)
23b37da9fd5b [project @ 2005-04-08 16:07:35 by jwe]
jwe
parents: 5260
diff changeset
813 for (octave_idx_type i = 0; i < nr; i++)
1
78fd87e624cb [project @ 1993-08-08 01:13:40 by jwe]
jwe
parents:
diff changeset
814 {
4153
6b96ce9f5743 [project @ 2002-11-06 20:38:49 by jwe]
jwe
parents: 4055
diff changeset
815 OCTAVE_QUIT;
5665
d42bd103de79 [project @ 2006-03-14 19:13:40 by jwe]
jwe
parents: 5664
diff changeset
816 Complex atmp (a (i, j));
d42bd103de79 [project @ 2006-03-14 19:13:40 by jwe]
jwe
parents: 5664
diff changeset
817 Complex btmp (b (i, j));
d42bd103de79 [project @ 2006-03-14 19:13:40 by jwe]
jwe
parents: 5664
diff changeset
818 complex_result (i, j) = std::pow (atmp, btmp);
1
78fd87e624cb [project @ 1993-08-08 01:13:40 by jwe]
jwe
parents:
diff changeset
819 }
1567
1da33230f424 [project @ 1995-10-18 00:47:12 by jwe]
jwe
parents: 1358
diff changeset
820
1da33230f424 [project @ 1995-10-18 00:47:12 by jwe]
jwe
parents: 1358
diff changeset
821 retval = complex_result;
1
78fd87e624cb [project @ 1993-08-08 01:13:40 by jwe]
jwe
parents:
diff changeset
822 }
78fd87e624cb [project @ 1993-08-08 01:13:40 by jwe]
jwe
parents:
diff changeset
823 else
78fd87e624cb [project @ 1993-08-08 01:13:40 by jwe]
jwe
parents:
diff changeset
824 {
78fd87e624cb [project @ 1993-08-08 01:13:40 by jwe]
jwe
parents:
diff changeset
825 Matrix result (nr, nc);
78fd87e624cb [project @ 1993-08-08 01:13:40 by jwe]
jwe
parents:
diff changeset
826
5275
23b37da9fd5b [project @ 2005-04-08 16:07:35 by jwe]
jwe
parents: 5260
diff changeset
827 for (octave_idx_type j = 0; j < nc; j++)
23b37da9fd5b [project @ 2005-04-08 16:07:35 by jwe]
jwe
parents: 5260
diff changeset
828 for (octave_idx_type i = 0; i < nr; i++)
4153
6b96ce9f5743 [project @ 2002-11-06 20:38:49 by jwe]
jwe
parents: 4055
diff changeset
829 {
6b96ce9f5743 [project @ 2002-11-06 20:38:49 by jwe]
jwe
parents: 4055
diff changeset
830 OCTAVE_QUIT;
5260
deed800e7bef [project @ 2005-03-30 23:18:58 by jwe]
jwe
parents: 4790
diff changeset
831 result (i, j) = std::pow (a (i, j), b (i, j));
4153
6b96ce9f5743 [project @ 2002-11-06 20:38:49 by jwe]
jwe
parents: 4055
diff changeset
832 }
1
78fd87e624cb [project @ 1993-08-08 01:13:40 by jwe]
jwe
parents:
diff changeset
833
1567
1da33230f424 [project @ 1995-10-18 00:47:12 by jwe]
jwe
parents: 1358
diff changeset
834 retval = result;
1
78fd87e624cb [project @ 1993-08-08 01:13:40 by jwe]
jwe
parents:
diff changeset
835 }
1567
1da33230f424 [project @ 1995-10-18 00:47:12 by jwe]
jwe
parents: 1358
diff changeset
836
1da33230f424 [project @ 1995-10-18 00:47:12 by jwe]
jwe
parents: 1358
diff changeset
837 return retval;
1
78fd87e624cb [project @ 1993-08-08 01:13:40 by jwe]
jwe
parents:
diff changeset
838 }
78fd87e624cb [project @ 1993-08-08 01:13:40 by jwe]
jwe
parents:
diff changeset
839
767
42731861ee09 [project @ 1994-10-05 21:26:54 by jwe]
jwe
parents: 453
diff changeset
840 // -*- 5 -*-
2086
bfb775fb6fe8 [project @ 1996-04-25 05:55:19 by jwe]
jwe
parents: 1996
diff changeset
841 octave_value
164
e2c950dd96d2 [project @ 1993-10-18 19:32:00 by jwe]
jwe
parents: 1
diff changeset
842 elem_xpow (const Matrix& a, const Complex& b)
1
78fd87e624cb [project @ 1993-08-08 01:13:40 by jwe]
jwe
parents:
diff changeset
843 {
5275
23b37da9fd5b [project @ 2005-04-08 16:07:35 by jwe]
jwe
parents: 5260
diff changeset
844 octave_idx_type nr = a.rows ();
23b37da9fd5b [project @ 2005-04-08 16:07:35 by jwe]
jwe
parents: 5260
diff changeset
845 octave_idx_type nc = a.cols ();
1
78fd87e624cb [project @ 1993-08-08 01:13:40 by jwe]
jwe
parents:
diff changeset
846
78fd87e624cb [project @ 1993-08-08 01:13:40 by jwe]
jwe
parents:
diff changeset
847 ComplexMatrix result (nr, nc);
5275
23b37da9fd5b [project @ 2005-04-08 16:07:35 by jwe]
jwe
parents: 5260
diff changeset
848
23b37da9fd5b [project @ 2005-04-08 16:07:35 by jwe]
jwe
parents: 5260
diff changeset
849 for (octave_idx_type j = 0; j < nc; j++)
23b37da9fd5b [project @ 2005-04-08 16:07:35 by jwe]
jwe
parents: 5260
diff changeset
850 for (octave_idx_type i = 0; i < nr; i++)
4153
6b96ce9f5743 [project @ 2002-11-06 20:38:49 by jwe]
jwe
parents: 4055
diff changeset
851 {
6b96ce9f5743 [project @ 2002-11-06 20:38:49 by jwe]
jwe
parents: 4055
diff changeset
852 OCTAVE_QUIT;
5260
deed800e7bef [project @ 2005-03-30 23:18:58 by jwe]
jwe
parents: 4790
diff changeset
853 result (i, j) = std::pow (Complex (a (i, j)), b);
4153
6b96ce9f5743 [project @ 2002-11-06 20:38:49 by jwe]
jwe
parents: 4055
diff changeset
854 }
1
78fd87e624cb [project @ 1993-08-08 01:13:40 by jwe]
jwe
parents:
diff changeset
855
1567
1da33230f424 [project @ 1995-10-18 00:47:12 by jwe]
jwe
parents: 1358
diff changeset
856 return result;
1
78fd87e624cb [project @ 1993-08-08 01:13:40 by jwe]
jwe
parents:
diff changeset
857 }
78fd87e624cb [project @ 1993-08-08 01:13:40 by jwe]
jwe
parents:
diff changeset
858
767
42731861ee09 [project @ 1994-10-05 21:26:54 by jwe]
jwe
parents: 453
diff changeset
859 // -*- 6 -*-
2086
bfb775fb6fe8 [project @ 1996-04-25 05:55:19 by jwe]
jwe
parents: 1996
diff changeset
860 octave_value
164
e2c950dd96d2 [project @ 1993-10-18 19:32:00 by jwe]
jwe
parents: 1
diff changeset
861 elem_xpow (const Matrix& a, const ComplexMatrix& b)
1
78fd87e624cb [project @ 1993-08-08 01:13:40 by jwe]
jwe
parents:
diff changeset
862 {
5275
23b37da9fd5b [project @ 2005-04-08 16:07:35 by jwe]
jwe
parents: 5260
diff changeset
863 octave_idx_type nr = a.rows ();
23b37da9fd5b [project @ 2005-04-08 16:07:35 by jwe]
jwe
parents: 5260
diff changeset
864 octave_idx_type nc = a.cols ();
2365
7c60f8a6e6a0 [project @ 1996-10-11 23:03:52 by jwe]
jwe
parents: 2305
diff changeset
865
5275
23b37da9fd5b [project @ 2005-04-08 16:07:35 by jwe]
jwe
parents: 5260
diff changeset
866 octave_idx_type b_nr = b.rows ();
23b37da9fd5b [project @ 2005-04-08 16:07:35 by jwe]
jwe
parents: 5260
diff changeset
867 octave_idx_type b_nc = b.cols ();
1
78fd87e624cb [project @ 1993-08-08 01:13:40 by jwe]
jwe
parents:
diff changeset
868
2365
7c60f8a6e6a0 [project @ 1996-10-11 23:03:52 by jwe]
jwe
parents: 2305
diff changeset
869 if (nr != b_nr || nc != b_nc)
7c60f8a6e6a0 [project @ 1996-10-11 23:03:52 by jwe]
jwe
parents: 2305
diff changeset
870 {
7c60f8a6e6a0 [project @ 1996-10-11 23:03:52 by jwe]
jwe
parents: 2305
diff changeset
871 gripe_nonconformant ("operator .^", nr, nc, b_nr, b_nc);
7c60f8a6e6a0 [project @ 1996-10-11 23:03:52 by jwe]
jwe
parents: 2305
diff changeset
872 return octave_value ();
7c60f8a6e6a0 [project @ 1996-10-11 23:03:52 by jwe]
jwe
parents: 2305
diff changeset
873 }
1
78fd87e624cb [project @ 1993-08-08 01:13:40 by jwe]
jwe
parents:
diff changeset
874
78fd87e624cb [project @ 1993-08-08 01:13:40 by jwe]
jwe
parents:
diff changeset
875 ComplexMatrix result (nr, nc);
5275
23b37da9fd5b [project @ 2005-04-08 16:07:35 by jwe]
jwe
parents: 5260
diff changeset
876
23b37da9fd5b [project @ 2005-04-08 16:07:35 by jwe]
jwe
parents: 5260
diff changeset
877 for (octave_idx_type j = 0; j < nc; j++)
23b37da9fd5b [project @ 2005-04-08 16:07:35 by jwe]
jwe
parents: 5260
diff changeset
878 for (octave_idx_type i = 0; i < nr; i++)
4153
6b96ce9f5743 [project @ 2002-11-06 20:38:49 by jwe]
jwe
parents: 4055
diff changeset
879 {
6b96ce9f5743 [project @ 2002-11-06 20:38:49 by jwe]
jwe
parents: 4055
diff changeset
880 OCTAVE_QUIT;
5260
deed800e7bef [project @ 2005-03-30 23:18:58 by jwe]
jwe
parents: 4790
diff changeset
881 result (i, j) = std::pow (Complex (a (i, j)), b (i, j));
4153
6b96ce9f5743 [project @ 2002-11-06 20:38:49 by jwe]
jwe
parents: 4055
diff changeset
882 }
1
78fd87e624cb [project @ 1993-08-08 01:13:40 by jwe]
jwe
parents:
diff changeset
883
1567
1da33230f424 [project @ 1995-10-18 00:47:12 by jwe]
jwe
parents: 1358
diff changeset
884 return result;
1
78fd87e624cb [project @ 1993-08-08 01:13:40 by jwe]
jwe
parents:
diff changeset
885 }
78fd87e624cb [project @ 1993-08-08 01:13:40 by jwe]
jwe
parents:
diff changeset
886
767
42731861ee09 [project @ 1994-10-05 21:26:54 by jwe]
jwe
parents: 453
diff changeset
887 // -*- 7 -*-
2086
bfb775fb6fe8 [project @ 1996-04-25 05:55:19 by jwe]
jwe
parents: 1996
diff changeset
888 octave_value
164
e2c950dd96d2 [project @ 1993-10-18 19:32:00 by jwe]
jwe
parents: 1
diff changeset
889 elem_xpow (const Complex& a, const Matrix& b)
1
78fd87e624cb [project @ 1993-08-08 01:13:40 by jwe]
jwe
parents:
diff changeset
890 {
5275
23b37da9fd5b [project @ 2005-04-08 16:07:35 by jwe]
jwe
parents: 5260
diff changeset
891 octave_idx_type nr = b.rows ();
23b37da9fd5b [project @ 2005-04-08 16:07:35 by jwe]
jwe
parents: 5260
diff changeset
892 octave_idx_type nc = b.cols ();
1
78fd87e624cb [project @ 1993-08-08 01:13:40 by jwe]
jwe
parents:
diff changeset
893
78fd87e624cb [project @ 1993-08-08 01:13:40 by jwe]
jwe
parents:
diff changeset
894 ComplexMatrix result (nr, nc);
5275
23b37da9fd5b [project @ 2005-04-08 16:07:35 by jwe]
jwe
parents: 5260
diff changeset
895
23b37da9fd5b [project @ 2005-04-08 16:07:35 by jwe]
jwe
parents: 5260
diff changeset
896 for (octave_idx_type j = 0; j < nc; j++)
23b37da9fd5b [project @ 2005-04-08 16:07:35 by jwe]
jwe
parents: 5260
diff changeset
897 for (octave_idx_type i = 0; i < nr; i++)
1567
1da33230f424 [project @ 1995-10-18 00:47:12 by jwe]
jwe
parents: 1358
diff changeset
898 {
4153
6b96ce9f5743 [project @ 2002-11-06 20:38:49 by jwe]
jwe
parents: 4055
diff changeset
899 OCTAVE_QUIT;
2305
5a3f1d00a474 [project @ 1996-07-09 16:20:40 by jwe]
jwe
parents: 2086
diff changeset
900 double btmp = b (i, j);
1567
1da33230f424 [project @ 1995-10-18 00:47:12 by jwe]
jwe
parents: 1358
diff changeset
901 if (xisint (btmp))
5260
deed800e7bef [project @ 2005-03-30 23:18:58 by jwe]
jwe
parents: 4790
diff changeset
902 result (i, j) = std::pow (a, static_cast<int> (btmp));
1567
1da33230f424 [project @ 1995-10-18 00:47:12 by jwe]
jwe
parents: 1358
diff changeset
903 else
5260
deed800e7bef [project @ 2005-03-30 23:18:58 by jwe]
jwe
parents: 4790
diff changeset
904 result (i, j) = std::pow (a, btmp);
1567
1da33230f424 [project @ 1995-10-18 00:47:12 by jwe]
jwe
parents: 1358
diff changeset
905 }
1
78fd87e624cb [project @ 1993-08-08 01:13:40 by jwe]
jwe
parents:
diff changeset
906
1567
1da33230f424 [project @ 1995-10-18 00:47:12 by jwe]
jwe
parents: 1358
diff changeset
907 return result;
1
78fd87e624cb [project @ 1993-08-08 01:13:40 by jwe]
jwe
parents:
diff changeset
908 }
78fd87e624cb [project @ 1993-08-08 01:13:40 by jwe]
jwe
parents:
diff changeset
909
767
42731861ee09 [project @ 1994-10-05 21:26:54 by jwe]
jwe
parents: 453
diff changeset
910 // -*- 8 -*-
2086
bfb775fb6fe8 [project @ 1996-04-25 05:55:19 by jwe]
jwe
parents: 1996
diff changeset
911 octave_value
164
e2c950dd96d2 [project @ 1993-10-18 19:32:00 by jwe]
jwe
parents: 1
diff changeset
912 elem_xpow (const Complex& a, const ComplexMatrix& b)
1
78fd87e624cb [project @ 1993-08-08 01:13:40 by jwe]
jwe
parents:
diff changeset
913 {
5275
23b37da9fd5b [project @ 2005-04-08 16:07:35 by jwe]
jwe
parents: 5260
diff changeset
914 octave_idx_type nr = b.rows ();
23b37da9fd5b [project @ 2005-04-08 16:07:35 by jwe]
jwe
parents: 5260
diff changeset
915 octave_idx_type nc = b.cols ();
1
78fd87e624cb [project @ 1993-08-08 01:13:40 by jwe]
jwe
parents:
diff changeset
916
78fd87e624cb [project @ 1993-08-08 01:13:40 by jwe]
jwe
parents:
diff changeset
917 ComplexMatrix result (nr, nc);
5275
23b37da9fd5b [project @ 2005-04-08 16:07:35 by jwe]
jwe
parents: 5260
diff changeset
918
23b37da9fd5b [project @ 2005-04-08 16:07:35 by jwe]
jwe
parents: 5260
diff changeset
919 for (octave_idx_type j = 0; j < nc; j++)
23b37da9fd5b [project @ 2005-04-08 16:07:35 by jwe]
jwe
parents: 5260
diff changeset
920 for (octave_idx_type i = 0; i < nr; i++)
4153
6b96ce9f5743 [project @ 2002-11-06 20:38:49 by jwe]
jwe
parents: 4055
diff changeset
921 {
6b96ce9f5743 [project @ 2002-11-06 20:38:49 by jwe]
jwe
parents: 4055
diff changeset
922 OCTAVE_QUIT;
5260
deed800e7bef [project @ 2005-03-30 23:18:58 by jwe]
jwe
parents: 4790
diff changeset
923 result (i, j) = std::pow (a, b (i, j));
4153
6b96ce9f5743 [project @ 2002-11-06 20:38:49 by jwe]
jwe
parents: 4055
diff changeset
924 }
1
78fd87e624cb [project @ 1993-08-08 01:13:40 by jwe]
jwe
parents:
diff changeset
925
1567
1da33230f424 [project @ 1995-10-18 00:47:12 by jwe]
jwe
parents: 1358
diff changeset
926 return result;
1
78fd87e624cb [project @ 1993-08-08 01:13:40 by jwe]
jwe
parents:
diff changeset
927 }
78fd87e624cb [project @ 1993-08-08 01:13:40 by jwe]
jwe
parents:
diff changeset
928
9103
10bed8fbec99 optimize scalar .^ range operation
Jaroslav Hajek <highegg@gmail.com>
parents: 8979
diff changeset
929 octave_value
10bed8fbec99 optimize scalar .^ range operation
Jaroslav Hajek <highegg@gmail.com>
parents: 8979
diff changeset
930 elem_xpow (const Complex& a, const Range& r)
10bed8fbec99 optimize scalar .^ range operation
Jaroslav Hajek <highegg@gmail.com>
parents: 8979
diff changeset
931 {
10bed8fbec99 optimize scalar .^ range operation
Jaroslav Hajek <highegg@gmail.com>
parents: 8979
diff changeset
932 octave_value retval;
10bed8fbec99 optimize scalar .^ range operation
Jaroslav Hajek <highegg@gmail.com>
parents: 8979
diff changeset
933
10bed8fbec99 optimize scalar .^ range operation
Jaroslav Hajek <highegg@gmail.com>
parents: 8979
diff changeset
934 if (r.nelem () <= 0)
10bed8fbec99 optimize scalar .^ range operation
Jaroslav Hajek <highegg@gmail.com>
parents: 8979
diff changeset
935 retval = Matrix ();
10bed8fbec99 optimize scalar .^ range operation
Jaroslav Hajek <highegg@gmail.com>
parents: 8979
diff changeset
936 else
10bed8fbec99 optimize scalar .^ range operation
Jaroslav Hajek <highegg@gmail.com>
parents: 8979
diff changeset
937 {
10bed8fbec99 optimize scalar .^ range operation
Jaroslav Hajek <highegg@gmail.com>
parents: 8979
diff changeset
938 ComplexMatrix mat (1, r.nelem ());
10bed8fbec99 optimize scalar .^ range operation
Jaroslav Hajek <highegg@gmail.com>
parents: 8979
diff changeset
939 Complex *pmat = mat.fortran_vec ();
10bed8fbec99 optimize scalar .^ range operation
Jaroslav Hajek <highegg@gmail.com>
parents: 8979
diff changeset
940
10bed8fbec99 optimize scalar .^ range operation
Jaroslav Hajek <highegg@gmail.com>
parents: 8979
diff changeset
941 pmat[0] = std::pow (a, r.base ());
10bed8fbec99 optimize scalar .^ range operation
Jaroslav Hajek <highegg@gmail.com>
parents: 8979
diff changeset
942 Complex mul = std::pow (a, r.inc ());
10bed8fbec99 optimize scalar .^ range operation
Jaroslav Hajek <highegg@gmail.com>
parents: 8979
diff changeset
943 for (octave_idx_type i = 1; i < r.nelem (); i++)
10bed8fbec99 optimize scalar .^ range operation
Jaroslav Hajek <highegg@gmail.com>
parents: 8979
diff changeset
944 pmat[i] = pmat[i-1] * mul;
10bed8fbec99 optimize scalar .^ range operation
Jaroslav Hajek <highegg@gmail.com>
parents: 8979
diff changeset
945
10bed8fbec99 optimize scalar .^ range operation
Jaroslav Hajek <highegg@gmail.com>
parents: 8979
diff changeset
946 retval = mat;
10bed8fbec99 optimize scalar .^ range operation
Jaroslav Hajek <highegg@gmail.com>
parents: 8979
diff changeset
947 }
10bed8fbec99 optimize scalar .^ range operation
Jaroslav Hajek <highegg@gmail.com>
parents: 8979
diff changeset
948
10bed8fbec99 optimize scalar .^ range operation
Jaroslav Hajek <highegg@gmail.com>
parents: 8979
diff changeset
949 return retval;
10bed8fbec99 optimize scalar .^ range operation
Jaroslav Hajek <highegg@gmail.com>
parents: 8979
diff changeset
950 }
10bed8fbec99 optimize scalar .^ range operation
Jaroslav Hajek <highegg@gmail.com>
parents: 8979
diff changeset
951
767
42731861ee09 [project @ 1994-10-05 21:26:54 by jwe]
jwe
parents: 453
diff changeset
952 // -*- 9 -*-
2086
bfb775fb6fe8 [project @ 1996-04-25 05:55:19 by jwe]
jwe
parents: 1996
diff changeset
953 octave_value
164
e2c950dd96d2 [project @ 1993-10-18 19:32:00 by jwe]
jwe
parents: 1
diff changeset
954 elem_xpow (const ComplexMatrix& a, double b)
1
78fd87e624cb [project @ 1993-08-08 01:13:40 by jwe]
jwe
parents:
diff changeset
955 {
5275
23b37da9fd5b [project @ 2005-04-08 16:07:35 by jwe]
jwe
parents: 5260
diff changeset
956 octave_idx_type nr = a.rows ();
23b37da9fd5b [project @ 2005-04-08 16:07:35 by jwe]
jwe
parents: 5260
diff changeset
957 octave_idx_type nc = a.cols ();
1
78fd87e624cb [project @ 1993-08-08 01:13:40 by jwe]
jwe
parents:
diff changeset
958
78fd87e624cb [project @ 1993-08-08 01:13:40 by jwe]
jwe
parents:
diff changeset
959 ComplexMatrix result (nr, nc);
78fd87e624cb [project @ 1993-08-08 01:13:40 by jwe]
jwe
parents:
diff changeset
960
1567
1da33230f424 [project @ 1995-10-18 00:47:12 by jwe]
jwe
parents: 1358
diff changeset
961 if (xisint (b))
1da33230f424 [project @ 1995-10-18 00:47:12 by jwe]
jwe
parents: 1358
diff changeset
962 {
5275
23b37da9fd5b [project @ 2005-04-08 16:07:35 by jwe]
jwe
parents: 5260
diff changeset
963 for (octave_idx_type j = 0; j < nc; j++)
23b37da9fd5b [project @ 2005-04-08 16:07:35 by jwe]
jwe
parents: 5260
diff changeset
964 for (octave_idx_type i = 0; i < nr; i++)
4153
6b96ce9f5743 [project @ 2002-11-06 20:38:49 by jwe]
jwe
parents: 4055
diff changeset
965 {
6b96ce9f5743 [project @ 2002-11-06 20:38:49 by jwe]
jwe
parents: 4055
diff changeset
966 OCTAVE_QUIT;
5260
deed800e7bef [project @ 2005-03-30 23:18:58 by jwe]
jwe
parents: 4790
diff changeset
967 result (i, j) = std::pow (a (i, j), static_cast<int> (b));
4153
6b96ce9f5743 [project @ 2002-11-06 20:38:49 by jwe]
jwe
parents: 4055
diff changeset
968 }
1567
1da33230f424 [project @ 1995-10-18 00:47:12 by jwe]
jwe
parents: 1358
diff changeset
969 }
1da33230f424 [project @ 1995-10-18 00:47:12 by jwe]
jwe
parents: 1358
diff changeset
970 else
1da33230f424 [project @ 1995-10-18 00:47:12 by jwe]
jwe
parents: 1358
diff changeset
971 {
5275
23b37da9fd5b [project @ 2005-04-08 16:07:35 by jwe]
jwe
parents: 5260
diff changeset
972 for (octave_idx_type j = 0; j < nc; j++)
23b37da9fd5b [project @ 2005-04-08 16:07:35 by jwe]
jwe
parents: 5260
diff changeset
973 for (octave_idx_type i = 0; i < nr; i++)
4153
6b96ce9f5743 [project @ 2002-11-06 20:38:49 by jwe]
jwe
parents: 4055
diff changeset
974 {
6b96ce9f5743 [project @ 2002-11-06 20:38:49 by jwe]
jwe
parents: 4055
diff changeset
975 OCTAVE_QUIT;
5260
deed800e7bef [project @ 2005-03-30 23:18:58 by jwe]
jwe
parents: 4790
diff changeset
976 result (i, j) = std::pow (a (i, j), b);
4153
6b96ce9f5743 [project @ 2002-11-06 20:38:49 by jwe]
jwe
parents: 4055
diff changeset
977 }
1567
1da33230f424 [project @ 1995-10-18 00:47:12 by jwe]
jwe
parents: 1358
diff changeset
978 }
1da33230f424 [project @ 1995-10-18 00:47:12 by jwe]
jwe
parents: 1358
diff changeset
979
1da33230f424 [project @ 1995-10-18 00:47:12 by jwe]
jwe
parents: 1358
diff changeset
980 return result;
1
78fd87e624cb [project @ 1993-08-08 01:13:40 by jwe]
jwe
parents:
diff changeset
981 }
78fd87e624cb [project @ 1993-08-08 01:13:40 by jwe]
jwe
parents:
diff changeset
982
767
42731861ee09 [project @ 1994-10-05 21:26:54 by jwe]
jwe
parents: 453
diff changeset
983 // -*- 10 -*-
2086
bfb775fb6fe8 [project @ 1996-04-25 05:55:19 by jwe]
jwe
parents: 1996
diff changeset
984 octave_value
164
e2c950dd96d2 [project @ 1993-10-18 19:32:00 by jwe]
jwe
parents: 1
diff changeset
985 elem_xpow (const ComplexMatrix& a, const Matrix& b)
1
78fd87e624cb [project @ 1993-08-08 01:13:40 by jwe]
jwe
parents:
diff changeset
986 {
5275
23b37da9fd5b [project @ 2005-04-08 16:07:35 by jwe]
jwe
parents: 5260
diff changeset
987 octave_idx_type nr = a.rows ();
23b37da9fd5b [project @ 2005-04-08 16:07:35 by jwe]
jwe
parents: 5260
diff changeset
988 octave_idx_type nc = a.cols ();
2365
7c60f8a6e6a0 [project @ 1996-10-11 23:03:52 by jwe]
jwe
parents: 2305
diff changeset
989
5275
23b37da9fd5b [project @ 2005-04-08 16:07:35 by jwe]
jwe
parents: 5260
diff changeset
990 octave_idx_type b_nr = b.rows ();
23b37da9fd5b [project @ 2005-04-08 16:07:35 by jwe]
jwe
parents: 5260
diff changeset
991 octave_idx_type b_nc = b.cols ();
1
78fd87e624cb [project @ 1993-08-08 01:13:40 by jwe]
jwe
parents:
diff changeset
992
2365
7c60f8a6e6a0 [project @ 1996-10-11 23:03:52 by jwe]
jwe
parents: 2305
diff changeset
993 if (nr != b_nr || nc != b_nc)
7c60f8a6e6a0 [project @ 1996-10-11 23:03:52 by jwe]
jwe
parents: 2305
diff changeset
994 {
7c60f8a6e6a0 [project @ 1996-10-11 23:03:52 by jwe]
jwe
parents: 2305
diff changeset
995 gripe_nonconformant ("operator .^", nr, nc, b_nr, b_nc);
7c60f8a6e6a0 [project @ 1996-10-11 23:03:52 by jwe]
jwe
parents: 2305
diff changeset
996 return octave_value ();
7c60f8a6e6a0 [project @ 1996-10-11 23:03:52 by jwe]
jwe
parents: 2305
diff changeset
997 }
1
78fd87e624cb [project @ 1993-08-08 01:13:40 by jwe]
jwe
parents:
diff changeset
998
78fd87e624cb [project @ 1993-08-08 01:13:40 by jwe]
jwe
parents:
diff changeset
999 ComplexMatrix result (nr, nc);
5275
23b37da9fd5b [project @ 2005-04-08 16:07:35 by jwe]
jwe
parents: 5260
diff changeset
1000
23b37da9fd5b [project @ 2005-04-08 16:07:35 by jwe]
jwe
parents: 5260
diff changeset
1001 for (octave_idx_type j = 0; j < nc; j++)
23b37da9fd5b [project @ 2005-04-08 16:07:35 by jwe]
jwe
parents: 5260
diff changeset
1002 for (octave_idx_type i = 0; i < nr; i++)
1567
1da33230f424 [project @ 1995-10-18 00:47:12 by jwe]
jwe
parents: 1358
diff changeset
1003 {
4153
6b96ce9f5743 [project @ 2002-11-06 20:38:49 by jwe]
jwe
parents: 4055
diff changeset
1004 OCTAVE_QUIT;
2305
5a3f1d00a474 [project @ 1996-07-09 16:20:40 by jwe]
jwe
parents: 2086
diff changeset
1005 double btmp = b (i, j);
1567
1da33230f424 [project @ 1995-10-18 00:47:12 by jwe]
jwe
parents: 1358
diff changeset
1006 if (xisint (btmp))
5260
deed800e7bef [project @ 2005-03-30 23:18:58 by jwe]
jwe
parents: 4790
diff changeset
1007 result (i, j) = std::pow (a (i, j), static_cast<int> (btmp));
1567
1da33230f424 [project @ 1995-10-18 00:47:12 by jwe]
jwe
parents: 1358
diff changeset
1008 else
5260
deed800e7bef [project @ 2005-03-30 23:18:58 by jwe]
jwe
parents: 4790
diff changeset
1009 result (i, j) = std::pow (a (i, j), btmp);
1567
1da33230f424 [project @ 1995-10-18 00:47:12 by jwe]
jwe
parents: 1358
diff changeset
1010 }
1
78fd87e624cb [project @ 1993-08-08 01:13:40 by jwe]
jwe
parents:
diff changeset
1011
1567
1da33230f424 [project @ 1995-10-18 00:47:12 by jwe]
jwe
parents: 1358
diff changeset
1012 return result;
1
78fd87e624cb [project @ 1993-08-08 01:13:40 by jwe]
jwe
parents:
diff changeset
1013 }
78fd87e624cb [project @ 1993-08-08 01:13:40 by jwe]
jwe
parents:
diff changeset
1014
767
42731861ee09 [project @ 1994-10-05 21:26:54 by jwe]
jwe
parents: 453
diff changeset
1015 // -*- 11 -*-
2086
bfb775fb6fe8 [project @ 1996-04-25 05:55:19 by jwe]
jwe
parents: 1996
diff changeset
1016 octave_value
164
e2c950dd96d2 [project @ 1993-10-18 19:32:00 by jwe]
jwe
parents: 1
diff changeset
1017 elem_xpow (const ComplexMatrix& a, const Complex& b)
1
78fd87e624cb [project @ 1993-08-08 01:13:40 by jwe]
jwe
parents:
diff changeset
1018 {
5275
23b37da9fd5b [project @ 2005-04-08 16:07:35 by jwe]
jwe
parents: 5260
diff changeset
1019 octave_idx_type nr = a.rows ();
23b37da9fd5b [project @ 2005-04-08 16:07:35 by jwe]
jwe
parents: 5260
diff changeset
1020 octave_idx_type nc = a.cols ();
1
78fd87e624cb [project @ 1993-08-08 01:13:40 by jwe]
jwe
parents:
diff changeset
1021
78fd87e624cb [project @ 1993-08-08 01:13:40 by jwe]
jwe
parents:
diff changeset
1022 ComplexMatrix result (nr, nc);
5275
23b37da9fd5b [project @ 2005-04-08 16:07:35 by jwe]
jwe
parents: 5260
diff changeset
1023
23b37da9fd5b [project @ 2005-04-08 16:07:35 by jwe]
jwe
parents: 5260
diff changeset
1024 for (octave_idx_type j = 0; j < nc; j++)
23b37da9fd5b [project @ 2005-04-08 16:07:35 by jwe]
jwe
parents: 5260
diff changeset
1025 for (octave_idx_type i = 0; i < nr; i++)
4153
6b96ce9f5743 [project @ 2002-11-06 20:38:49 by jwe]
jwe
parents: 4055
diff changeset
1026 {
6b96ce9f5743 [project @ 2002-11-06 20:38:49 by jwe]
jwe
parents: 4055
diff changeset
1027 OCTAVE_QUIT;
5260
deed800e7bef [project @ 2005-03-30 23:18:58 by jwe]
jwe
parents: 4790
diff changeset
1028 result (i, j) = std::pow (a (i, j), b);
4153
6b96ce9f5743 [project @ 2002-11-06 20:38:49 by jwe]
jwe
parents: 4055
diff changeset
1029 }
1
78fd87e624cb [project @ 1993-08-08 01:13:40 by jwe]
jwe
parents:
diff changeset
1030
1567
1da33230f424 [project @ 1995-10-18 00:47:12 by jwe]
jwe
parents: 1358
diff changeset
1031 return result;
1
78fd87e624cb [project @ 1993-08-08 01:13:40 by jwe]
jwe
parents:
diff changeset
1032 }
78fd87e624cb [project @ 1993-08-08 01:13:40 by jwe]
jwe
parents:
diff changeset
1033
767
42731861ee09 [project @ 1994-10-05 21:26:54 by jwe]
jwe
parents: 453
diff changeset
1034 // -*- 12 -*-
2086
bfb775fb6fe8 [project @ 1996-04-25 05:55:19 by jwe]
jwe
parents: 1996
diff changeset
1035 octave_value
164
e2c950dd96d2 [project @ 1993-10-18 19:32:00 by jwe]
jwe
parents: 1
diff changeset
1036 elem_xpow (const ComplexMatrix& a, const ComplexMatrix& b)
1
78fd87e624cb [project @ 1993-08-08 01:13:40 by jwe]
jwe
parents:
diff changeset
1037 {
5275
23b37da9fd5b [project @ 2005-04-08 16:07:35 by jwe]
jwe
parents: 5260
diff changeset
1038 octave_idx_type nr = a.rows ();
23b37da9fd5b [project @ 2005-04-08 16:07:35 by jwe]
jwe
parents: 5260
diff changeset
1039 octave_idx_type nc = a.cols ();
2365
7c60f8a6e6a0 [project @ 1996-10-11 23:03:52 by jwe]
jwe
parents: 2305
diff changeset
1040
5275
23b37da9fd5b [project @ 2005-04-08 16:07:35 by jwe]
jwe
parents: 5260
diff changeset
1041 octave_idx_type b_nr = b.rows ();
23b37da9fd5b [project @ 2005-04-08 16:07:35 by jwe]
jwe
parents: 5260
diff changeset
1042 octave_idx_type b_nc = b.cols ();
2365
7c60f8a6e6a0 [project @ 1996-10-11 23:03:52 by jwe]
jwe
parents: 2305
diff changeset
1043
7c60f8a6e6a0 [project @ 1996-10-11 23:03:52 by jwe]
jwe
parents: 2305
diff changeset
1044 if (nr != b_nr || nc != b_nc)
7c60f8a6e6a0 [project @ 1996-10-11 23:03:52 by jwe]
jwe
parents: 2305
diff changeset
1045 {
7c60f8a6e6a0 [project @ 1996-10-11 23:03:52 by jwe]
jwe
parents: 2305
diff changeset
1046 gripe_nonconformant ("operator .^", nr, nc, b_nr, b_nc);
7c60f8a6e6a0 [project @ 1996-10-11 23:03:52 by jwe]
jwe
parents: 2305
diff changeset
1047 return octave_value ();
7c60f8a6e6a0 [project @ 1996-10-11 23:03:52 by jwe]
jwe
parents: 2305
diff changeset
1048 }
1
78fd87e624cb [project @ 1993-08-08 01:13:40 by jwe]
jwe
parents:
diff changeset
1049
78fd87e624cb [project @ 1993-08-08 01:13:40 by jwe]
jwe
parents:
diff changeset
1050 ComplexMatrix result (nr, nc);
5275
23b37da9fd5b [project @ 2005-04-08 16:07:35 by jwe]
jwe
parents: 5260
diff changeset
1051
23b37da9fd5b [project @ 2005-04-08 16:07:35 by jwe]
jwe
parents: 5260
diff changeset
1052 for (octave_idx_type j = 0; j < nc; j++)
23b37da9fd5b [project @ 2005-04-08 16:07:35 by jwe]
jwe
parents: 5260
diff changeset
1053 for (octave_idx_type i = 0; i < nr; i++)
4153
6b96ce9f5743 [project @ 2002-11-06 20:38:49 by jwe]
jwe
parents: 4055
diff changeset
1054 {
6b96ce9f5743 [project @ 2002-11-06 20:38:49 by jwe]
jwe
parents: 4055
diff changeset
1055 OCTAVE_QUIT;
5260
deed800e7bef [project @ 2005-03-30 23:18:58 by jwe]
jwe
parents: 4790
diff changeset
1056 result (i, j) = std::pow (a (i, j), b (i, j));
4153
6b96ce9f5743 [project @ 2002-11-06 20:38:49 by jwe]
jwe
parents: 4055
diff changeset
1057 }
1
78fd87e624cb [project @ 1993-08-08 01:13:40 by jwe]
jwe
parents:
diff changeset
1058
1567
1da33230f424 [project @ 1995-10-18 00:47:12 by jwe]
jwe
parents: 1358
diff changeset
1059 return result;
1
78fd87e624cb [project @ 1993-08-08 01:13:40 by jwe]
jwe
parents:
diff changeset
1060 }
78fd87e624cb [project @ 1993-08-08 01:13:40 by jwe]
jwe
parents:
diff changeset
1061
4543
79df15d4470c [project @ 2003-10-18 03:53:52 by jwe]
jwe
parents: 4153
diff changeset
1062 // Safer pow functions that work elementwise for N-d arrays.
79df15d4470c [project @ 2003-10-18 03:53:52 by jwe]
jwe
parents: 4153
diff changeset
1063 //
79df15d4470c [project @ 2003-10-18 03:53:52 by jwe]
jwe
parents: 4153
diff changeset
1064 // op2 \ op1: s nd cs cnd
79df15d4470c [project @ 2003-10-18 03:53:52 by jwe]
jwe
parents: 4153
diff changeset
1065 // +-- +---+---+----+----+
79df15d4470c [project @ 2003-10-18 03:53:52 by jwe]
jwe
parents: 4153
diff changeset
1066 // scalar | | * | 3 | * | 9 |
79df15d4470c [project @ 2003-10-18 03:53:52 by jwe]
jwe
parents: 4153
diff changeset
1067 // +---+---+----+----+
79df15d4470c [project @ 2003-10-18 03:53:52 by jwe]
jwe
parents: 4153
diff changeset
1068 // N_d | 1 | 4 | 7 | 10 |
79df15d4470c [project @ 2003-10-18 03:53:52 by jwe]
jwe
parents: 4153
diff changeset
1069 // +---+---+----+----+
79df15d4470c [project @ 2003-10-18 03:53:52 by jwe]
jwe
parents: 4153
diff changeset
1070 // complex_scalar | * | 5 | * | 11 |
79df15d4470c [project @ 2003-10-18 03:53:52 by jwe]
jwe
parents: 4153
diff changeset
1071 // +---+---+----+----+
79df15d4470c [project @ 2003-10-18 03:53:52 by jwe]
jwe
parents: 4153
diff changeset
1072 // complex_N_d | 2 | 6 | 8 | 12 |
79df15d4470c [project @ 2003-10-18 03:53:52 by jwe]
jwe
parents: 4153
diff changeset
1073 // +---+---+----+----+
79df15d4470c [project @ 2003-10-18 03:53:52 by jwe]
jwe
parents: 4153
diff changeset
1074 //
79df15d4470c [project @ 2003-10-18 03:53:52 by jwe]
jwe
parents: 4153
diff changeset
1075 // * -> not needed.
79df15d4470c [project @ 2003-10-18 03:53:52 by jwe]
jwe
parents: 4153
diff changeset
1076
5775
ace8d8d26933 [project @ 2006-04-24 19:13:06 by jwe]
jwe
parents: 5667
diff changeset
1077 // FIXME -- these functions need to be fixed so that things
4543
79df15d4470c [project @ 2003-10-18 03:53:52 by jwe]
jwe
parents: 4153
diff changeset
1078 // like
79df15d4470c [project @ 2003-10-18 03:53:52 by jwe]
jwe
parents: 4153
diff changeset
1079 //
79df15d4470c [project @ 2003-10-18 03:53:52 by jwe]
jwe
parents: 4153
diff changeset
1080 // a = -1; b = [ 0, 0.5, 1 ]; r = a .^ b
79df15d4470c [project @ 2003-10-18 03:53:52 by jwe]
jwe
parents: 4153
diff changeset
1081 //
79df15d4470c [project @ 2003-10-18 03:53:52 by jwe]
jwe
parents: 4153
diff changeset
1082 // and
79df15d4470c [project @ 2003-10-18 03:53:52 by jwe]
jwe
parents: 4153
diff changeset
1083 //
79df15d4470c [project @ 2003-10-18 03:53:52 by jwe]
jwe
parents: 4153
diff changeset
1084 // a = -1; b = [ 0, 0.5, 1 ]; for i = 1:3, r(i) = a .^ b(i), end
79df15d4470c [project @ 2003-10-18 03:53:52 by jwe]
jwe
parents: 4153
diff changeset
1085 //
79df15d4470c [project @ 2003-10-18 03:53:52 by jwe]
jwe
parents: 4153
diff changeset
1086 // produce identical results. Also, it would be nice if -1^0.5
79df15d4470c [project @ 2003-10-18 03:53:52 by jwe]
jwe
parents: 4153
diff changeset
1087 // produced a pure imaginary result instead of a complex number with a
79df15d4470c [project @ 2003-10-18 03:53:52 by jwe]
jwe
parents: 4153
diff changeset
1088 // small real part. But perhaps that's really a problem with the math
79df15d4470c [project @ 2003-10-18 03:53:52 by jwe]
jwe
parents: 4153
diff changeset
1089 // library...
79df15d4470c [project @ 2003-10-18 03:53:52 by jwe]
jwe
parents: 4153
diff changeset
1090
79df15d4470c [project @ 2003-10-18 03:53:52 by jwe]
jwe
parents: 4153
diff changeset
1091 // -*- 1 -*-
79df15d4470c [project @ 2003-10-18 03:53:52 by jwe]
jwe
parents: 4153
diff changeset
1092 octave_value
79df15d4470c [project @ 2003-10-18 03:53:52 by jwe]
jwe
parents: 4153
diff changeset
1093 elem_xpow (double a, const NDArray& b)
79df15d4470c [project @ 2003-10-18 03:53:52 by jwe]
jwe
parents: 4153
diff changeset
1094 {
79df15d4470c [project @ 2003-10-18 03:53:52 by jwe]
jwe
parents: 4153
diff changeset
1095 octave_value retval;
79df15d4470c [project @ 2003-10-18 03:53:52 by jwe]
jwe
parents: 4153
diff changeset
1096
79df15d4470c [project @ 2003-10-18 03:53:52 by jwe]
jwe
parents: 4153
diff changeset
1097 double d1, d2;
79df15d4470c [project @ 2003-10-18 03:53:52 by jwe]
jwe
parents: 4153
diff changeset
1098
79df15d4470c [project @ 2003-10-18 03:53:52 by jwe]
jwe
parents: 4153
diff changeset
1099 if (a < 0.0 && ! b.all_integers (d1, d2))
79df15d4470c [project @ 2003-10-18 03:53:52 by jwe]
jwe
parents: 4153
diff changeset
1100 {
79df15d4470c [project @ 2003-10-18 03:53:52 by jwe]
jwe
parents: 4153
diff changeset
1101 Complex atmp (a);
79df15d4470c [project @ 2003-10-18 03:53:52 by jwe]
jwe
parents: 4153
diff changeset
1102 ComplexNDArray result (b.dims ());
5275
23b37da9fd5b [project @ 2005-04-08 16:07:35 by jwe]
jwe
parents: 5260
diff changeset
1103 for (octave_idx_type i = 0; i < b.length (); i++)
4543
79df15d4470c [project @ 2003-10-18 03:53:52 by jwe]
jwe
parents: 4153
diff changeset
1104 {
79df15d4470c [project @ 2003-10-18 03:53:52 by jwe]
jwe
parents: 4153
diff changeset
1105 OCTAVE_QUIT;
5260
deed800e7bef [project @ 2005-03-30 23:18:58 by jwe]
jwe
parents: 4790
diff changeset
1106 result(i) = std::pow (atmp, b(i));
4543
79df15d4470c [project @ 2003-10-18 03:53:52 by jwe]
jwe
parents: 4153
diff changeset
1107 }
79df15d4470c [project @ 2003-10-18 03:53:52 by jwe]
jwe
parents: 4153
diff changeset
1108
79df15d4470c [project @ 2003-10-18 03:53:52 by jwe]
jwe
parents: 4153
diff changeset
1109 retval = result;
79df15d4470c [project @ 2003-10-18 03:53:52 by jwe]
jwe
parents: 4153
diff changeset
1110 }
79df15d4470c [project @ 2003-10-18 03:53:52 by jwe]
jwe
parents: 4153
diff changeset
1111 else
79df15d4470c [project @ 2003-10-18 03:53:52 by jwe]
jwe
parents: 4153
diff changeset
1112 {
79df15d4470c [project @ 2003-10-18 03:53:52 by jwe]
jwe
parents: 4153
diff changeset
1113 NDArray result (b.dims ());
5275
23b37da9fd5b [project @ 2005-04-08 16:07:35 by jwe]
jwe
parents: 5260
diff changeset
1114 for (octave_idx_type i = 0; i < b.length (); i++)
4543
79df15d4470c [project @ 2003-10-18 03:53:52 by jwe]
jwe
parents: 4153
diff changeset
1115 {
79df15d4470c [project @ 2003-10-18 03:53:52 by jwe]
jwe
parents: 4153
diff changeset
1116 OCTAVE_QUIT;
5260
deed800e7bef [project @ 2005-03-30 23:18:58 by jwe]
jwe
parents: 4790
diff changeset
1117 result (i) = std::pow (a, b(i));
4543
79df15d4470c [project @ 2003-10-18 03:53:52 by jwe]
jwe
parents: 4153
diff changeset
1118 }
79df15d4470c [project @ 2003-10-18 03:53:52 by jwe]
jwe
parents: 4153
diff changeset
1119
79df15d4470c [project @ 2003-10-18 03:53:52 by jwe]
jwe
parents: 4153
diff changeset
1120 retval = result;
79df15d4470c [project @ 2003-10-18 03:53:52 by jwe]
jwe
parents: 4153
diff changeset
1121 }
79df15d4470c [project @ 2003-10-18 03:53:52 by jwe]
jwe
parents: 4153
diff changeset
1122
79df15d4470c [project @ 2003-10-18 03:53:52 by jwe]
jwe
parents: 4153
diff changeset
1123 return retval;
79df15d4470c [project @ 2003-10-18 03:53:52 by jwe]
jwe
parents: 4153
diff changeset
1124 }
79df15d4470c [project @ 2003-10-18 03:53:52 by jwe]
jwe
parents: 4153
diff changeset
1125
79df15d4470c [project @ 2003-10-18 03:53:52 by jwe]
jwe
parents: 4153
diff changeset
1126 // -*- 2 -*-
79df15d4470c [project @ 2003-10-18 03:53:52 by jwe]
jwe
parents: 4153
diff changeset
1127 octave_value
79df15d4470c [project @ 2003-10-18 03:53:52 by jwe]
jwe
parents: 4153
diff changeset
1128 elem_xpow (double a, const ComplexNDArray& b)
79df15d4470c [project @ 2003-10-18 03:53:52 by jwe]
jwe
parents: 4153
diff changeset
1129 {
79df15d4470c [project @ 2003-10-18 03:53:52 by jwe]
jwe
parents: 4153
diff changeset
1130 ComplexNDArray result (b.dims ());
79df15d4470c [project @ 2003-10-18 03:53:52 by jwe]
jwe
parents: 4153
diff changeset
1131 Complex atmp (a);
5275
23b37da9fd5b [project @ 2005-04-08 16:07:35 by jwe]
jwe
parents: 5260
diff changeset
1132
23b37da9fd5b [project @ 2005-04-08 16:07:35 by jwe]
jwe
parents: 5260
diff changeset
1133 for (octave_idx_type i = 0; i < b.length (); i++)
4543
79df15d4470c [project @ 2003-10-18 03:53:52 by jwe]
jwe
parents: 4153
diff changeset
1134 {
79df15d4470c [project @ 2003-10-18 03:53:52 by jwe]
jwe
parents: 4153
diff changeset
1135 OCTAVE_QUIT;
5260
deed800e7bef [project @ 2005-03-30 23:18:58 by jwe]
jwe
parents: 4790
diff changeset
1136 result(i) = std::pow (atmp, b(i));
4543
79df15d4470c [project @ 2003-10-18 03:53:52 by jwe]
jwe
parents: 4153
diff changeset
1137 }
79df15d4470c [project @ 2003-10-18 03:53:52 by jwe]
jwe
parents: 4153
diff changeset
1138
79df15d4470c [project @ 2003-10-18 03:53:52 by jwe]
jwe
parents: 4153
diff changeset
1139 return result;
79df15d4470c [project @ 2003-10-18 03:53:52 by jwe]
jwe
parents: 4153
diff changeset
1140 }
79df15d4470c [project @ 2003-10-18 03:53:52 by jwe]
jwe
parents: 4153
diff changeset
1141
79df15d4470c [project @ 2003-10-18 03:53:52 by jwe]
jwe
parents: 4153
diff changeset
1142 // -*- 3 -*-
79df15d4470c [project @ 2003-10-18 03:53:52 by jwe]
jwe
parents: 4153
diff changeset
1143 octave_value
79df15d4470c [project @ 2003-10-18 03:53:52 by jwe]
jwe
parents: 4153
diff changeset
1144 elem_xpow (const NDArray& a, double b)
79df15d4470c [project @ 2003-10-18 03:53:52 by jwe]
jwe
parents: 4153
diff changeset
1145 {
79df15d4470c [project @ 2003-10-18 03:53:52 by jwe]
jwe
parents: 4153
diff changeset
1146 octave_value retval;
79df15d4470c [project @ 2003-10-18 03:53:52 by jwe]
jwe
parents: 4153
diff changeset
1147
8978
0a58c4cd1405 optimize element-wise power
Jaroslav Hajek <highegg@gmail.com>
parents: 8960
diff changeset
1148 if (! xisint (b))
4543
79df15d4470c [project @ 2003-10-18 03:53:52 by jwe]
jwe
parents: 4153
diff changeset
1149 {
8978
0a58c4cd1405 optimize element-wise power
Jaroslav Hajek <highegg@gmail.com>
parents: 8960
diff changeset
1150 if (a.any_element_is_negative ())
0a58c4cd1405 optimize element-wise power
Jaroslav Hajek <highegg@gmail.com>
parents: 8960
diff changeset
1151 {
0a58c4cd1405 optimize element-wise power
Jaroslav Hajek <highegg@gmail.com>
parents: 8960
diff changeset
1152 ComplexNDArray result (a.dims ());
0a58c4cd1405 optimize element-wise power
Jaroslav Hajek <highegg@gmail.com>
parents: 8960
diff changeset
1153
0a58c4cd1405 optimize element-wise power
Jaroslav Hajek <highegg@gmail.com>
parents: 8960
diff changeset
1154 for (octave_idx_type i = 0; i < a.length (); i++)
0a58c4cd1405 optimize element-wise power
Jaroslav Hajek <highegg@gmail.com>
parents: 8960
diff changeset
1155 {
0a58c4cd1405 optimize element-wise power
Jaroslav Hajek <highegg@gmail.com>
parents: 8960
diff changeset
1156 OCTAVE_QUIT;
0a58c4cd1405 optimize element-wise power
Jaroslav Hajek <highegg@gmail.com>
parents: 8960
diff changeset
1157
0a58c4cd1405 optimize element-wise power
Jaroslav Hajek <highegg@gmail.com>
parents: 8960
diff changeset
1158 Complex atmp (a (i));
0a58c4cd1405 optimize element-wise power
Jaroslav Hajek <highegg@gmail.com>
parents: 8960
diff changeset
1159
0a58c4cd1405 optimize element-wise power
Jaroslav Hajek <highegg@gmail.com>
parents: 8960
diff changeset
1160 result(i) = std::pow (atmp, b);
0a58c4cd1405 optimize element-wise power
Jaroslav Hajek <highegg@gmail.com>
parents: 8960
diff changeset
1161 }
0a58c4cd1405 optimize element-wise power
Jaroslav Hajek <highegg@gmail.com>
parents: 8960
diff changeset
1162
0a58c4cd1405 optimize element-wise power
Jaroslav Hajek <highegg@gmail.com>
parents: 8960
diff changeset
1163 retval = result;
0a58c4cd1405 optimize element-wise power
Jaroslav Hajek <highegg@gmail.com>
parents: 8960
diff changeset
1164 }
0a58c4cd1405 optimize element-wise power
Jaroslav Hajek <highegg@gmail.com>
parents: 8960
diff changeset
1165 else
0a58c4cd1405 optimize element-wise power
Jaroslav Hajek <highegg@gmail.com>
parents: 8960
diff changeset
1166 {
0a58c4cd1405 optimize element-wise power
Jaroslav Hajek <highegg@gmail.com>
parents: 8960
diff changeset
1167 NDArray result (a.dims ());
0a58c4cd1405 optimize element-wise power
Jaroslav Hajek <highegg@gmail.com>
parents: 8960
diff changeset
1168 for (octave_idx_type i = 0; i < a.length (); i++)
0a58c4cd1405 optimize element-wise power
Jaroslav Hajek <highegg@gmail.com>
parents: 8960
diff changeset
1169 {
0a58c4cd1405 optimize element-wise power
Jaroslav Hajek <highegg@gmail.com>
parents: 8960
diff changeset
1170 OCTAVE_QUIT;
0a58c4cd1405 optimize element-wise power
Jaroslav Hajek <highegg@gmail.com>
parents: 8960
diff changeset
1171 result(i) = std::pow (a(i), b);
0a58c4cd1405 optimize element-wise power
Jaroslav Hajek <highegg@gmail.com>
parents: 8960
diff changeset
1172 }
0a58c4cd1405 optimize element-wise power
Jaroslav Hajek <highegg@gmail.com>
parents: 8960
diff changeset
1173
0a58c4cd1405 optimize element-wise power
Jaroslav Hajek <highegg@gmail.com>
parents: 8960
diff changeset
1174 retval = result;
0a58c4cd1405 optimize element-wise power
Jaroslav Hajek <highegg@gmail.com>
parents: 8960
diff changeset
1175 }
4543
79df15d4470c [project @ 2003-10-18 03:53:52 by jwe]
jwe
parents: 4153
diff changeset
1176 }
79df15d4470c [project @ 2003-10-18 03:53:52 by jwe]
jwe
parents: 4153
diff changeset
1177 else
79df15d4470c [project @ 2003-10-18 03:53:52 by jwe]
jwe
parents: 4153
diff changeset
1178 {
79df15d4470c [project @ 2003-10-18 03:53:52 by jwe]
jwe
parents: 4153
diff changeset
1179 NDArray result (a.dims ());
79df15d4470c [project @ 2003-10-18 03:53:52 by jwe]
jwe
parents: 4153
diff changeset
1180
8978
0a58c4cd1405 optimize element-wise power
Jaroslav Hajek <highegg@gmail.com>
parents: 8960
diff changeset
1181 int ib = static_cast<int> (b);
0a58c4cd1405 optimize element-wise power
Jaroslav Hajek <highegg@gmail.com>
parents: 8960
diff changeset
1182 if (ib == 2)
0a58c4cd1405 optimize element-wise power
Jaroslav Hajek <highegg@gmail.com>
parents: 8960
diff changeset
1183 {
0a58c4cd1405 optimize element-wise power
Jaroslav Hajek <highegg@gmail.com>
parents: 8960
diff changeset
1184 for (octave_idx_type i = 0; i < a.length (); i++)
0a58c4cd1405 optimize element-wise power
Jaroslav Hajek <highegg@gmail.com>
parents: 8960
diff changeset
1185 result.xelem (i) = a(i) * a(i);
0a58c4cd1405 optimize element-wise power
Jaroslav Hajek <highegg@gmail.com>
parents: 8960
diff changeset
1186 }
8979
a7c00773a089 optimize also .^-1 case
Jaroslav Hajek <highegg@gmail.com>
parents: 8978
diff changeset
1187 else if (ib == -1)
a7c00773a089 optimize also .^-1 case
Jaroslav Hajek <highegg@gmail.com>
parents: 8978
diff changeset
1188 {
a7c00773a089 optimize also .^-1 case
Jaroslav Hajek <highegg@gmail.com>
parents: 8978
diff changeset
1189 for (octave_idx_type i = 0; i < a.length (); i++)
a7c00773a089 optimize also .^-1 case
Jaroslav Hajek <highegg@gmail.com>
parents: 8978
diff changeset
1190 result.xelem (i) = 1.0 / a(i);
a7c00773a089 optimize also .^-1 case
Jaroslav Hajek <highegg@gmail.com>
parents: 8978
diff changeset
1191 }
8978
0a58c4cd1405 optimize element-wise power
Jaroslav Hajek <highegg@gmail.com>
parents: 8960
diff changeset
1192 else
0a58c4cd1405 optimize element-wise power
Jaroslav Hajek <highegg@gmail.com>
parents: 8960
diff changeset
1193 {
0a58c4cd1405 optimize element-wise power
Jaroslav Hajek <highegg@gmail.com>
parents: 8960
diff changeset
1194 for (octave_idx_type i = 0; i < a.length (); i++)
0a58c4cd1405 optimize element-wise power
Jaroslav Hajek <highegg@gmail.com>
parents: 8960
diff changeset
1195 {
0a58c4cd1405 optimize element-wise power
Jaroslav Hajek <highegg@gmail.com>
parents: 8960
diff changeset
1196 OCTAVE_QUIT;
0a58c4cd1405 optimize element-wise power
Jaroslav Hajek <highegg@gmail.com>
parents: 8960
diff changeset
1197 result(i) = std::pow (a(i), ib);
0a58c4cd1405 optimize element-wise power
Jaroslav Hajek <highegg@gmail.com>
parents: 8960
diff changeset
1198 }
0a58c4cd1405 optimize element-wise power
Jaroslav Hajek <highegg@gmail.com>
parents: 8960
diff changeset
1199 }
4543
79df15d4470c [project @ 2003-10-18 03:53:52 by jwe]
jwe
parents: 4153
diff changeset
1200
79df15d4470c [project @ 2003-10-18 03:53:52 by jwe]
jwe
parents: 4153
diff changeset
1201 retval = result;
79df15d4470c [project @ 2003-10-18 03:53:52 by jwe]
jwe
parents: 4153
diff changeset
1202 }
79df15d4470c [project @ 2003-10-18 03:53:52 by jwe]
jwe
parents: 4153
diff changeset
1203
79df15d4470c [project @ 2003-10-18 03:53:52 by jwe]
jwe
parents: 4153
diff changeset
1204 return retval;
79df15d4470c [project @ 2003-10-18 03:53:52 by jwe]
jwe
parents: 4153
diff changeset
1205 }
79df15d4470c [project @ 2003-10-18 03:53:52 by jwe]
jwe
parents: 4153
diff changeset
1206
79df15d4470c [project @ 2003-10-18 03:53:52 by jwe]
jwe
parents: 4153
diff changeset
1207 // -*- 4 -*-
79df15d4470c [project @ 2003-10-18 03:53:52 by jwe]
jwe
parents: 4153
diff changeset
1208 octave_value
79df15d4470c [project @ 2003-10-18 03:53:52 by jwe]
jwe
parents: 4153
diff changeset
1209 elem_xpow (const NDArray& a, const NDArray& b)
79df15d4470c [project @ 2003-10-18 03:53:52 by jwe]
jwe
parents: 4153
diff changeset
1210 {
79df15d4470c [project @ 2003-10-18 03:53:52 by jwe]
jwe
parents: 4153
diff changeset
1211 octave_value retval;
79df15d4470c [project @ 2003-10-18 03:53:52 by jwe]
jwe
parents: 4153
diff changeset
1212
79df15d4470c [project @ 2003-10-18 03:53:52 by jwe]
jwe
parents: 4153
diff changeset
1213 dim_vector a_dims = a.dims ();
79df15d4470c [project @ 2003-10-18 03:53:52 by jwe]
jwe
parents: 4153
diff changeset
1214 dim_vector b_dims = b.dims ();
79df15d4470c [project @ 2003-10-18 03:53:52 by jwe]
jwe
parents: 4153
diff changeset
1215
79df15d4470c [project @ 2003-10-18 03:53:52 by jwe]
jwe
parents: 4153
diff changeset
1216 if (a_dims != b_dims)
79df15d4470c [project @ 2003-10-18 03:53:52 by jwe]
jwe
parents: 4153
diff changeset
1217 {
79df15d4470c [project @ 2003-10-18 03:53:52 by jwe]
jwe
parents: 4153
diff changeset
1218 gripe_nonconformant ("operator .^", a_dims, b_dims);
79df15d4470c [project @ 2003-10-18 03:53:52 by jwe]
jwe
parents: 4153
diff changeset
1219 return octave_value ();
79df15d4470c [project @ 2003-10-18 03:53:52 by jwe]
jwe
parents: 4153
diff changeset
1220 }
79df15d4470c [project @ 2003-10-18 03:53:52 by jwe]
jwe
parents: 4153
diff changeset
1221
79df15d4470c [project @ 2003-10-18 03:53:52 by jwe]
jwe
parents: 4153
diff changeset
1222 int len = a.length ();
79df15d4470c [project @ 2003-10-18 03:53:52 by jwe]
jwe
parents: 4153
diff changeset
1223
79df15d4470c [project @ 2003-10-18 03:53:52 by jwe]
jwe
parents: 4153
diff changeset
1224 bool convert_to_complex = false;
79df15d4470c [project @ 2003-10-18 03:53:52 by jwe]
jwe
parents: 4153
diff changeset
1225
5275
23b37da9fd5b [project @ 2005-04-08 16:07:35 by jwe]
jwe
parents: 5260
diff changeset
1226 for (octave_idx_type i = 0; i < len; i++)
4543
79df15d4470c [project @ 2003-10-18 03:53:52 by jwe]
jwe
parents: 4153
diff changeset
1227 {
79df15d4470c [project @ 2003-10-18 03:53:52 by jwe]
jwe
parents: 4153
diff changeset
1228 OCTAVE_QUIT;
79df15d4470c [project @ 2003-10-18 03:53:52 by jwe]
jwe
parents: 4153
diff changeset
1229 double atmp = a(i);
79df15d4470c [project @ 2003-10-18 03:53:52 by jwe]
jwe
parents: 4153
diff changeset
1230 double btmp = b(i);
79df15d4470c [project @ 2003-10-18 03:53:52 by jwe]
jwe
parents: 4153
diff changeset
1231 if (atmp < 0.0 && static_cast<int> (btmp) != btmp)
79df15d4470c [project @ 2003-10-18 03:53:52 by jwe]
jwe
parents: 4153
diff changeset
1232 {
79df15d4470c [project @ 2003-10-18 03:53:52 by jwe]
jwe
parents: 4153
diff changeset
1233 convert_to_complex = true;
79df15d4470c [project @ 2003-10-18 03:53:52 by jwe]
jwe
parents: 4153
diff changeset
1234 goto done;
79df15d4470c [project @ 2003-10-18 03:53:52 by jwe]
jwe
parents: 4153
diff changeset
1235 }
79df15d4470c [project @ 2003-10-18 03:53:52 by jwe]
jwe
parents: 4153
diff changeset
1236 }
79df15d4470c [project @ 2003-10-18 03:53:52 by jwe]
jwe
parents: 4153
diff changeset
1237
79df15d4470c [project @ 2003-10-18 03:53:52 by jwe]
jwe
parents: 4153
diff changeset
1238 done:
79df15d4470c [project @ 2003-10-18 03:53:52 by jwe]
jwe
parents: 4153
diff changeset
1239
79df15d4470c [project @ 2003-10-18 03:53:52 by jwe]
jwe
parents: 4153
diff changeset
1240 if (convert_to_complex)
79df15d4470c [project @ 2003-10-18 03:53:52 by jwe]
jwe
parents: 4153
diff changeset
1241 {
79df15d4470c [project @ 2003-10-18 03:53:52 by jwe]
jwe
parents: 4153
diff changeset
1242 ComplexNDArray complex_result (a_dims);
79df15d4470c [project @ 2003-10-18 03:53:52 by jwe]
jwe
parents: 4153
diff changeset
1243
5275
23b37da9fd5b [project @ 2005-04-08 16:07:35 by jwe]
jwe
parents: 5260
diff changeset
1244 for (octave_idx_type i = 0; i < len; i++)
4543
79df15d4470c [project @ 2003-10-18 03:53:52 by jwe]
jwe
parents: 4153
diff changeset
1245 {
79df15d4470c [project @ 2003-10-18 03:53:52 by jwe]
jwe
parents: 4153
diff changeset
1246 OCTAVE_QUIT;
5665
d42bd103de79 [project @ 2006-03-14 19:13:40 by jwe]
jwe
parents: 5664
diff changeset
1247 Complex atmp (a(i));
d42bd103de79 [project @ 2006-03-14 19:13:40 by jwe]
jwe
parents: 5664
diff changeset
1248 Complex btmp (b(i));
d42bd103de79 [project @ 2006-03-14 19:13:40 by jwe]
jwe
parents: 5664
diff changeset
1249 complex_result(i) = std::pow (atmp, btmp);
4543
79df15d4470c [project @ 2003-10-18 03:53:52 by jwe]
jwe
parents: 4153
diff changeset
1250 }
79df15d4470c [project @ 2003-10-18 03:53:52 by jwe]
jwe
parents: 4153
diff changeset
1251
79df15d4470c [project @ 2003-10-18 03:53:52 by jwe]
jwe
parents: 4153
diff changeset
1252 retval = complex_result;
79df15d4470c [project @ 2003-10-18 03:53:52 by jwe]
jwe
parents: 4153
diff changeset
1253 }
79df15d4470c [project @ 2003-10-18 03:53:52 by jwe]
jwe
parents: 4153
diff changeset
1254 else
79df15d4470c [project @ 2003-10-18 03:53:52 by jwe]
jwe
parents: 4153
diff changeset
1255 {
79df15d4470c [project @ 2003-10-18 03:53:52 by jwe]
jwe
parents: 4153
diff changeset
1256 NDArray result (a_dims);
79df15d4470c [project @ 2003-10-18 03:53:52 by jwe]
jwe
parents: 4153
diff changeset
1257
5275
23b37da9fd5b [project @ 2005-04-08 16:07:35 by jwe]
jwe
parents: 5260
diff changeset
1258 for (octave_idx_type i = 0; i < len; i++)
4543
79df15d4470c [project @ 2003-10-18 03:53:52 by jwe]
jwe
parents: 4153
diff changeset
1259 {
79df15d4470c [project @ 2003-10-18 03:53:52 by jwe]
jwe
parents: 4153
diff changeset
1260 OCTAVE_QUIT;
5260
deed800e7bef [project @ 2005-03-30 23:18:58 by jwe]
jwe
parents: 4790
diff changeset
1261 result(i) = std::pow (a(i), b(i));
4543
79df15d4470c [project @ 2003-10-18 03:53:52 by jwe]
jwe
parents: 4153
diff changeset
1262 }
79df15d4470c [project @ 2003-10-18 03:53:52 by jwe]
jwe
parents: 4153
diff changeset
1263
79df15d4470c [project @ 2003-10-18 03:53:52 by jwe]
jwe
parents: 4153
diff changeset
1264 retval = result;
79df15d4470c [project @ 2003-10-18 03:53:52 by jwe]
jwe
parents: 4153
diff changeset
1265 }
79df15d4470c [project @ 2003-10-18 03:53:52 by jwe]
jwe
parents: 4153
diff changeset
1266
79df15d4470c [project @ 2003-10-18 03:53:52 by jwe]
jwe
parents: 4153
diff changeset
1267 return retval;
79df15d4470c [project @ 2003-10-18 03:53:52 by jwe]
jwe
parents: 4153
diff changeset
1268 }
79df15d4470c [project @ 2003-10-18 03:53:52 by jwe]
jwe
parents: 4153
diff changeset
1269
79df15d4470c [project @ 2003-10-18 03:53:52 by jwe]
jwe
parents: 4153
diff changeset
1270 // -*- 5 -*-
79df15d4470c [project @ 2003-10-18 03:53:52 by jwe]
jwe
parents: 4153
diff changeset
1271 octave_value
79df15d4470c [project @ 2003-10-18 03:53:52 by jwe]
jwe
parents: 4153
diff changeset
1272 elem_xpow (const NDArray& a, const Complex& b)
79df15d4470c [project @ 2003-10-18 03:53:52 by jwe]
jwe
parents: 4153
diff changeset
1273 {
79df15d4470c [project @ 2003-10-18 03:53:52 by jwe]
jwe
parents: 4153
diff changeset
1274 ComplexNDArray result (a.dims ());
79df15d4470c [project @ 2003-10-18 03:53:52 by jwe]
jwe
parents: 4153
diff changeset
1275
5275
23b37da9fd5b [project @ 2005-04-08 16:07:35 by jwe]
jwe
parents: 5260
diff changeset
1276 for (octave_idx_type i = 0; i < a.length (); i++)
4543
79df15d4470c [project @ 2003-10-18 03:53:52 by jwe]
jwe
parents: 4153
diff changeset
1277 {
79df15d4470c [project @ 2003-10-18 03:53:52 by jwe]
jwe
parents: 4153
diff changeset
1278 OCTAVE_QUIT;
5260
deed800e7bef [project @ 2005-03-30 23:18:58 by jwe]
jwe
parents: 4790
diff changeset
1279 result(i) = std::pow (Complex (a(i)), b);
4543
79df15d4470c [project @ 2003-10-18 03:53:52 by jwe]
jwe
parents: 4153
diff changeset
1280 }
79df15d4470c [project @ 2003-10-18 03:53:52 by jwe]
jwe
parents: 4153
diff changeset
1281
79df15d4470c [project @ 2003-10-18 03:53:52 by jwe]
jwe
parents: 4153
diff changeset
1282 return result;
79df15d4470c [project @ 2003-10-18 03:53:52 by jwe]
jwe
parents: 4153
diff changeset
1283 }
79df15d4470c [project @ 2003-10-18 03:53:52 by jwe]
jwe
parents: 4153
diff changeset
1284
79df15d4470c [project @ 2003-10-18 03:53:52 by jwe]
jwe
parents: 4153
diff changeset
1285 // -*- 6 -*-
79df15d4470c [project @ 2003-10-18 03:53:52 by jwe]
jwe
parents: 4153
diff changeset
1286 octave_value
79df15d4470c [project @ 2003-10-18 03:53:52 by jwe]
jwe
parents: 4153
diff changeset
1287 elem_xpow (const NDArray& a, const ComplexNDArray& b)
79df15d4470c [project @ 2003-10-18 03:53:52 by jwe]
jwe
parents: 4153
diff changeset
1288 {
79df15d4470c [project @ 2003-10-18 03:53:52 by jwe]
jwe
parents: 4153
diff changeset
1289 dim_vector a_dims = a.dims ();
79df15d4470c [project @ 2003-10-18 03:53:52 by jwe]
jwe
parents: 4153
diff changeset
1290 dim_vector b_dims = b.dims ();
79df15d4470c [project @ 2003-10-18 03:53:52 by jwe]
jwe
parents: 4153
diff changeset
1291
79df15d4470c [project @ 2003-10-18 03:53:52 by jwe]
jwe
parents: 4153
diff changeset
1292 if (a_dims != b_dims)
79df15d4470c [project @ 2003-10-18 03:53:52 by jwe]
jwe
parents: 4153
diff changeset
1293 {
79df15d4470c [project @ 2003-10-18 03:53:52 by jwe]
jwe
parents: 4153
diff changeset
1294 gripe_nonconformant ("operator .^", a_dims, b_dims);
79df15d4470c [project @ 2003-10-18 03:53:52 by jwe]
jwe
parents: 4153
diff changeset
1295 return octave_value ();
79df15d4470c [project @ 2003-10-18 03:53:52 by jwe]
jwe
parents: 4153
diff changeset
1296 }
79df15d4470c [project @ 2003-10-18 03:53:52 by jwe]
jwe
parents: 4153
diff changeset
1297
79df15d4470c [project @ 2003-10-18 03:53:52 by jwe]
jwe
parents: 4153
diff changeset
1298 ComplexNDArray result (a_dims);
5275
23b37da9fd5b [project @ 2005-04-08 16:07:35 by jwe]
jwe
parents: 5260
diff changeset
1299
23b37da9fd5b [project @ 2005-04-08 16:07:35 by jwe]
jwe
parents: 5260
diff changeset
1300 for (octave_idx_type i = 0; i < a.length (); i++)
4543
79df15d4470c [project @ 2003-10-18 03:53:52 by jwe]
jwe
parents: 4153
diff changeset
1301 {
79df15d4470c [project @ 2003-10-18 03:53:52 by jwe]
jwe
parents: 4153
diff changeset
1302 OCTAVE_QUIT;
5260
deed800e7bef [project @ 2005-03-30 23:18:58 by jwe]
jwe
parents: 4790
diff changeset
1303 result(i) = std::pow (Complex (a(i)), b(i));
4543
79df15d4470c [project @ 2003-10-18 03:53:52 by jwe]
jwe
parents: 4153
diff changeset
1304 }
79df15d4470c [project @ 2003-10-18 03:53:52 by jwe]
jwe
parents: 4153
diff changeset
1305
79df15d4470c [project @ 2003-10-18 03:53:52 by jwe]
jwe
parents: 4153
diff changeset
1306 return result;
79df15d4470c [project @ 2003-10-18 03:53:52 by jwe]
jwe
parents: 4153
diff changeset
1307 }
79df15d4470c [project @ 2003-10-18 03:53:52 by jwe]
jwe
parents: 4153
diff changeset
1308
79df15d4470c [project @ 2003-10-18 03:53:52 by jwe]
jwe
parents: 4153
diff changeset
1309 // -*- 7 -*-
79df15d4470c [project @ 2003-10-18 03:53:52 by jwe]
jwe
parents: 4153
diff changeset
1310 octave_value
79df15d4470c [project @ 2003-10-18 03:53:52 by jwe]
jwe
parents: 4153
diff changeset
1311 elem_xpow (const Complex& a, const NDArray& b)
79df15d4470c [project @ 2003-10-18 03:53:52 by jwe]
jwe
parents: 4153
diff changeset
1312 {
79df15d4470c [project @ 2003-10-18 03:53:52 by jwe]
jwe
parents: 4153
diff changeset
1313 ComplexNDArray result (b.dims ());
5275
23b37da9fd5b [project @ 2005-04-08 16:07:35 by jwe]
jwe
parents: 5260
diff changeset
1314
23b37da9fd5b [project @ 2005-04-08 16:07:35 by jwe]
jwe
parents: 5260
diff changeset
1315 for (octave_idx_type i = 0; i < b.length (); i++)
4543
79df15d4470c [project @ 2003-10-18 03:53:52 by jwe]
jwe
parents: 4153
diff changeset
1316 {
79df15d4470c [project @ 2003-10-18 03:53:52 by jwe]
jwe
parents: 4153
diff changeset
1317 OCTAVE_QUIT;
79df15d4470c [project @ 2003-10-18 03:53:52 by jwe]
jwe
parents: 4153
diff changeset
1318 double btmp = b(i);
79df15d4470c [project @ 2003-10-18 03:53:52 by jwe]
jwe
parents: 4153
diff changeset
1319 if (xisint (btmp))
5260
deed800e7bef [project @ 2005-03-30 23:18:58 by jwe]
jwe
parents: 4790
diff changeset
1320 result(i) = std::pow (a, static_cast<int> (btmp));
4543
79df15d4470c [project @ 2003-10-18 03:53:52 by jwe]
jwe
parents: 4153
diff changeset
1321 else
5260
deed800e7bef [project @ 2005-03-30 23:18:58 by jwe]
jwe
parents: 4790
diff changeset
1322 result(i) = std::pow (a, btmp);
4543
79df15d4470c [project @ 2003-10-18 03:53:52 by jwe]
jwe
parents: 4153
diff changeset
1323 }
79df15d4470c [project @ 2003-10-18 03:53:52 by jwe]
jwe
parents: 4153
diff changeset
1324
79df15d4470c [project @ 2003-10-18 03:53:52 by jwe]
jwe
parents: 4153
diff changeset
1325 return result;
79df15d4470c [project @ 2003-10-18 03:53:52 by jwe]
jwe
parents: 4153
diff changeset
1326 }
79df15d4470c [project @ 2003-10-18 03:53:52 by jwe]
jwe
parents: 4153
diff changeset
1327
79df15d4470c [project @ 2003-10-18 03:53:52 by jwe]
jwe
parents: 4153
diff changeset
1328 // -*- 8 -*-
79df15d4470c [project @ 2003-10-18 03:53:52 by jwe]
jwe
parents: 4153
diff changeset
1329 octave_value
79df15d4470c [project @ 2003-10-18 03:53:52 by jwe]
jwe
parents: 4153
diff changeset
1330 elem_xpow (const Complex& a, const ComplexNDArray& b)
79df15d4470c [project @ 2003-10-18 03:53:52 by jwe]
jwe
parents: 4153
diff changeset
1331 {
79df15d4470c [project @ 2003-10-18 03:53:52 by jwe]
jwe
parents: 4153
diff changeset
1332 ComplexNDArray result (b.dims ());
5275
23b37da9fd5b [project @ 2005-04-08 16:07:35 by jwe]
jwe
parents: 5260
diff changeset
1333
23b37da9fd5b [project @ 2005-04-08 16:07:35 by jwe]
jwe
parents: 5260
diff changeset
1334 for (octave_idx_type i = 0; i < b.length (); i++)
4543
79df15d4470c [project @ 2003-10-18 03:53:52 by jwe]
jwe
parents: 4153
diff changeset
1335 {
79df15d4470c [project @ 2003-10-18 03:53:52 by jwe]
jwe
parents: 4153
diff changeset
1336 OCTAVE_QUIT;
5260
deed800e7bef [project @ 2005-03-30 23:18:58 by jwe]
jwe
parents: 4790
diff changeset
1337 result(i) = std::pow (a, b(i));
4543
79df15d4470c [project @ 2003-10-18 03:53:52 by jwe]
jwe
parents: 4153
diff changeset
1338 }
79df15d4470c [project @ 2003-10-18 03:53:52 by jwe]
jwe
parents: 4153
diff changeset
1339
79df15d4470c [project @ 2003-10-18 03:53:52 by jwe]
jwe
parents: 4153
diff changeset
1340 return result;
79df15d4470c [project @ 2003-10-18 03:53:52 by jwe]
jwe
parents: 4153
diff changeset
1341 }
79df15d4470c [project @ 2003-10-18 03:53:52 by jwe]
jwe
parents: 4153
diff changeset
1342
79df15d4470c [project @ 2003-10-18 03:53:52 by jwe]
jwe
parents: 4153
diff changeset
1343 // -*- 9 -*-
79df15d4470c [project @ 2003-10-18 03:53:52 by jwe]
jwe
parents: 4153
diff changeset
1344 octave_value
79df15d4470c [project @ 2003-10-18 03:53:52 by jwe]
jwe
parents: 4153
diff changeset
1345 elem_xpow (const ComplexNDArray& a, double b)
79df15d4470c [project @ 2003-10-18 03:53:52 by jwe]
jwe
parents: 4153
diff changeset
1346 {
79df15d4470c [project @ 2003-10-18 03:53:52 by jwe]
jwe
parents: 4153
diff changeset
1347 ComplexNDArray result (a.dims ());
79df15d4470c [project @ 2003-10-18 03:53:52 by jwe]
jwe
parents: 4153
diff changeset
1348
79df15d4470c [project @ 2003-10-18 03:53:52 by jwe]
jwe
parents: 4153
diff changeset
1349 if (xisint (b))
79df15d4470c [project @ 2003-10-18 03:53:52 by jwe]
jwe
parents: 4153
diff changeset
1350 {
8979
a7c00773a089 optimize also .^-1 case
Jaroslav Hajek <highegg@gmail.com>
parents: 8978
diff changeset
1351 if (b == -1)
a7c00773a089 optimize also .^-1 case
Jaroslav Hajek <highegg@gmail.com>
parents: 8978
diff changeset
1352 {
a7c00773a089 optimize also .^-1 case
Jaroslav Hajek <highegg@gmail.com>
parents: 8978
diff changeset
1353 for (octave_idx_type i = 0; i < a.length (); i++)
a7c00773a089 optimize also .^-1 case
Jaroslav Hajek <highegg@gmail.com>
parents: 8978
diff changeset
1354 result.xelem (i) = std::conj (a(i)) / std::norm (a(i));
a7c00773a089 optimize also .^-1 case
Jaroslav Hajek <highegg@gmail.com>
parents: 8978
diff changeset
1355 }
a7c00773a089 optimize also .^-1 case
Jaroslav Hajek <highegg@gmail.com>
parents: 8978
diff changeset
1356 else
a7c00773a089 optimize also .^-1 case
Jaroslav Hajek <highegg@gmail.com>
parents: 8978
diff changeset
1357 {
a7c00773a089 optimize also .^-1 case
Jaroslav Hajek <highegg@gmail.com>
parents: 8978
diff changeset
1358 for (octave_idx_type i = 0; i < a.length (); i++)
a7c00773a089 optimize also .^-1 case
Jaroslav Hajek <highegg@gmail.com>
parents: 8978
diff changeset
1359 {
a7c00773a089 optimize also .^-1 case
Jaroslav Hajek <highegg@gmail.com>
parents: 8978
diff changeset
1360 OCTAVE_QUIT;
a7c00773a089 optimize also .^-1 case
Jaroslav Hajek <highegg@gmail.com>
parents: 8978
diff changeset
1361 result(i) = std::pow (a(i), static_cast<int> (b));
a7c00773a089 optimize also .^-1 case
Jaroslav Hajek <highegg@gmail.com>
parents: 8978
diff changeset
1362 }
a7c00773a089 optimize also .^-1 case
Jaroslav Hajek <highegg@gmail.com>
parents: 8978
diff changeset
1363 }
4543
79df15d4470c [project @ 2003-10-18 03:53:52 by jwe]
jwe
parents: 4153
diff changeset
1364 }
79df15d4470c [project @ 2003-10-18 03:53:52 by jwe]
jwe
parents: 4153
diff changeset
1365 else
79df15d4470c [project @ 2003-10-18 03:53:52 by jwe]
jwe
parents: 4153
diff changeset
1366 {
5275
23b37da9fd5b [project @ 2005-04-08 16:07:35 by jwe]
jwe
parents: 5260
diff changeset
1367 for (octave_idx_type i = 0; i < a.length (); i++)
4543
79df15d4470c [project @ 2003-10-18 03:53:52 by jwe]
jwe
parents: 4153
diff changeset
1368 {
79df15d4470c [project @ 2003-10-18 03:53:52 by jwe]
jwe
parents: 4153
diff changeset
1369 OCTAVE_QUIT;
5260
deed800e7bef [project @ 2005-03-30 23:18:58 by jwe]
jwe
parents: 4790
diff changeset
1370 result(i) = std::pow (a(i), b);
4543
79df15d4470c [project @ 2003-10-18 03:53:52 by jwe]
jwe
parents: 4153
diff changeset
1371 }
79df15d4470c [project @ 2003-10-18 03:53:52 by jwe]
jwe
parents: 4153
diff changeset
1372 }
79df15d4470c [project @ 2003-10-18 03:53:52 by jwe]
jwe
parents: 4153
diff changeset
1373
79df15d4470c [project @ 2003-10-18 03:53:52 by jwe]
jwe
parents: 4153
diff changeset
1374 return result;
79df15d4470c [project @ 2003-10-18 03:53:52 by jwe]
jwe
parents: 4153
diff changeset
1375 }
79df15d4470c [project @ 2003-10-18 03:53:52 by jwe]
jwe
parents: 4153
diff changeset
1376
79df15d4470c [project @ 2003-10-18 03:53:52 by jwe]
jwe
parents: 4153
diff changeset
1377 // -*- 10 -*-
79df15d4470c [project @ 2003-10-18 03:53:52 by jwe]
jwe
parents: 4153
diff changeset
1378 octave_value
79df15d4470c [project @ 2003-10-18 03:53:52 by jwe]
jwe
parents: 4153
diff changeset
1379 elem_xpow (const ComplexNDArray& a, const NDArray& b)
79df15d4470c [project @ 2003-10-18 03:53:52 by jwe]
jwe
parents: 4153
diff changeset
1380 {
79df15d4470c [project @ 2003-10-18 03:53:52 by jwe]
jwe
parents: 4153
diff changeset
1381 dim_vector a_dims = a.dims ();
79df15d4470c [project @ 2003-10-18 03:53:52 by jwe]
jwe
parents: 4153
diff changeset
1382 dim_vector b_dims = b.dims ();
79df15d4470c [project @ 2003-10-18 03:53:52 by jwe]
jwe
parents: 4153
diff changeset
1383
79df15d4470c [project @ 2003-10-18 03:53:52 by jwe]
jwe
parents: 4153
diff changeset
1384 if (a_dims != b_dims)
79df15d4470c [project @ 2003-10-18 03:53:52 by jwe]
jwe
parents: 4153
diff changeset
1385 {
79df15d4470c [project @ 2003-10-18 03:53:52 by jwe]
jwe
parents: 4153
diff changeset
1386 gripe_nonconformant ("operator .^", a_dims, b_dims);
79df15d4470c [project @ 2003-10-18 03:53:52 by jwe]
jwe
parents: 4153
diff changeset
1387 return octave_value ();
79df15d4470c [project @ 2003-10-18 03:53:52 by jwe]
jwe
parents: 4153
diff changeset
1388 }
79df15d4470c [project @ 2003-10-18 03:53:52 by jwe]
jwe
parents: 4153
diff changeset
1389
79df15d4470c [project @ 2003-10-18 03:53:52 by jwe]
jwe
parents: 4153
diff changeset
1390 ComplexNDArray result (a_dims);
5275
23b37da9fd5b [project @ 2005-04-08 16:07:35 by jwe]
jwe
parents: 5260
diff changeset
1391
23b37da9fd5b [project @ 2005-04-08 16:07:35 by jwe]
jwe
parents: 5260
diff changeset
1392 for (octave_idx_type i = 0; i < a.length (); i++)
4543
79df15d4470c [project @ 2003-10-18 03:53:52 by jwe]
jwe
parents: 4153
diff changeset
1393 {
79df15d4470c [project @ 2003-10-18 03:53:52 by jwe]
jwe
parents: 4153
diff changeset
1394 OCTAVE_QUIT;
79df15d4470c [project @ 2003-10-18 03:53:52 by jwe]
jwe
parents: 4153
diff changeset
1395 double btmp = b(i);
79df15d4470c [project @ 2003-10-18 03:53:52 by jwe]
jwe
parents: 4153
diff changeset
1396 if (xisint (btmp))
5260
deed800e7bef [project @ 2005-03-30 23:18:58 by jwe]
jwe
parents: 4790
diff changeset
1397 result(i) = std::pow (a(i), static_cast<int> (btmp));
4543
79df15d4470c [project @ 2003-10-18 03:53:52 by jwe]
jwe
parents: 4153
diff changeset
1398 else
5260
deed800e7bef [project @ 2005-03-30 23:18:58 by jwe]
jwe
parents: 4790
diff changeset
1399 result(i) = std::pow (a(i), btmp);
4543
79df15d4470c [project @ 2003-10-18 03:53:52 by jwe]
jwe
parents: 4153
diff changeset
1400 }
79df15d4470c [project @ 2003-10-18 03:53:52 by jwe]
jwe
parents: 4153
diff changeset
1401
79df15d4470c [project @ 2003-10-18 03:53:52 by jwe]
jwe
parents: 4153
diff changeset
1402 return result;
79df15d4470c [project @ 2003-10-18 03:53:52 by jwe]
jwe
parents: 4153
diff changeset
1403 }
79df15d4470c [project @ 2003-10-18 03:53:52 by jwe]
jwe
parents: 4153
diff changeset
1404
79df15d4470c [project @ 2003-10-18 03:53:52 by jwe]
jwe
parents: 4153
diff changeset
1405 // -*- 11 -*-
79df15d4470c [project @ 2003-10-18 03:53:52 by jwe]
jwe
parents: 4153
diff changeset
1406 octave_value
79df15d4470c [project @ 2003-10-18 03:53:52 by jwe]
jwe
parents: 4153
diff changeset
1407 elem_xpow (const ComplexNDArray& a, const Complex& b)
79df15d4470c [project @ 2003-10-18 03:53:52 by jwe]
jwe
parents: 4153
diff changeset
1408 {
79df15d4470c [project @ 2003-10-18 03:53:52 by jwe]
jwe
parents: 4153
diff changeset
1409 ComplexNDArray result (a.dims ());
5275
23b37da9fd5b [project @ 2005-04-08 16:07:35 by jwe]
jwe
parents: 5260
diff changeset
1410
23b37da9fd5b [project @ 2005-04-08 16:07:35 by jwe]
jwe
parents: 5260
diff changeset
1411 for (octave_idx_type i = 0; i < a.length (); i++)
4543
79df15d4470c [project @ 2003-10-18 03:53:52 by jwe]
jwe
parents: 4153
diff changeset
1412 {
79df15d4470c [project @ 2003-10-18 03:53:52 by jwe]
jwe
parents: 4153
diff changeset
1413 OCTAVE_QUIT;
5260
deed800e7bef [project @ 2005-03-30 23:18:58 by jwe]
jwe
parents: 4790
diff changeset
1414 result(i) = std::pow (a(i), b);
4543
79df15d4470c [project @ 2003-10-18 03:53:52 by jwe]
jwe
parents: 4153
diff changeset
1415 }
79df15d4470c [project @ 2003-10-18 03:53:52 by jwe]
jwe
parents: 4153
diff changeset
1416
79df15d4470c [project @ 2003-10-18 03:53:52 by jwe]
jwe
parents: 4153
diff changeset
1417 return result;
79df15d4470c [project @ 2003-10-18 03:53:52 by jwe]
jwe
parents: 4153
diff changeset
1418 }
79df15d4470c [project @ 2003-10-18 03:53:52 by jwe]
jwe
parents: 4153
diff changeset
1419
79df15d4470c [project @ 2003-10-18 03:53:52 by jwe]
jwe
parents: 4153
diff changeset
1420 // -*- 12 -*-
79df15d4470c [project @ 2003-10-18 03:53:52 by jwe]
jwe
parents: 4153
diff changeset
1421 octave_value
79df15d4470c [project @ 2003-10-18 03:53:52 by jwe]
jwe
parents: 4153
diff changeset
1422 elem_xpow (const ComplexNDArray& a, const ComplexNDArray& b)
79df15d4470c [project @ 2003-10-18 03:53:52 by jwe]
jwe
parents: 4153
diff changeset
1423 {
79df15d4470c [project @ 2003-10-18 03:53:52 by jwe]
jwe
parents: 4153
diff changeset
1424 dim_vector a_dims = a.dims ();
79df15d4470c [project @ 2003-10-18 03:53:52 by jwe]
jwe
parents: 4153
diff changeset
1425 dim_vector b_dims = b.dims ();
79df15d4470c [project @ 2003-10-18 03:53:52 by jwe]
jwe
parents: 4153
diff changeset
1426
79df15d4470c [project @ 2003-10-18 03:53:52 by jwe]
jwe
parents: 4153
diff changeset
1427 if (a_dims != b_dims)
79df15d4470c [project @ 2003-10-18 03:53:52 by jwe]
jwe
parents: 4153
diff changeset
1428 {
79df15d4470c [project @ 2003-10-18 03:53:52 by jwe]
jwe
parents: 4153
diff changeset
1429 gripe_nonconformant ("operator .^", a_dims, b_dims);
79df15d4470c [project @ 2003-10-18 03:53:52 by jwe]
jwe
parents: 4153
diff changeset
1430 return octave_value ();
79df15d4470c [project @ 2003-10-18 03:53:52 by jwe]
jwe
parents: 4153
diff changeset
1431 }
79df15d4470c [project @ 2003-10-18 03:53:52 by jwe]
jwe
parents: 4153
diff changeset
1432
79df15d4470c [project @ 2003-10-18 03:53:52 by jwe]
jwe
parents: 4153
diff changeset
1433 ComplexNDArray result (a_dims);
5275
23b37da9fd5b [project @ 2005-04-08 16:07:35 by jwe]
jwe
parents: 5260
diff changeset
1434
23b37da9fd5b [project @ 2005-04-08 16:07:35 by jwe]
jwe
parents: 5260
diff changeset
1435 for (octave_idx_type i = 0; i < a.length (); i++)
4543
79df15d4470c [project @ 2003-10-18 03:53:52 by jwe]
jwe
parents: 4153
diff changeset
1436 {
79df15d4470c [project @ 2003-10-18 03:53:52 by jwe]
jwe
parents: 4153
diff changeset
1437 OCTAVE_QUIT;
5260
deed800e7bef [project @ 2005-03-30 23:18:58 by jwe]
jwe
parents: 4790
diff changeset
1438 result(i) = std::pow (a(i), b(i));
4543
79df15d4470c [project @ 2003-10-18 03:53:52 by jwe]
jwe
parents: 4153
diff changeset
1439 }
79df15d4470c [project @ 2003-10-18 03:53:52 by jwe]
jwe
parents: 4153
diff changeset
1440
79df15d4470c [project @ 2003-10-18 03:53:52 by jwe]
jwe
parents: 4153
diff changeset
1441 return result;
79df15d4470c [project @ 2003-10-18 03:53:52 by jwe]
jwe
parents: 4153
diff changeset
1442 }
79df15d4470c [project @ 2003-10-18 03:53:52 by jwe]
jwe
parents: 4153
diff changeset
1443
7789
82be108cc558 First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents: 7578
diff changeset
1444 static inline int
82be108cc558 First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents: 7578
diff changeset
1445 xisint (float x)
82be108cc558 First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents: 7578
diff changeset
1446 {
82be108cc558 First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents: 7578
diff changeset
1447 return (D_NINT (x) == x
82be108cc558 First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents: 7578
diff changeset
1448 && ((x >= 0 && x < INT_MAX)
82be108cc558 First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents: 7578
diff changeset
1449 || (x <= 0 && x > INT_MIN)));
82be108cc558 First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents: 7578
diff changeset
1450 }
82be108cc558 First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents: 7578
diff changeset
1451
82be108cc558 First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents: 7578
diff changeset
1452 // Safer pow functions.
82be108cc558 First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents: 7578
diff changeset
1453 //
82be108cc558 First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents: 7578
diff changeset
1454 // op2 \ op1: s m cs cm
82be108cc558 First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents: 7578
diff changeset
1455 // +-- +---+---+----+----+
82be108cc558 First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents: 7578
diff changeset
1456 // scalar | | 1 | 5 | 7 | 11 |
82be108cc558 First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents: 7578
diff changeset
1457 // +---+---+----+----+
82be108cc558 First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents: 7578
diff changeset
1458 // matrix | 2 | * | 8 | * |
82be108cc558 First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents: 7578
diff changeset
1459 // +---+---+----+----+
82be108cc558 First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents: 7578
diff changeset
1460 // complex_scalar | 3 | 6 | 9 | 12 |
82be108cc558 First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents: 7578
diff changeset
1461 // +---+---+----+----+
82be108cc558 First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents: 7578
diff changeset
1462 // complex_matrix | 4 | * | 10 | * |
82be108cc558 First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents: 7578
diff changeset
1463 // +---+---+----+----+
82be108cc558 First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents: 7578
diff changeset
1464
82be108cc558 First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents: 7578
diff changeset
1465 // -*- 1 -*-
82be108cc558 First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents: 7578
diff changeset
1466 octave_value
82be108cc558 First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents: 7578
diff changeset
1467 xpow (float a, float b)
82be108cc558 First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents: 7578
diff changeset
1468 {
82be108cc558 First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents: 7578
diff changeset
1469 float retval;
82be108cc558 First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents: 7578
diff changeset
1470
8978
0a58c4cd1405 optimize element-wise power
Jaroslav Hajek <highegg@gmail.com>
parents: 8960
diff changeset
1471 if (a < 0.0 && ! xisint (b))
7789
82be108cc558 First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents: 7578
diff changeset
1472 {
82be108cc558 First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents: 7578
diff changeset
1473 FloatComplex atmp (a);
82be108cc558 First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents: 7578
diff changeset
1474
82be108cc558 First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents: 7578
diff changeset
1475 return std::pow (atmp, b);
82be108cc558 First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents: 7578
diff changeset
1476 }
82be108cc558 First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents: 7578
diff changeset
1477 else
82be108cc558 First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents: 7578
diff changeset
1478 retval = std::pow (a, b);
82be108cc558 First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents: 7578
diff changeset
1479
82be108cc558 First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents: 7578
diff changeset
1480 return retval;
82be108cc558 First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents: 7578
diff changeset
1481 }
82be108cc558 First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents: 7578
diff changeset
1482
82be108cc558 First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents: 7578
diff changeset
1483 // -*- 2 -*-
82be108cc558 First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents: 7578
diff changeset
1484 octave_value
82be108cc558 First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents: 7578
diff changeset
1485 xpow (float a, const FloatMatrix& b)
82be108cc558 First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents: 7578
diff changeset
1486 {
82be108cc558 First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents: 7578
diff changeset
1487 octave_value retval;
82be108cc558 First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents: 7578
diff changeset
1488
82be108cc558 First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents: 7578
diff changeset
1489 octave_idx_type nr = b.rows ();
82be108cc558 First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents: 7578
diff changeset
1490 octave_idx_type nc = b.cols ();
82be108cc558 First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents: 7578
diff changeset
1491
82be108cc558 First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents: 7578
diff changeset
1492 if (nr == 0 || nc == 0 || nr != nc)
82be108cc558 First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents: 7578
diff changeset
1493 error ("for x^A, A must be square");
82be108cc558 First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents: 7578
diff changeset
1494 else
82be108cc558 First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents: 7578
diff changeset
1495 {
82be108cc558 First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents: 7578
diff changeset
1496 FloatEIG b_eig (b);
82be108cc558 First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents: 7578
diff changeset
1497
82be108cc558 First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents: 7578
diff changeset
1498 if (! error_state)
82be108cc558 First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents: 7578
diff changeset
1499 {
82be108cc558 First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents: 7578
diff changeset
1500 FloatComplexColumnVector lambda (b_eig.eigenvalues ());
82be108cc558 First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents: 7578
diff changeset
1501 FloatComplexMatrix Q (b_eig.eigenvectors ());
82be108cc558 First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents: 7578
diff changeset
1502
82be108cc558 First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents: 7578
diff changeset
1503 for (octave_idx_type i = 0; i < nr; i++)
82be108cc558 First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents: 7578
diff changeset
1504 {
82be108cc558 First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents: 7578
diff changeset
1505 FloatComplex elt = lambda(i);
82be108cc558 First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents: 7578
diff changeset
1506 if (std::imag (elt) == 0.0)
82be108cc558 First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents: 7578
diff changeset
1507 lambda(i) = std::pow (a, std::real (elt));
82be108cc558 First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents: 7578
diff changeset
1508 else
82be108cc558 First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents: 7578
diff changeset
1509 lambda(i) = std::pow (a, elt);
82be108cc558 First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents: 7578
diff changeset
1510 }
82be108cc558 First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents: 7578
diff changeset
1511 FloatComplexDiagMatrix D (lambda);
82be108cc558 First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents: 7578
diff changeset
1512
82be108cc558 First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents: 7578
diff changeset
1513 retval = FloatComplexMatrix (Q * D * Q.inverse ());
82be108cc558 First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents: 7578
diff changeset
1514 }
82be108cc558 First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents: 7578
diff changeset
1515 else
82be108cc558 First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents: 7578
diff changeset
1516 error ("xpow: matrix diagonalization failed");
82be108cc558 First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents: 7578
diff changeset
1517 }
82be108cc558 First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents: 7578
diff changeset
1518
82be108cc558 First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents: 7578
diff changeset
1519 return retval;
82be108cc558 First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents: 7578
diff changeset
1520 }
82be108cc558 First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents: 7578
diff changeset
1521
82be108cc558 First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents: 7578
diff changeset
1522 // -*- 3 -*-
82be108cc558 First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents: 7578
diff changeset
1523 octave_value
82be108cc558 First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents: 7578
diff changeset
1524 xpow (float a, const FloatComplex& b)
82be108cc558 First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents: 7578
diff changeset
1525 {
82be108cc558 First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents: 7578
diff changeset
1526 FloatComplex result;
82be108cc558 First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents: 7578
diff changeset
1527 FloatComplex atmp (a);
82be108cc558 First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents: 7578
diff changeset
1528 result = std::pow (atmp, b);
82be108cc558 First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents: 7578
diff changeset
1529 return result;
82be108cc558 First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents: 7578
diff changeset
1530 }
82be108cc558 First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents: 7578
diff changeset
1531
82be108cc558 First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents: 7578
diff changeset
1532 // -*- 4 -*-
82be108cc558 First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents: 7578
diff changeset
1533 octave_value
82be108cc558 First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents: 7578
diff changeset
1534 xpow (float a, const FloatComplexMatrix& b)
82be108cc558 First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents: 7578
diff changeset
1535 {
82be108cc558 First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents: 7578
diff changeset
1536 octave_value retval;
82be108cc558 First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents: 7578
diff changeset
1537
82be108cc558 First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents: 7578
diff changeset
1538 octave_idx_type nr = b.rows ();
82be108cc558 First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents: 7578
diff changeset
1539 octave_idx_type nc = b.cols ();
82be108cc558 First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents: 7578
diff changeset
1540
82be108cc558 First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents: 7578
diff changeset
1541 if (nr == 0 || nc == 0 || nr != nc)
82be108cc558 First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents: 7578
diff changeset
1542 error ("for x^A, A must be square");
82be108cc558 First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents: 7578
diff changeset
1543 else
82be108cc558 First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents: 7578
diff changeset
1544 {
82be108cc558 First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents: 7578
diff changeset
1545 FloatEIG b_eig (b);
82be108cc558 First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents: 7578
diff changeset
1546
82be108cc558 First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents: 7578
diff changeset
1547 if (! error_state)
82be108cc558 First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents: 7578
diff changeset
1548 {
82be108cc558 First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents: 7578
diff changeset
1549 FloatComplexColumnVector lambda (b_eig.eigenvalues ());
82be108cc558 First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents: 7578
diff changeset
1550 FloatComplexMatrix Q (b_eig.eigenvectors ());
82be108cc558 First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents: 7578
diff changeset
1551
82be108cc558 First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents: 7578
diff changeset
1552 for (octave_idx_type i = 0; i < nr; i++)
82be108cc558 First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents: 7578
diff changeset
1553 {
82be108cc558 First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents: 7578
diff changeset
1554 FloatComplex elt = lambda(i);
82be108cc558 First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents: 7578
diff changeset
1555 if (std::imag (elt) == 0.0)
82be108cc558 First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents: 7578
diff changeset
1556 lambda(i) = std::pow (a, std::real (elt));
82be108cc558 First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents: 7578
diff changeset
1557 else
82be108cc558 First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents: 7578
diff changeset
1558 lambda(i) = std::pow (a, elt);
82be108cc558 First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents: 7578
diff changeset
1559 }
82be108cc558 First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents: 7578
diff changeset
1560 FloatComplexDiagMatrix D (lambda);
82be108cc558 First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents: 7578
diff changeset
1561
82be108cc558 First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents: 7578
diff changeset
1562 retval = FloatComplexMatrix (Q * D * Q.inverse ());
82be108cc558 First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents: 7578
diff changeset
1563 }
82be108cc558 First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents: 7578
diff changeset
1564 else
82be108cc558 First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents: 7578
diff changeset
1565 error ("xpow: matrix diagonalization failed");
82be108cc558 First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents: 7578
diff changeset
1566 }
82be108cc558 First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents: 7578
diff changeset
1567
82be108cc558 First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents: 7578
diff changeset
1568 return retval;
82be108cc558 First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents: 7578
diff changeset
1569 }
82be108cc558 First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents: 7578
diff changeset
1570
82be108cc558 First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents: 7578
diff changeset
1571 // -*- 5 -*-
82be108cc558 First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents: 7578
diff changeset
1572 octave_value
82be108cc558 First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents: 7578
diff changeset
1573 xpow (const FloatMatrix& a, float b)
82be108cc558 First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents: 7578
diff changeset
1574 {
82be108cc558 First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents: 7578
diff changeset
1575 octave_value retval;
82be108cc558 First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents: 7578
diff changeset
1576
82be108cc558 First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents: 7578
diff changeset
1577 octave_idx_type nr = a.rows ();
82be108cc558 First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents: 7578
diff changeset
1578 octave_idx_type nc = a.cols ();
82be108cc558 First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents: 7578
diff changeset
1579
82be108cc558 First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents: 7578
diff changeset
1580 if (nr == 0 || nc == 0 || nr != nc)
82be108cc558 First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents: 7578
diff changeset
1581 error ("for A^b, A must be square");
82be108cc558 First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents: 7578
diff changeset
1582 else
82be108cc558 First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents: 7578
diff changeset
1583 {
82be108cc558 First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents: 7578
diff changeset
1584 if (static_cast<int> (b) == b)
82be108cc558 First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents: 7578
diff changeset
1585 {
82be108cc558 First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents: 7578
diff changeset
1586 int btmp = static_cast<int> (b);
82be108cc558 First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents: 7578
diff changeset
1587 if (btmp == 0)
82be108cc558 First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents: 7578
diff changeset
1588 {
82be108cc558 First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents: 7578
diff changeset
1589 retval = FloatDiagMatrix (nr, nr, 1.0);
82be108cc558 First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents: 7578
diff changeset
1590 }
82be108cc558 First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents: 7578
diff changeset
1591 else
82be108cc558 First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents: 7578
diff changeset
1592 {
82be108cc558 First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents: 7578
diff changeset
1593 // Too much copying?
82be108cc558 First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents: 7578
diff changeset
1594 // FIXME -- we shouldn't do this if the exponent is
82be108cc558 First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents: 7578
diff changeset
1595 // large...
82be108cc558 First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents: 7578
diff changeset
1596
82be108cc558 First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents: 7578
diff changeset
1597 FloatMatrix atmp;
82be108cc558 First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents: 7578
diff changeset
1598 if (btmp < 0)
82be108cc558 First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents: 7578
diff changeset
1599 {
82be108cc558 First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents: 7578
diff changeset
1600 btmp = -btmp;
82be108cc558 First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents: 7578
diff changeset
1601
82be108cc558 First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents: 7578
diff changeset
1602 octave_idx_type info;
82be108cc558 First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents: 7578
diff changeset
1603 float rcond = 0.0;
82be108cc558 First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents: 7578
diff changeset
1604 MatrixType mattype (a);
82be108cc558 First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents: 7578
diff changeset
1605
82be108cc558 First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents: 7578
diff changeset
1606 atmp = a.inverse (mattype, info, rcond, 1);
82be108cc558 First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents: 7578
diff changeset
1607
82be108cc558 First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents: 7578
diff changeset
1608 if (info == -1)
82be108cc558 First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents: 7578
diff changeset
1609 warning ("inverse: matrix singular to machine\
82be108cc558 First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents: 7578
diff changeset
1610 precision, rcond = %g", rcond);
82be108cc558 First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents: 7578
diff changeset
1611 }
82be108cc558 First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents: 7578
diff changeset
1612 else
82be108cc558 First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents: 7578
diff changeset
1613 atmp = a;
82be108cc558 First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents: 7578
diff changeset
1614
82be108cc558 First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents: 7578
diff changeset
1615 FloatMatrix result (atmp);
82be108cc558 First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents: 7578
diff changeset
1616
82be108cc558 First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents: 7578
diff changeset
1617 btmp--;
82be108cc558 First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents: 7578
diff changeset
1618
82be108cc558 First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents: 7578
diff changeset
1619 while (btmp > 0)
82be108cc558 First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents: 7578
diff changeset
1620 {
82be108cc558 First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents: 7578
diff changeset
1621 if (btmp & 1)
82be108cc558 First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents: 7578
diff changeset
1622 result = result * atmp;
82be108cc558 First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents: 7578
diff changeset
1623
82be108cc558 First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents: 7578
diff changeset
1624 btmp >>= 1;
82be108cc558 First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents: 7578
diff changeset
1625
82be108cc558 First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents: 7578
diff changeset
1626 if (btmp > 0)
82be108cc558 First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents: 7578
diff changeset
1627 atmp = atmp * atmp;
82be108cc558 First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents: 7578
diff changeset
1628 }
82be108cc558 First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents: 7578
diff changeset
1629
82be108cc558 First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents: 7578
diff changeset
1630 retval = result;
82be108cc558 First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents: 7578
diff changeset
1631 }
82be108cc558 First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents: 7578
diff changeset
1632 }
82be108cc558 First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents: 7578
diff changeset
1633 else
82be108cc558 First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents: 7578
diff changeset
1634 {
82be108cc558 First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents: 7578
diff changeset
1635 FloatEIG a_eig (a);
82be108cc558 First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents: 7578
diff changeset
1636
82be108cc558 First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents: 7578
diff changeset
1637 if (! error_state)
82be108cc558 First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents: 7578
diff changeset
1638 {
82be108cc558 First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents: 7578
diff changeset
1639 FloatComplexColumnVector lambda (a_eig.eigenvalues ());
82be108cc558 First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents: 7578
diff changeset
1640 FloatComplexMatrix Q (a_eig.eigenvectors ());
82be108cc558 First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents: 7578
diff changeset
1641
82be108cc558 First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents: 7578
diff changeset
1642 for (octave_idx_type i = 0; i < nr; i++)
82be108cc558 First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents: 7578
diff changeset
1643 lambda(i) = std::pow (lambda(i), b);
82be108cc558 First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents: 7578
diff changeset
1644
82be108cc558 First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents: 7578
diff changeset
1645 FloatComplexDiagMatrix D (lambda);
82be108cc558 First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents: 7578
diff changeset
1646
82be108cc558 First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents: 7578
diff changeset
1647 retval = FloatComplexMatrix (Q * D * Q.inverse ());
82be108cc558 First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents: 7578
diff changeset
1648 }
82be108cc558 First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents: 7578
diff changeset
1649 else
82be108cc558 First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents: 7578
diff changeset
1650 error ("xpow: matrix diagonalization failed");
82be108cc558 First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents: 7578
diff changeset
1651 }
82be108cc558 First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents: 7578
diff changeset
1652 }
82be108cc558 First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents: 7578
diff changeset
1653
82be108cc558 First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents: 7578
diff changeset
1654 return retval;
82be108cc558 First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents: 7578
diff changeset
1655 }
82be108cc558 First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents: 7578
diff changeset
1656
8382
9b20a4847056 implement scalar powers of diag matrices
Jaroslav Hajek <highegg@gmail.com>
parents: 7789
diff changeset
1657 // -*- 5d -*-
9b20a4847056 implement scalar powers of diag matrices
Jaroslav Hajek <highegg@gmail.com>
parents: 7789
diff changeset
1658 octave_value
9b20a4847056 implement scalar powers of diag matrices
Jaroslav Hajek <highegg@gmail.com>
parents: 7789
diff changeset
1659 xpow (const FloatDiagMatrix& a, float b)
9b20a4847056 implement scalar powers of diag matrices
Jaroslav Hajek <highegg@gmail.com>
parents: 7789
diff changeset
1660 {
9b20a4847056 implement scalar powers of diag matrices
Jaroslav Hajek <highegg@gmail.com>
parents: 7789
diff changeset
1661 octave_value retval;
9b20a4847056 implement scalar powers of diag matrices
Jaroslav Hajek <highegg@gmail.com>
parents: 7789
diff changeset
1662
9b20a4847056 implement scalar powers of diag matrices
Jaroslav Hajek <highegg@gmail.com>
parents: 7789
diff changeset
1663 octave_idx_type nr = a.rows ();
9b20a4847056 implement scalar powers of diag matrices
Jaroslav Hajek <highegg@gmail.com>
parents: 7789
diff changeset
1664 octave_idx_type nc = a.cols ();
9b20a4847056 implement scalar powers of diag matrices
Jaroslav Hajek <highegg@gmail.com>
parents: 7789
diff changeset
1665
9b20a4847056 implement scalar powers of diag matrices
Jaroslav Hajek <highegg@gmail.com>
parents: 7789
diff changeset
1666 if (nr == 0 || nc == 0 || nr != nc)
9b20a4847056 implement scalar powers of diag matrices
Jaroslav Hajek <highegg@gmail.com>
parents: 7789
diff changeset
1667 error ("for A^b, A must be square");
9b20a4847056 implement scalar powers of diag matrices
Jaroslav Hajek <highegg@gmail.com>
parents: 7789
diff changeset
1668 else
9b20a4847056 implement scalar powers of diag matrices
Jaroslav Hajek <highegg@gmail.com>
parents: 7789
diff changeset
1669 {
9b20a4847056 implement scalar powers of diag matrices
Jaroslav Hajek <highegg@gmail.com>
parents: 7789
diff changeset
1670 if (static_cast<int> (b) == b)
9b20a4847056 implement scalar powers of diag matrices
Jaroslav Hajek <highegg@gmail.com>
parents: 7789
diff changeset
1671 {
9b20a4847056 implement scalar powers of diag matrices
Jaroslav Hajek <highegg@gmail.com>
parents: 7789
diff changeset
1672 FloatDiagMatrix r (nr, nc);
9b20a4847056 implement scalar powers of diag matrices
Jaroslav Hajek <highegg@gmail.com>
parents: 7789
diff changeset
1673 for (octave_idx_type i = 0; i < nc; i++)
9b20a4847056 implement scalar powers of diag matrices
Jaroslav Hajek <highegg@gmail.com>
parents: 7789
diff changeset
1674 r(i, i) = std::pow (a(i, i), b);
9b20a4847056 implement scalar powers of diag matrices
Jaroslav Hajek <highegg@gmail.com>
parents: 7789
diff changeset
1675 retval = r;
9b20a4847056 implement scalar powers of diag matrices
Jaroslav Hajek <highegg@gmail.com>
parents: 7789
diff changeset
1676 }
9b20a4847056 implement scalar powers of diag matrices
Jaroslav Hajek <highegg@gmail.com>
parents: 7789
diff changeset
1677 else
9b20a4847056 implement scalar powers of diag matrices
Jaroslav Hajek <highegg@gmail.com>
parents: 7789
diff changeset
1678 {
9b20a4847056 implement scalar powers of diag matrices
Jaroslav Hajek <highegg@gmail.com>
parents: 7789
diff changeset
1679 FloatComplexDiagMatrix r (nr, nc);
9b20a4847056 implement scalar powers of diag matrices
Jaroslav Hajek <highegg@gmail.com>
parents: 7789
diff changeset
1680 for (octave_idx_type i = 0; i < nc; i++)
9b20a4847056 implement scalar powers of diag matrices
Jaroslav Hajek <highegg@gmail.com>
parents: 7789
diff changeset
1681 r(i, i) = std::pow (static_cast<FloatComplex> (a(i, i)), b);
9b20a4847056 implement scalar powers of diag matrices
Jaroslav Hajek <highegg@gmail.com>
parents: 7789
diff changeset
1682 retval = r;
9b20a4847056 implement scalar powers of diag matrices
Jaroslav Hajek <highegg@gmail.com>
parents: 7789
diff changeset
1683 }
9b20a4847056 implement scalar powers of diag matrices
Jaroslav Hajek <highegg@gmail.com>
parents: 7789
diff changeset
1684 }
9b20a4847056 implement scalar powers of diag matrices
Jaroslav Hajek <highegg@gmail.com>
parents: 7789
diff changeset
1685
9b20a4847056 implement scalar powers of diag matrices
Jaroslav Hajek <highegg@gmail.com>
parents: 7789
diff changeset
1686 return retval;
9b20a4847056 implement scalar powers of diag matrices
Jaroslav Hajek <highegg@gmail.com>
parents: 7789
diff changeset
1687 }
9b20a4847056 implement scalar powers of diag matrices
Jaroslav Hajek <highegg@gmail.com>
parents: 7789
diff changeset
1688
7789
82be108cc558 First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents: 7578
diff changeset
1689 // -*- 6 -*-
82be108cc558 First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents: 7578
diff changeset
1690 octave_value
82be108cc558 First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents: 7578
diff changeset
1691 xpow (const FloatMatrix& a, const FloatComplex& b)
82be108cc558 First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents: 7578
diff changeset
1692 {
82be108cc558 First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents: 7578
diff changeset
1693 octave_value retval;
82be108cc558 First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents: 7578
diff changeset
1694
82be108cc558 First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents: 7578
diff changeset
1695 octave_idx_type nr = a.rows ();
82be108cc558 First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents: 7578
diff changeset
1696 octave_idx_type nc = a.cols ();
82be108cc558 First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents: 7578
diff changeset
1697
82be108cc558 First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents: 7578
diff changeset
1698 if (nr == 0 || nc == 0 || nr != nc)
82be108cc558 First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents: 7578
diff changeset
1699 error ("for A^b, A must be square");
82be108cc558 First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents: 7578
diff changeset
1700 else
82be108cc558 First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents: 7578
diff changeset
1701 {
82be108cc558 First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents: 7578
diff changeset
1702 FloatEIG a_eig (a);
82be108cc558 First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents: 7578
diff changeset
1703
82be108cc558 First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents: 7578
diff changeset
1704 if (! error_state)
82be108cc558 First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents: 7578
diff changeset
1705 {
82be108cc558 First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents: 7578
diff changeset
1706 FloatComplexColumnVector lambda (a_eig.eigenvalues ());
82be108cc558 First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents: 7578
diff changeset
1707 FloatComplexMatrix Q (a_eig.eigenvectors ());
82be108cc558 First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents: 7578
diff changeset
1708
82be108cc558 First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents: 7578
diff changeset
1709 for (octave_idx_type i = 0; i < nr; i++)
82be108cc558 First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents: 7578
diff changeset
1710 lambda(i) = std::pow (lambda(i), b);
82be108cc558 First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents: 7578
diff changeset
1711
82be108cc558 First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents: 7578
diff changeset
1712 FloatComplexDiagMatrix D (lambda);
82be108cc558 First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents: 7578
diff changeset
1713
82be108cc558 First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents: 7578
diff changeset
1714 retval = FloatComplexMatrix (Q * D * Q.inverse ());
82be108cc558 First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents: 7578
diff changeset
1715 }
82be108cc558 First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents: 7578
diff changeset
1716 else
82be108cc558 First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents: 7578
diff changeset
1717 error ("xpow: matrix diagonalization failed");
82be108cc558 First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents: 7578
diff changeset
1718 }
82be108cc558 First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents: 7578
diff changeset
1719
82be108cc558 First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents: 7578
diff changeset
1720 return retval;
82be108cc558 First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents: 7578
diff changeset
1721 }
82be108cc558 First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents: 7578
diff changeset
1722
82be108cc558 First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents: 7578
diff changeset
1723 // -*- 7 -*-
82be108cc558 First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents: 7578
diff changeset
1724 octave_value
82be108cc558 First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents: 7578
diff changeset
1725 xpow (const FloatComplex& a, float b)
82be108cc558 First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents: 7578
diff changeset
1726 {
82be108cc558 First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents: 7578
diff changeset
1727 FloatComplex result;
82be108cc558 First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents: 7578
diff changeset
1728
82be108cc558 First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents: 7578
diff changeset
1729 if (xisint (b))
82be108cc558 First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents: 7578
diff changeset
1730 result = std::pow (a, static_cast<int> (b));
82be108cc558 First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents: 7578
diff changeset
1731 else
82be108cc558 First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents: 7578
diff changeset
1732 result = std::pow (a, b);
82be108cc558 First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents: 7578
diff changeset
1733
82be108cc558 First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents: 7578
diff changeset
1734 return result;
82be108cc558 First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents: 7578
diff changeset
1735 }
82be108cc558 First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents: 7578
diff changeset
1736
82be108cc558 First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents: 7578
diff changeset
1737 // -*- 8 -*-
82be108cc558 First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents: 7578
diff changeset
1738 octave_value
82be108cc558 First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents: 7578
diff changeset
1739 xpow (const FloatComplex& a, const FloatMatrix& b)
82be108cc558 First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents: 7578
diff changeset
1740 {
82be108cc558 First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents: 7578
diff changeset
1741 octave_value retval;
82be108cc558 First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents: 7578
diff changeset
1742
82be108cc558 First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents: 7578
diff changeset
1743 octave_idx_type nr = b.rows ();
82be108cc558 First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents: 7578
diff changeset
1744 octave_idx_type nc = b.cols ();
82be108cc558 First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents: 7578
diff changeset
1745
82be108cc558 First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents: 7578
diff changeset
1746 if (nr == 0 || nc == 0 || nr != nc)
82be108cc558 First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents: 7578
diff changeset
1747 error ("for x^A, A must be square");
82be108cc558 First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents: 7578
diff changeset
1748 else
82be108cc558 First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents: 7578
diff changeset
1749 {
82be108cc558 First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents: 7578
diff changeset
1750 FloatEIG b_eig (b);
82be108cc558 First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents: 7578
diff changeset
1751
82be108cc558 First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents: 7578
diff changeset
1752 if (! error_state)
82be108cc558 First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents: 7578
diff changeset
1753 {
82be108cc558 First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents: 7578
diff changeset
1754 FloatComplexColumnVector lambda (b_eig.eigenvalues ());
82be108cc558 First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents: 7578
diff changeset
1755 FloatComplexMatrix Q (b_eig.eigenvectors ());
82be108cc558 First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents: 7578
diff changeset
1756
82be108cc558 First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents: 7578
diff changeset
1757 for (octave_idx_type i = 0; i < nr; i++)
82be108cc558 First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents: 7578
diff changeset
1758 {
82be108cc558 First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents: 7578
diff changeset
1759 FloatComplex elt = lambda(i);
82be108cc558 First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents: 7578
diff changeset
1760 if (std::imag (elt) == 0.0)
82be108cc558 First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents: 7578
diff changeset
1761 lambda(i) = std::pow (a, std::real (elt));
82be108cc558 First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents: 7578
diff changeset
1762 else
82be108cc558 First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents: 7578
diff changeset
1763 lambda(i) = std::pow (a, elt);
82be108cc558 First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents: 7578
diff changeset
1764 }
82be108cc558 First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents: 7578
diff changeset
1765 FloatComplexDiagMatrix D (lambda);
82be108cc558 First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents: 7578
diff changeset
1766
82be108cc558 First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents: 7578
diff changeset
1767 retval = FloatComplexMatrix (Q * D * Q.inverse ());
82be108cc558 First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents: 7578
diff changeset
1768 }
82be108cc558 First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents: 7578
diff changeset
1769 else
82be108cc558 First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents: 7578
diff changeset
1770 error ("xpow: matrix diagonalization failed");
82be108cc558 First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents: 7578
diff changeset
1771 }
82be108cc558 First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents: 7578
diff changeset
1772
82be108cc558 First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents: 7578
diff changeset
1773 return retval;
82be108cc558 First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents: 7578
diff changeset
1774 }
82be108cc558 First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents: 7578
diff changeset
1775
82be108cc558 First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents: 7578
diff changeset
1776 // -*- 9 -*-
82be108cc558 First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents: 7578
diff changeset
1777 octave_value
82be108cc558 First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents: 7578
diff changeset
1778 xpow (const FloatComplex& a, const FloatComplex& b)
82be108cc558 First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents: 7578
diff changeset
1779 {
82be108cc558 First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents: 7578
diff changeset
1780 FloatComplex result;
82be108cc558 First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents: 7578
diff changeset
1781 result = std::pow (a, b);
82be108cc558 First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents: 7578
diff changeset
1782 return result;
82be108cc558 First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents: 7578
diff changeset
1783 }
82be108cc558 First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents: 7578
diff changeset
1784
82be108cc558 First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents: 7578
diff changeset
1785 // -*- 10 -*-
82be108cc558 First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents: 7578
diff changeset
1786 octave_value
82be108cc558 First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents: 7578
diff changeset
1787 xpow (const FloatComplex& a, const FloatComplexMatrix& b)
82be108cc558 First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents: 7578
diff changeset
1788 {
82be108cc558 First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents: 7578
diff changeset
1789 octave_value retval;
82be108cc558 First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents: 7578
diff changeset
1790
82be108cc558 First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents: 7578
diff changeset
1791 octave_idx_type nr = b.rows ();
82be108cc558 First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents: 7578
diff changeset
1792 octave_idx_type nc = b.cols ();
82be108cc558 First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents: 7578
diff changeset
1793
82be108cc558 First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents: 7578
diff changeset
1794 if (nr == 0 || nc == 0 || nr != nc)
82be108cc558 First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents: 7578
diff changeset
1795 error ("for x^A, A must be square");
82be108cc558 First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents: 7578
diff changeset
1796 else
82be108cc558 First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents: 7578
diff changeset
1797 {
82be108cc558 First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents: 7578
diff changeset
1798 FloatEIG b_eig (b);
82be108cc558 First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents: 7578
diff changeset
1799
82be108cc558 First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents: 7578
diff changeset
1800 if (! error_state)
82be108cc558 First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents: 7578
diff changeset
1801 {
82be108cc558 First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents: 7578
diff changeset
1802 FloatComplexColumnVector lambda (b_eig.eigenvalues ());
82be108cc558 First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents: 7578
diff changeset
1803 FloatComplexMatrix Q (b_eig.eigenvectors ());
82be108cc558 First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents: 7578
diff changeset
1804
82be108cc558 First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents: 7578
diff changeset
1805 for (octave_idx_type i = 0; i < nr; i++)
82be108cc558 First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents: 7578
diff changeset
1806 {
82be108cc558 First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents: 7578
diff changeset
1807 FloatComplex elt = lambda(i);
82be108cc558 First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents: 7578
diff changeset
1808 if (std::imag (elt) == 0.0)
82be108cc558 First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents: 7578
diff changeset
1809 lambda(i) = std::pow (a, std::real (elt));
82be108cc558 First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents: 7578
diff changeset
1810 else
82be108cc558 First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents: 7578
diff changeset
1811 lambda(i) = std::pow (a, elt);
82be108cc558 First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents: 7578
diff changeset
1812 }
82be108cc558 First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents: 7578
diff changeset
1813 FloatComplexDiagMatrix D (lambda);
82be108cc558 First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents: 7578
diff changeset
1814
82be108cc558 First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents: 7578
diff changeset
1815 retval = FloatComplexMatrix (Q * D * Q.inverse ());
82be108cc558 First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents: 7578
diff changeset
1816 }
82be108cc558 First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents: 7578
diff changeset
1817 else
82be108cc558 First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents: 7578
diff changeset
1818 error ("xpow: matrix diagonalization failed");
82be108cc558 First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents: 7578
diff changeset
1819 }
82be108cc558 First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents: 7578
diff changeset
1820
82be108cc558 First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents: 7578
diff changeset
1821 return retval;
82be108cc558 First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents: 7578
diff changeset
1822 }
82be108cc558 First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents: 7578
diff changeset
1823
82be108cc558 First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents: 7578
diff changeset
1824 // -*- 11 -*-
82be108cc558 First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents: 7578
diff changeset
1825 octave_value
82be108cc558 First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents: 7578
diff changeset
1826 xpow (const FloatComplexMatrix& a, float b)
82be108cc558 First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents: 7578
diff changeset
1827 {
82be108cc558 First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents: 7578
diff changeset
1828 octave_value retval;
82be108cc558 First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents: 7578
diff changeset
1829
82be108cc558 First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents: 7578
diff changeset
1830 octave_idx_type nr = a.rows ();
82be108cc558 First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents: 7578
diff changeset
1831 octave_idx_type nc = a.cols ();
82be108cc558 First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents: 7578
diff changeset
1832
82be108cc558 First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents: 7578
diff changeset
1833 if (nr == 0 || nc == 0 || nr != nc)
82be108cc558 First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents: 7578
diff changeset
1834 error ("for A^b, A must be square");
82be108cc558 First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents: 7578
diff changeset
1835 else
82be108cc558 First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents: 7578
diff changeset
1836 {
82be108cc558 First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents: 7578
diff changeset
1837 if (static_cast<int> (b) == b)
82be108cc558 First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents: 7578
diff changeset
1838 {
82be108cc558 First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents: 7578
diff changeset
1839 int btmp = static_cast<int> (b);
82be108cc558 First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents: 7578
diff changeset
1840 if (btmp == 0)
82be108cc558 First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents: 7578
diff changeset
1841 {
82be108cc558 First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents: 7578
diff changeset
1842 retval = FloatDiagMatrix (nr, nr, 1.0);
82be108cc558 First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents: 7578
diff changeset
1843 }
82be108cc558 First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents: 7578
diff changeset
1844 else
82be108cc558 First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents: 7578
diff changeset
1845 {
82be108cc558 First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents: 7578
diff changeset
1846 // Too much copying?
82be108cc558 First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents: 7578
diff changeset
1847 // FIXME -- we shouldn't do this if the exponent is
82be108cc558 First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents: 7578
diff changeset
1848 // large...
82be108cc558 First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents: 7578
diff changeset
1849
82be108cc558 First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents: 7578
diff changeset
1850 FloatComplexMatrix atmp;
82be108cc558 First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents: 7578
diff changeset
1851 if (btmp < 0)
82be108cc558 First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents: 7578
diff changeset
1852 {
82be108cc558 First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents: 7578
diff changeset
1853 btmp = -btmp;
82be108cc558 First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents: 7578
diff changeset
1854
82be108cc558 First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents: 7578
diff changeset
1855 octave_idx_type info;
82be108cc558 First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents: 7578
diff changeset
1856 float rcond = 0.0;
82be108cc558 First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents: 7578
diff changeset
1857 MatrixType mattype (a);
82be108cc558 First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents: 7578
diff changeset
1858
82be108cc558 First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents: 7578
diff changeset
1859 atmp = a.inverse (mattype, info, rcond, 1);
82be108cc558 First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents: 7578
diff changeset
1860
82be108cc558 First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents: 7578
diff changeset
1861 if (info == -1)
82be108cc558 First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents: 7578
diff changeset
1862 warning ("inverse: matrix singular to machine\
82be108cc558 First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents: 7578
diff changeset
1863 precision, rcond = %g", rcond);
82be108cc558 First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents: 7578
diff changeset
1864 }
82be108cc558 First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents: 7578
diff changeset
1865 else
82be108cc558 First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents: 7578
diff changeset
1866 atmp = a;
82be108cc558 First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents: 7578
diff changeset
1867
82be108cc558 First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents: 7578
diff changeset
1868 FloatComplexMatrix result (atmp);
82be108cc558 First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents: 7578
diff changeset
1869
82be108cc558 First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents: 7578
diff changeset
1870 btmp--;
82be108cc558 First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents: 7578
diff changeset
1871
82be108cc558 First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents: 7578
diff changeset
1872 while (btmp > 0)
82be108cc558 First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents: 7578
diff changeset
1873 {
82be108cc558 First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents: 7578
diff changeset
1874 if (btmp & 1)
82be108cc558 First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents: 7578
diff changeset
1875 result = result * atmp;
82be108cc558 First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents: 7578
diff changeset
1876
82be108cc558 First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents: 7578
diff changeset
1877 btmp >>= 1;
82be108cc558 First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents: 7578
diff changeset
1878
82be108cc558 First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents: 7578
diff changeset
1879 if (btmp > 0)
82be108cc558 First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents: 7578
diff changeset
1880 atmp = atmp * atmp;
82be108cc558 First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents: 7578
diff changeset
1881 }
82be108cc558 First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents: 7578
diff changeset
1882
82be108cc558 First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents: 7578
diff changeset
1883 retval = result;
82be108cc558 First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents: 7578
diff changeset
1884 }
82be108cc558 First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents: 7578
diff changeset
1885 }
82be108cc558 First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents: 7578
diff changeset
1886 else
82be108cc558 First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents: 7578
diff changeset
1887 {
82be108cc558 First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents: 7578
diff changeset
1888 FloatEIG a_eig (a);
82be108cc558 First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents: 7578
diff changeset
1889
82be108cc558 First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents: 7578
diff changeset
1890 if (! error_state)
82be108cc558 First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents: 7578
diff changeset
1891 {
82be108cc558 First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents: 7578
diff changeset
1892 FloatComplexColumnVector lambda (a_eig.eigenvalues ());
82be108cc558 First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents: 7578
diff changeset
1893 FloatComplexMatrix Q (a_eig.eigenvectors ());
82be108cc558 First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents: 7578
diff changeset
1894
82be108cc558 First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents: 7578
diff changeset
1895 for (octave_idx_type i = 0; i < nr; i++)
82be108cc558 First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents: 7578
diff changeset
1896 lambda(i) = std::pow (lambda(i), b);
82be108cc558 First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents: 7578
diff changeset
1897
82be108cc558 First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents: 7578
diff changeset
1898 FloatComplexDiagMatrix D (lambda);
82be108cc558 First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents: 7578
diff changeset
1899
82be108cc558 First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents: 7578
diff changeset
1900 retval = FloatComplexMatrix (Q * D * Q.inverse ());
82be108cc558 First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents: 7578
diff changeset
1901 }
82be108cc558 First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents: 7578
diff changeset
1902 else
82be108cc558 First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents: 7578
diff changeset
1903 error ("xpow: matrix diagonalization failed");
82be108cc558 First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents: 7578
diff changeset
1904 }
82be108cc558 First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents: 7578
diff changeset
1905 }
82be108cc558 First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents: 7578
diff changeset
1906
82be108cc558 First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents: 7578
diff changeset
1907 return retval;
82be108cc558 First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents: 7578
diff changeset
1908 }
82be108cc558 First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents: 7578
diff changeset
1909
82be108cc558 First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents: 7578
diff changeset
1910 // -*- 12 -*-
82be108cc558 First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents: 7578
diff changeset
1911 octave_value
82be108cc558 First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents: 7578
diff changeset
1912 xpow (const FloatComplexMatrix& a, const FloatComplex& b)
82be108cc558 First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents: 7578
diff changeset
1913 {
82be108cc558 First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents: 7578
diff changeset
1914 octave_value retval;
82be108cc558 First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents: 7578
diff changeset
1915
82be108cc558 First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents: 7578
diff changeset
1916 octave_idx_type nr = a.rows ();
82be108cc558 First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents: 7578
diff changeset
1917 octave_idx_type nc = a.cols ();
82be108cc558 First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents: 7578
diff changeset
1918
82be108cc558 First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents: 7578
diff changeset
1919 if (nr == 0 || nc == 0 || nr != nc)
82be108cc558 First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents: 7578
diff changeset
1920 error ("for A^b, A must be square");
82be108cc558 First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents: 7578
diff changeset
1921 else
82be108cc558 First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents: 7578
diff changeset
1922 {
82be108cc558 First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents: 7578
diff changeset
1923 FloatEIG a_eig (a);
82be108cc558 First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents: 7578
diff changeset
1924
82be108cc558 First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents: 7578
diff changeset
1925 if (! error_state)
82be108cc558 First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents: 7578
diff changeset
1926 {
82be108cc558 First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents: 7578
diff changeset
1927 FloatComplexColumnVector lambda (a_eig.eigenvalues ());
82be108cc558 First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents: 7578
diff changeset
1928 FloatComplexMatrix Q (a_eig.eigenvectors ());
82be108cc558 First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents: 7578
diff changeset
1929
82be108cc558 First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents: 7578
diff changeset
1930 for (octave_idx_type i = 0; i < nr; i++)
82be108cc558 First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents: 7578
diff changeset
1931 lambda(i) = std::pow (lambda(i), b);
82be108cc558 First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents: 7578
diff changeset
1932
82be108cc558 First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents: 7578
diff changeset
1933 FloatComplexDiagMatrix D (lambda);
82be108cc558 First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents: 7578
diff changeset
1934
82be108cc558 First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents: 7578
diff changeset
1935 retval = FloatComplexMatrix (Q * D * Q.inverse ());
82be108cc558 First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents: 7578
diff changeset
1936 }
82be108cc558 First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents: 7578
diff changeset
1937 else
82be108cc558 First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents: 7578
diff changeset
1938 error ("xpow: matrix diagonalization failed");
82be108cc558 First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents: 7578
diff changeset
1939 }
82be108cc558 First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents: 7578
diff changeset
1940
82be108cc558 First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents: 7578
diff changeset
1941 return retval;
82be108cc558 First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents: 7578
diff changeset
1942 }
82be108cc558 First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents: 7578
diff changeset
1943
8382
9b20a4847056 implement scalar powers of diag matrices
Jaroslav Hajek <highegg@gmail.com>
parents: 7789
diff changeset
1944 // -*- 12d -*-
9b20a4847056 implement scalar powers of diag matrices
Jaroslav Hajek <highegg@gmail.com>
parents: 7789
diff changeset
1945 octave_value
9b20a4847056 implement scalar powers of diag matrices
Jaroslav Hajek <highegg@gmail.com>
parents: 7789
diff changeset
1946 xpow (const FloatComplexDiagMatrix& a, const FloatComplex& b)
9b20a4847056 implement scalar powers of diag matrices
Jaroslav Hajek <highegg@gmail.com>
parents: 7789
diff changeset
1947 {
9b20a4847056 implement scalar powers of diag matrices
Jaroslav Hajek <highegg@gmail.com>
parents: 7789
diff changeset
1948 octave_value retval;
9b20a4847056 implement scalar powers of diag matrices
Jaroslav Hajek <highegg@gmail.com>
parents: 7789
diff changeset
1949
9b20a4847056 implement scalar powers of diag matrices
Jaroslav Hajek <highegg@gmail.com>
parents: 7789
diff changeset
1950 octave_idx_type nr = a.rows ();
9b20a4847056 implement scalar powers of diag matrices
Jaroslav Hajek <highegg@gmail.com>
parents: 7789
diff changeset
1951 octave_idx_type nc = a.cols ();
9b20a4847056 implement scalar powers of diag matrices
Jaroslav Hajek <highegg@gmail.com>
parents: 7789
diff changeset
1952
9b20a4847056 implement scalar powers of diag matrices
Jaroslav Hajek <highegg@gmail.com>
parents: 7789
diff changeset
1953 if (nr == 0 || nc == 0 || nr != nc)
9b20a4847056 implement scalar powers of diag matrices
Jaroslav Hajek <highegg@gmail.com>
parents: 7789
diff changeset
1954 error ("for A^b, A must be square");
9b20a4847056 implement scalar powers of diag matrices
Jaroslav Hajek <highegg@gmail.com>
parents: 7789
diff changeset
1955 else
9b20a4847056 implement scalar powers of diag matrices
Jaroslav Hajek <highegg@gmail.com>
parents: 7789
diff changeset
1956 {
9b20a4847056 implement scalar powers of diag matrices
Jaroslav Hajek <highegg@gmail.com>
parents: 7789
diff changeset
1957 FloatComplexDiagMatrix r (nr, nc);
9b20a4847056 implement scalar powers of diag matrices
Jaroslav Hajek <highegg@gmail.com>
parents: 7789
diff changeset
1958 for (octave_idx_type i = 0; i < nc; i++)
9b20a4847056 implement scalar powers of diag matrices
Jaroslav Hajek <highegg@gmail.com>
parents: 7789
diff changeset
1959 r(i, i) = std::pow (a(i, i), b);
9b20a4847056 implement scalar powers of diag matrices
Jaroslav Hajek <highegg@gmail.com>
parents: 7789
diff changeset
1960 retval = r;
9b20a4847056 implement scalar powers of diag matrices
Jaroslav Hajek <highegg@gmail.com>
parents: 7789
diff changeset
1961 }
9b20a4847056 implement scalar powers of diag matrices
Jaroslav Hajek <highegg@gmail.com>
parents: 7789
diff changeset
1962
9b20a4847056 implement scalar powers of diag matrices
Jaroslav Hajek <highegg@gmail.com>
parents: 7789
diff changeset
1963 return retval;
9b20a4847056 implement scalar powers of diag matrices
Jaroslav Hajek <highegg@gmail.com>
parents: 7789
diff changeset
1964 }
9b20a4847056 implement scalar powers of diag matrices
Jaroslav Hajek <highegg@gmail.com>
parents: 7789
diff changeset
1965
9b20a4847056 implement scalar powers of diag matrices
Jaroslav Hajek <highegg@gmail.com>
parents: 7789
diff changeset
1966 // mixed
9b20a4847056 implement scalar powers of diag matrices
Jaroslav Hajek <highegg@gmail.com>
parents: 7789
diff changeset
1967 octave_value
9b20a4847056 implement scalar powers of diag matrices
Jaroslav Hajek <highegg@gmail.com>
parents: 7789
diff changeset
1968 xpow (const FloatComplexDiagMatrix& a, float b)
9b20a4847056 implement scalar powers of diag matrices
Jaroslav Hajek <highegg@gmail.com>
parents: 7789
diff changeset
1969 {
9b20a4847056 implement scalar powers of diag matrices
Jaroslav Hajek <highegg@gmail.com>
parents: 7789
diff changeset
1970 return xpow (a, static_cast<FloatComplex> (b));
9b20a4847056 implement scalar powers of diag matrices
Jaroslav Hajek <highegg@gmail.com>
parents: 7789
diff changeset
1971 }
9b20a4847056 implement scalar powers of diag matrices
Jaroslav Hajek <highegg@gmail.com>
parents: 7789
diff changeset
1972
9b20a4847056 implement scalar powers of diag matrices
Jaroslav Hajek <highegg@gmail.com>
parents: 7789
diff changeset
1973 octave_value
9b20a4847056 implement scalar powers of diag matrices
Jaroslav Hajek <highegg@gmail.com>
parents: 7789
diff changeset
1974 xpow (const FloatDiagMatrix& a, const FloatComplex& b)
9b20a4847056 implement scalar powers of diag matrices
Jaroslav Hajek <highegg@gmail.com>
parents: 7789
diff changeset
1975 {
9b20a4847056 implement scalar powers of diag matrices
Jaroslav Hajek <highegg@gmail.com>
parents: 7789
diff changeset
1976 return xpow (FloatComplexDiagMatrix (a), b);
9b20a4847056 implement scalar powers of diag matrices
Jaroslav Hajek <highegg@gmail.com>
parents: 7789
diff changeset
1977 }
9b20a4847056 implement scalar powers of diag matrices
Jaroslav Hajek <highegg@gmail.com>
parents: 7789
diff changeset
1978
7789
82be108cc558 First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents: 7578
diff changeset
1979 // Safer pow functions that work elementwise for matrices.
82be108cc558 First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents: 7578
diff changeset
1980 //
82be108cc558 First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents: 7578
diff changeset
1981 // op2 \ op1: s m cs cm
82be108cc558 First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents: 7578
diff changeset
1982 // +-- +---+---+----+----+
82be108cc558 First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents: 7578
diff changeset
1983 // scalar | | * | 3 | * | 9 |
82be108cc558 First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents: 7578
diff changeset
1984 // +---+---+----+----+
82be108cc558 First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents: 7578
diff changeset
1985 // matrix | 1 | 4 | 7 | 10 |
82be108cc558 First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents: 7578
diff changeset
1986 // +---+---+----+----+
82be108cc558 First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents: 7578
diff changeset
1987 // complex_scalar | * | 5 | * | 11 |
82be108cc558 First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents: 7578
diff changeset
1988 // +---+---+----+----+
82be108cc558 First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents: 7578
diff changeset
1989 // complex_matrix | 2 | 6 | 8 | 12 |
82be108cc558 First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents: 7578
diff changeset
1990 // +---+---+----+----+
82be108cc558 First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents: 7578
diff changeset
1991 //
82be108cc558 First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents: 7578
diff changeset
1992 // * -> not needed.
82be108cc558 First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents: 7578
diff changeset
1993
82be108cc558 First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents: 7578
diff changeset
1994 // FIXME -- these functions need to be fixed so that things
82be108cc558 First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents: 7578
diff changeset
1995 // like
82be108cc558 First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents: 7578
diff changeset
1996 //
82be108cc558 First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents: 7578
diff changeset
1997 // a = -1; b = [ 0, 0.5, 1 ]; r = a .^ b
82be108cc558 First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents: 7578
diff changeset
1998 //
82be108cc558 First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents: 7578
diff changeset
1999 // and
82be108cc558 First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents: 7578
diff changeset
2000 //
82be108cc558 First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents: 7578
diff changeset
2001 // a = -1; b = [ 0, 0.5, 1 ]; for i = 1:3, r(i) = a .^ b(i), end
82be108cc558 First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents: 7578
diff changeset
2002 //
82be108cc558 First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents: 7578
diff changeset
2003 // produce identical results. Also, it would be nice if -1^0.5
82be108cc558 First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents: 7578
diff changeset
2004 // produced a pure imaginary result instead of a complex number with a
82be108cc558 First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents: 7578
diff changeset
2005 // small real part. But perhaps that's really a problem with the math
82be108cc558 First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents: 7578
diff changeset
2006 // library...
82be108cc558 First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents: 7578
diff changeset
2007
82be108cc558 First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents: 7578
diff changeset
2008 // -*- 1 -*-
82be108cc558 First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents: 7578
diff changeset
2009 octave_value
82be108cc558 First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents: 7578
diff changeset
2010 elem_xpow (float a, const FloatMatrix& b)
82be108cc558 First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents: 7578
diff changeset
2011 {
82be108cc558 First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents: 7578
diff changeset
2012 octave_value retval;
82be108cc558 First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents: 7578
diff changeset
2013
82be108cc558 First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents: 7578
diff changeset
2014 octave_idx_type nr = b.rows ();
82be108cc558 First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents: 7578
diff changeset
2015 octave_idx_type nc = b.cols ();
82be108cc558 First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents: 7578
diff changeset
2016
82be108cc558 First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents: 7578
diff changeset
2017 float d1, d2;
82be108cc558 First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents: 7578
diff changeset
2018
82be108cc558 First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents: 7578
diff changeset
2019 if (a < 0.0 && ! b.all_integers (d1, d2))
82be108cc558 First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents: 7578
diff changeset
2020 {
82be108cc558 First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents: 7578
diff changeset
2021 FloatComplex atmp (a);
82be108cc558 First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents: 7578
diff changeset
2022 FloatComplexMatrix result (nr, nc);
82be108cc558 First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents: 7578
diff changeset
2023
82be108cc558 First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents: 7578
diff changeset
2024 for (octave_idx_type j = 0; j < nc; j++)
82be108cc558 First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents: 7578
diff changeset
2025 for (octave_idx_type i = 0; i < nr; i++)
82be108cc558 First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents: 7578
diff changeset
2026 {
82be108cc558 First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents: 7578
diff changeset
2027 OCTAVE_QUIT;
82be108cc558 First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents: 7578
diff changeset
2028 result (i, j) = std::pow (atmp, b (i, j));
82be108cc558 First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents: 7578
diff changeset
2029 }
82be108cc558 First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents: 7578
diff changeset
2030
82be108cc558 First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents: 7578
diff changeset
2031 retval = result;
82be108cc558 First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents: 7578
diff changeset
2032 }
82be108cc558 First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents: 7578
diff changeset
2033 else
82be108cc558 First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents: 7578
diff changeset
2034 {
82be108cc558 First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents: 7578
diff changeset
2035 FloatMatrix result (nr, nc);
82be108cc558 First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents: 7578
diff changeset
2036
82be108cc558 First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents: 7578
diff changeset
2037 for (octave_idx_type j = 0; j < nc; j++)
82be108cc558 First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents: 7578
diff changeset
2038 for (octave_idx_type i = 0; i < nr; i++)
82be108cc558 First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents: 7578
diff changeset
2039 {
82be108cc558 First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents: 7578
diff changeset
2040 OCTAVE_QUIT;
82be108cc558 First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents: 7578
diff changeset
2041 result (i, j) = std::pow (a, b (i, j));
82be108cc558 First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents: 7578
diff changeset
2042 }
82be108cc558 First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents: 7578
diff changeset
2043
82be108cc558 First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents: 7578
diff changeset
2044 retval = result;
82be108cc558 First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents: 7578
diff changeset
2045 }
82be108cc558 First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents: 7578
diff changeset
2046
82be108cc558 First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents: 7578
diff changeset
2047 return retval;
82be108cc558 First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents: 7578
diff changeset
2048 }
82be108cc558 First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents: 7578
diff changeset
2049
82be108cc558 First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents: 7578
diff changeset
2050 // -*- 2 -*-
82be108cc558 First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents: 7578
diff changeset
2051 octave_value
82be108cc558 First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents: 7578
diff changeset
2052 elem_xpow (float a, const FloatComplexMatrix& b)
82be108cc558 First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents: 7578
diff changeset
2053 {
82be108cc558 First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents: 7578
diff changeset
2054 octave_idx_type nr = b.rows ();
82be108cc558 First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents: 7578
diff changeset
2055 octave_idx_type nc = b.cols ();
82be108cc558 First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents: 7578
diff changeset
2056
82be108cc558 First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents: 7578
diff changeset
2057 FloatComplexMatrix result (nr, nc);
82be108cc558 First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents: 7578
diff changeset
2058 FloatComplex atmp (a);
82be108cc558 First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents: 7578
diff changeset
2059
82be108cc558 First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents: 7578
diff changeset
2060 for (octave_idx_type j = 0; j < nc; j++)
82be108cc558 First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents: 7578
diff changeset
2061 for (octave_idx_type i = 0; i < nr; i++)
82be108cc558 First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents: 7578
diff changeset
2062 {
82be108cc558 First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents: 7578
diff changeset
2063 OCTAVE_QUIT;
82be108cc558 First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents: 7578
diff changeset
2064 result (i, j) = std::pow (atmp, b (i, j));
82be108cc558 First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents: 7578
diff changeset
2065 }
82be108cc558 First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents: 7578
diff changeset
2066
82be108cc558 First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents: 7578
diff changeset
2067 return result;
82be108cc558 First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents: 7578
diff changeset
2068 }
82be108cc558 First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents: 7578
diff changeset
2069
82be108cc558 First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents: 7578
diff changeset
2070 // -*- 3 -*-
82be108cc558 First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents: 7578
diff changeset
2071 octave_value
82be108cc558 First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents: 7578
diff changeset
2072 elem_xpow (const FloatMatrix& a, float b)
82be108cc558 First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents: 7578
diff changeset
2073 {
82be108cc558 First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents: 7578
diff changeset
2074 octave_value retval;
82be108cc558 First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents: 7578
diff changeset
2075
82be108cc558 First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents: 7578
diff changeset
2076 octave_idx_type nr = a.rows ();
82be108cc558 First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents: 7578
diff changeset
2077 octave_idx_type nc = a.cols ();
82be108cc558 First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents: 7578
diff changeset
2078
8978
0a58c4cd1405 optimize element-wise power
Jaroslav Hajek <highegg@gmail.com>
parents: 8960
diff changeset
2079 if (! xisint (b) && a.any_element_is_negative ())
7789
82be108cc558 First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents: 7578
diff changeset
2080 {
82be108cc558 First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents: 7578
diff changeset
2081 FloatComplexMatrix result (nr, nc);
82be108cc558 First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents: 7578
diff changeset
2082
82be108cc558 First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents: 7578
diff changeset
2083 for (octave_idx_type j = 0; j < nc; j++)
82be108cc558 First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents: 7578
diff changeset
2084 for (octave_idx_type i = 0; i < nr; i++)
82be108cc558 First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents: 7578
diff changeset
2085 {
82be108cc558 First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents: 7578
diff changeset
2086 OCTAVE_QUIT;
82be108cc558 First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents: 7578
diff changeset
2087
82be108cc558 First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents: 7578
diff changeset
2088 FloatComplex atmp (a (i, j));
82be108cc558 First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents: 7578
diff changeset
2089
82be108cc558 First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents: 7578
diff changeset
2090 result (i, j) = std::pow (atmp, b);
82be108cc558 First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents: 7578
diff changeset
2091 }
82be108cc558 First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents: 7578
diff changeset
2092
82be108cc558 First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents: 7578
diff changeset
2093 retval = result;
82be108cc558 First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents: 7578
diff changeset
2094 }
82be108cc558 First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents: 7578
diff changeset
2095 else
82be108cc558 First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents: 7578
diff changeset
2096 {
82be108cc558 First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents: 7578
diff changeset
2097 FloatMatrix result (nr, nc);
82be108cc558 First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents: 7578
diff changeset
2098
82be108cc558 First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents: 7578
diff changeset
2099 for (octave_idx_type j = 0; j < nc; j++)
82be108cc558 First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents: 7578
diff changeset
2100 for (octave_idx_type i = 0; i < nr; i++)
82be108cc558 First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents: 7578
diff changeset
2101 {
82be108cc558 First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents: 7578
diff changeset
2102 OCTAVE_QUIT;
82be108cc558 First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents: 7578
diff changeset
2103 result (i, j) = std::pow (a (i, j), b);
82be108cc558 First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents: 7578
diff changeset
2104 }
82be108cc558 First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents: 7578
diff changeset
2105
82be108cc558 First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents: 7578
diff changeset
2106 retval = result;
82be108cc558 First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents: 7578
diff changeset
2107 }
82be108cc558 First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents: 7578
diff changeset
2108
82be108cc558 First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents: 7578
diff changeset
2109 return retval;
82be108cc558 First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents: 7578
diff changeset
2110 }
82be108cc558 First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents: 7578
diff changeset
2111
82be108cc558 First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents: 7578
diff changeset
2112 // -*- 4 -*-
82be108cc558 First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents: 7578
diff changeset
2113 octave_value
82be108cc558 First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents: 7578
diff changeset
2114 elem_xpow (const FloatMatrix& a, const FloatMatrix& b)
82be108cc558 First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents: 7578
diff changeset
2115 {
82be108cc558 First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents: 7578
diff changeset
2116 octave_value retval;
82be108cc558 First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents: 7578
diff changeset
2117
82be108cc558 First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents: 7578
diff changeset
2118 octave_idx_type nr = a.rows ();
82be108cc558 First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents: 7578
diff changeset
2119 octave_idx_type nc = a.cols ();
82be108cc558 First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents: 7578
diff changeset
2120
82be108cc558 First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents: 7578
diff changeset
2121 octave_idx_type b_nr = b.rows ();
82be108cc558 First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents: 7578
diff changeset
2122 octave_idx_type b_nc = b.cols ();
82be108cc558 First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents: 7578
diff changeset
2123
82be108cc558 First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents: 7578
diff changeset
2124 if (nr != b_nr || nc != b_nc)
82be108cc558 First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents: 7578
diff changeset
2125 {
82be108cc558 First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents: 7578
diff changeset
2126 gripe_nonconformant ("operator .^", nr, nc, b_nr, b_nc);
82be108cc558 First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents: 7578
diff changeset
2127 return octave_value ();
82be108cc558 First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents: 7578
diff changeset
2128 }
82be108cc558 First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents: 7578
diff changeset
2129
82be108cc558 First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents: 7578
diff changeset
2130 int convert_to_complex = 0;
82be108cc558 First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents: 7578
diff changeset
2131 for (octave_idx_type j = 0; j < nc; j++)
82be108cc558 First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents: 7578
diff changeset
2132 for (octave_idx_type i = 0; i < nr; i++)
82be108cc558 First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents: 7578
diff changeset
2133 {
82be108cc558 First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents: 7578
diff changeset
2134 OCTAVE_QUIT;
82be108cc558 First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents: 7578
diff changeset
2135 float atmp = a (i, j);
82be108cc558 First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents: 7578
diff changeset
2136 float btmp = b (i, j);
82be108cc558 First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents: 7578
diff changeset
2137 if (atmp < 0.0 && static_cast<int> (btmp) != btmp)
82be108cc558 First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents: 7578
diff changeset
2138 {
82be108cc558 First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents: 7578
diff changeset
2139 convert_to_complex = 1;
82be108cc558 First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents: 7578
diff changeset
2140 goto done;
82be108cc558 First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents: 7578
diff changeset
2141 }
82be108cc558 First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents: 7578
diff changeset
2142 }
82be108cc558 First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents: 7578
diff changeset
2143
82be108cc558 First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents: 7578
diff changeset
2144 done:
82be108cc558 First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents: 7578
diff changeset
2145
82be108cc558 First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents: 7578
diff changeset
2146 if (convert_to_complex)
82be108cc558 First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents: 7578
diff changeset
2147 {
82be108cc558 First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents: 7578
diff changeset
2148 FloatComplexMatrix complex_result (nr, nc);
82be108cc558 First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents: 7578
diff changeset
2149
82be108cc558 First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents: 7578
diff changeset
2150 for (octave_idx_type j = 0; j < nc; j++)
82be108cc558 First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents: 7578
diff changeset
2151 for (octave_idx_type i = 0; i < nr; i++)
82be108cc558 First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents: 7578
diff changeset
2152 {
82be108cc558 First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents: 7578
diff changeset
2153 OCTAVE_QUIT;
82be108cc558 First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents: 7578
diff changeset
2154 FloatComplex atmp (a (i, j));
82be108cc558 First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents: 7578
diff changeset
2155 FloatComplex btmp (b (i, j));
82be108cc558 First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents: 7578
diff changeset
2156 complex_result (i, j) = std::pow (atmp, btmp);
82be108cc558 First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents: 7578
diff changeset
2157 }
82be108cc558 First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents: 7578
diff changeset
2158
82be108cc558 First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents: 7578
diff changeset
2159 retval = complex_result;
82be108cc558 First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents: 7578
diff changeset
2160 }
82be108cc558 First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents: 7578
diff changeset
2161 else
82be108cc558 First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents: 7578
diff changeset
2162 {
82be108cc558 First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents: 7578
diff changeset
2163 FloatMatrix result (nr, nc);
82be108cc558 First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents: 7578
diff changeset
2164
82be108cc558 First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents: 7578
diff changeset
2165 for (octave_idx_type j = 0; j < nc; j++)
82be108cc558 First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents: 7578
diff changeset
2166 for (octave_idx_type i = 0; i < nr; i++)
82be108cc558 First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents: 7578
diff changeset
2167 {
82be108cc558 First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents: 7578
diff changeset
2168 OCTAVE_QUIT;
82be108cc558 First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents: 7578
diff changeset
2169 result (i, j) = std::pow (a (i, j), b (i, j));
82be108cc558 First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents: 7578
diff changeset
2170 }
82be108cc558 First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents: 7578
diff changeset
2171
82be108cc558 First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents: 7578
diff changeset
2172 retval = result;
82be108cc558 First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents: 7578
diff changeset
2173 }
82be108cc558 First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents: 7578
diff changeset
2174
82be108cc558 First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents: 7578
diff changeset
2175 return retval;
82be108cc558 First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents: 7578
diff changeset
2176 }
82be108cc558 First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents: 7578
diff changeset
2177
82be108cc558 First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents: 7578
diff changeset
2178 // -*- 5 -*-
82be108cc558 First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents: 7578
diff changeset
2179 octave_value
82be108cc558 First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents: 7578
diff changeset
2180 elem_xpow (const FloatMatrix& a, const FloatComplex& b)
82be108cc558 First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents: 7578
diff changeset
2181 {
82be108cc558 First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents: 7578
diff changeset
2182 octave_idx_type nr = a.rows ();
82be108cc558 First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents: 7578
diff changeset
2183 octave_idx_type nc = a.cols ();
82be108cc558 First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents: 7578
diff changeset
2184
82be108cc558 First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents: 7578
diff changeset
2185 FloatComplexMatrix result (nr, nc);
82be108cc558 First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents: 7578
diff changeset
2186
82be108cc558 First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents: 7578
diff changeset
2187 for (octave_idx_type j = 0; j < nc; j++)
82be108cc558 First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents: 7578
diff changeset
2188 for (octave_idx_type i = 0; i < nr; i++)
82be108cc558 First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents: 7578
diff changeset
2189 {
82be108cc558 First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents: 7578
diff changeset
2190 OCTAVE_QUIT;
82be108cc558 First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents: 7578
diff changeset
2191 result (i, j) = std::pow (FloatComplex (a (i, j)), b);
82be108cc558 First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents: 7578
diff changeset
2192 }
82be108cc558 First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents: 7578
diff changeset
2193
82be108cc558 First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents: 7578
diff changeset
2194 return result;
82be108cc558 First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents: 7578
diff changeset
2195 }
82be108cc558 First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents: 7578
diff changeset
2196
82be108cc558 First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents: 7578
diff changeset
2197 // -*- 6 -*-
82be108cc558 First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents: 7578
diff changeset
2198 octave_value
82be108cc558 First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents: 7578
diff changeset
2199 elem_xpow (const FloatMatrix& a, const FloatComplexMatrix& b)
82be108cc558 First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents: 7578
diff changeset
2200 {
82be108cc558 First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents: 7578
diff changeset
2201 octave_idx_type nr = a.rows ();
82be108cc558 First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents: 7578
diff changeset
2202 octave_idx_type nc = a.cols ();
82be108cc558 First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents: 7578
diff changeset
2203
82be108cc558 First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents: 7578
diff changeset
2204 octave_idx_type b_nr = b.rows ();
82be108cc558 First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents: 7578
diff changeset
2205 octave_idx_type b_nc = b.cols ();
82be108cc558 First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents: 7578
diff changeset
2206
82be108cc558 First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents: 7578
diff changeset
2207 if (nr != b_nr || nc != b_nc)
82be108cc558 First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents: 7578
diff changeset
2208 {
82be108cc558 First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents: 7578
diff changeset
2209 gripe_nonconformant ("operator .^", nr, nc, b_nr, b_nc);
82be108cc558 First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents: 7578
diff changeset
2210 return octave_value ();
82be108cc558 First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents: 7578
diff changeset
2211 }
82be108cc558 First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents: 7578
diff changeset
2212
82be108cc558 First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents: 7578
diff changeset
2213 FloatComplexMatrix result (nr, nc);
82be108cc558 First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents: 7578
diff changeset
2214
82be108cc558 First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents: 7578
diff changeset
2215 for (octave_idx_type j = 0; j < nc; j++)
82be108cc558 First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents: 7578
diff changeset
2216 for (octave_idx_type i = 0; i < nr; i++)
82be108cc558 First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents: 7578
diff changeset
2217 {
82be108cc558 First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents: 7578
diff changeset
2218 OCTAVE_QUIT;
82be108cc558 First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents: 7578
diff changeset
2219 result (i, j) = std::pow (FloatComplex (a (i, j)), b (i, j));
82be108cc558 First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents: 7578
diff changeset
2220 }
82be108cc558 First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents: 7578
diff changeset
2221
82be108cc558 First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents: 7578
diff changeset
2222 return result;
82be108cc558 First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents: 7578
diff changeset
2223 }
82be108cc558 First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents: 7578
diff changeset
2224
82be108cc558 First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents: 7578
diff changeset
2225 // -*- 7 -*-
82be108cc558 First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents: 7578
diff changeset
2226 octave_value
82be108cc558 First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents: 7578
diff changeset
2227 elem_xpow (const FloatComplex& a, const FloatMatrix& b)
82be108cc558 First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents: 7578
diff changeset
2228 {
82be108cc558 First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents: 7578
diff changeset
2229 octave_idx_type nr = b.rows ();
82be108cc558 First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents: 7578
diff changeset
2230 octave_idx_type nc = b.cols ();
82be108cc558 First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents: 7578
diff changeset
2231
82be108cc558 First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents: 7578
diff changeset
2232 FloatComplexMatrix result (nr, nc);
82be108cc558 First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents: 7578
diff changeset
2233
82be108cc558 First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents: 7578
diff changeset
2234 for (octave_idx_type j = 0; j < nc; j++)
82be108cc558 First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents: 7578
diff changeset
2235 for (octave_idx_type i = 0; i < nr; i++)
82be108cc558 First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents: 7578
diff changeset
2236 {
82be108cc558 First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents: 7578
diff changeset
2237 OCTAVE_QUIT;
82be108cc558 First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents: 7578
diff changeset
2238 float btmp = b (i, j);
82be108cc558 First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents: 7578
diff changeset
2239 if (xisint (btmp))
82be108cc558 First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents: 7578
diff changeset
2240 result (i, j) = std::pow (a, static_cast<int> (btmp));
82be108cc558 First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents: 7578
diff changeset
2241 else
82be108cc558 First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents: 7578
diff changeset
2242 result (i, j) = std::pow (a, btmp);
82be108cc558 First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents: 7578
diff changeset
2243 }
82be108cc558 First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents: 7578
diff changeset
2244
82be108cc558 First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents: 7578
diff changeset
2245 return result;
82be108cc558 First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents: 7578
diff changeset
2246 }
82be108cc558 First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents: 7578
diff changeset
2247
82be108cc558 First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents: 7578
diff changeset
2248 // -*- 8 -*-
82be108cc558 First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents: 7578
diff changeset
2249 octave_value
82be108cc558 First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents: 7578
diff changeset
2250 elem_xpow (const FloatComplex& a, const FloatComplexMatrix& b)
82be108cc558 First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents: 7578
diff changeset
2251 {
82be108cc558 First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents: 7578
diff changeset
2252 octave_idx_type nr = b.rows ();
82be108cc558 First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents: 7578
diff changeset
2253 octave_idx_type nc = b.cols ();
82be108cc558 First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents: 7578
diff changeset
2254
82be108cc558 First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents: 7578
diff changeset
2255 FloatComplexMatrix result (nr, nc);
82be108cc558 First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents: 7578
diff changeset
2256
82be108cc558 First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents: 7578
diff changeset
2257 for (octave_idx_type j = 0; j < nc; j++)
82be108cc558 First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents: 7578
diff changeset
2258 for (octave_idx_type i = 0; i < nr; i++)
82be108cc558 First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents: 7578
diff changeset
2259 {
82be108cc558 First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents: 7578
diff changeset
2260 OCTAVE_QUIT;
82be108cc558 First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents: 7578
diff changeset
2261 result (i, j) = std::pow (a, b (i, j));
82be108cc558 First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents: 7578
diff changeset
2262 }
82be108cc558 First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents: 7578
diff changeset
2263
82be108cc558 First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents: 7578
diff changeset
2264 return result;
82be108cc558 First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents: 7578
diff changeset
2265 }
82be108cc558 First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents: 7578
diff changeset
2266
82be108cc558 First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents: 7578
diff changeset
2267 // -*- 9 -*-
82be108cc558 First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents: 7578
diff changeset
2268 octave_value
82be108cc558 First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents: 7578
diff changeset
2269 elem_xpow (const FloatComplexMatrix& a, float b)
82be108cc558 First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents: 7578
diff changeset
2270 {
82be108cc558 First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents: 7578
diff changeset
2271 octave_idx_type nr = a.rows ();
82be108cc558 First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents: 7578
diff changeset
2272 octave_idx_type nc = a.cols ();
82be108cc558 First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents: 7578
diff changeset
2273
82be108cc558 First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents: 7578
diff changeset
2274 FloatComplexMatrix result (nr, nc);
82be108cc558 First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents: 7578
diff changeset
2275
82be108cc558 First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents: 7578
diff changeset
2276 if (xisint (b))
82be108cc558 First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents: 7578
diff changeset
2277 {
82be108cc558 First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents: 7578
diff changeset
2278 for (octave_idx_type j = 0; j < nc; j++)
82be108cc558 First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents: 7578
diff changeset
2279 for (octave_idx_type i = 0; i < nr; i++)
82be108cc558 First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents: 7578
diff changeset
2280 {
82be108cc558 First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents: 7578
diff changeset
2281 OCTAVE_QUIT;
82be108cc558 First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents: 7578
diff changeset
2282 result (i, j) = std::pow (a (i, j), static_cast<int> (b));
82be108cc558 First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents: 7578
diff changeset
2283 }
82be108cc558 First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents: 7578
diff changeset
2284 }
82be108cc558 First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents: 7578
diff changeset
2285 else
82be108cc558 First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents: 7578
diff changeset
2286 {
82be108cc558 First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents: 7578
diff changeset
2287 for (octave_idx_type j = 0; j < nc; j++)
82be108cc558 First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents: 7578
diff changeset
2288 for (octave_idx_type i = 0; i < nr; i++)
82be108cc558 First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents: 7578
diff changeset
2289 {
82be108cc558 First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents: 7578
diff changeset
2290 OCTAVE_QUIT;
82be108cc558 First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents: 7578
diff changeset
2291 result (i, j) = std::pow (a (i, j), b);
82be108cc558 First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents: 7578
diff changeset
2292 }
82be108cc558 First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents: 7578
diff changeset
2293 }
82be108cc558 First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents: 7578
diff changeset
2294
82be108cc558 First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents: 7578
diff changeset
2295 return result;
82be108cc558 First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents: 7578
diff changeset
2296 }
82be108cc558 First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents: 7578
diff changeset
2297
82be108cc558 First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents: 7578
diff changeset
2298 // -*- 10 -*-
82be108cc558 First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents: 7578
diff changeset
2299 octave_value
82be108cc558 First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents: 7578
diff changeset
2300 elem_xpow (const FloatComplexMatrix& a, const FloatMatrix& b)
82be108cc558 First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents: 7578
diff changeset
2301 {
82be108cc558 First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents: 7578
diff changeset
2302 octave_idx_type nr = a.rows ();
82be108cc558 First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents: 7578
diff changeset
2303 octave_idx_type nc = a.cols ();
82be108cc558 First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents: 7578
diff changeset
2304
82be108cc558 First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents: 7578
diff changeset
2305 octave_idx_type b_nr = b.rows ();
82be108cc558 First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents: 7578
diff changeset
2306 octave_idx_type b_nc = b.cols ();
82be108cc558 First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents: 7578
diff changeset
2307
82be108cc558 First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents: 7578
diff changeset
2308 if (nr != b_nr || nc != b_nc)
82be108cc558 First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents: 7578
diff changeset
2309 {
82be108cc558 First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents: 7578
diff changeset
2310 gripe_nonconformant ("operator .^", nr, nc, b_nr, b_nc);
82be108cc558 First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents: 7578
diff changeset
2311 return octave_value ();
82be108cc558 First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents: 7578
diff changeset
2312 }
82be108cc558 First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents: 7578
diff changeset
2313
82be108cc558 First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents: 7578
diff changeset
2314 FloatComplexMatrix result (nr, nc);
82be108cc558 First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents: 7578
diff changeset
2315
82be108cc558 First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents: 7578
diff changeset
2316 for (octave_idx_type j = 0; j < nc; j++)
82be108cc558 First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents: 7578
diff changeset
2317 for (octave_idx_type i = 0; i < nr; i++)
82be108cc558 First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents: 7578
diff changeset
2318 {
82be108cc558 First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents: 7578
diff changeset
2319 OCTAVE_QUIT;
82be108cc558 First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents: 7578
diff changeset
2320 float btmp = b (i, j);
82be108cc558 First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents: 7578
diff changeset
2321 if (xisint (btmp))
82be108cc558 First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents: 7578
diff changeset
2322 result (i, j) = std::pow (a (i, j), static_cast<int> (btmp));
82be108cc558 First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents: 7578
diff changeset
2323 else
82be108cc558 First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents: 7578
diff changeset
2324 result (i, j) = std::pow (a (i, j), btmp);
82be108cc558 First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents: 7578
diff changeset
2325 }
82be108cc558 First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents: 7578
diff changeset
2326
82be108cc558 First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents: 7578
diff changeset
2327 return result;
82be108cc558 First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents: 7578
diff changeset
2328 }
82be108cc558 First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents: 7578
diff changeset
2329
82be108cc558 First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents: 7578
diff changeset
2330 // -*- 11 -*-
82be108cc558 First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents: 7578
diff changeset
2331 octave_value
82be108cc558 First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents: 7578
diff changeset
2332 elem_xpow (const FloatComplexMatrix& a, const FloatComplex& b)
82be108cc558 First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents: 7578
diff changeset
2333 {
82be108cc558 First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents: 7578
diff changeset
2334 octave_idx_type nr = a.rows ();
82be108cc558 First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents: 7578
diff changeset
2335 octave_idx_type nc = a.cols ();
82be108cc558 First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents: 7578
diff changeset
2336
82be108cc558 First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents: 7578
diff changeset
2337 FloatComplexMatrix result (nr, nc);
82be108cc558 First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents: 7578
diff changeset
2338
82be108cc558 First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents: 7578
diff changeset
2339 for (octave_idx_type j = 0; j < nc; j++)
82be108cc558 First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents: 7578
diff changeset
2340 for (octave_idx_type i = 0; i < nr; i++)
82be108cc558 First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents: 7578
diff changeset
2341 {
82be108cc558 First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents: 7578
diff changeset
2342 OCTAVE_QUIT;
82be108cc558 First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents: 7578
diff changeset
2343 result (i, j) = std::pow (a (i, j), b);
82be108cc558 First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents: 7578
diff changeset
2344 }
82be108cc558 First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents: 7578
diff changeset
2345
82be108cc558 First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents: 7578
diff changeset
2346 return result;
82be108cc558 First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents: 7578
diff changeset
2347 }
82be108cc558 First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents: 7578
diff changeset
2348
82be108cc558 First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents: 7578
diff changeset
2349 // -*- 12 -*-
82be108cc558 First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents: 7578
diff changeset
2350 octave_value
82be108cc558 First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents: 7578
diff changeset
2351 elem_xpow (const FloatComplexMatrix& a, const FloatComplexMatrix& b)
82be108cc558 First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents: 7578
diff changeset
2352 {
82be108cc558 First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents: 7578
diff changeset
2353 octave_idx_type nr = a.rows ();
82be108cc558 First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents: 7578
diff changeset
2354 octave_idx_type nc = a.cols ();
82be108cc558 First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents: 7578
diff changeset
2355
82be108cc558 First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents: 7578
diff changeset
2356 octave_idx_type b_nr = b.rows ();
82be108cc558 First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents: 7578
diff changeset
2357 octave_idx_type b_nc = b.cols ();
82be108cc558 First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents: 7578
diff changeset
2358
82be108cc558 First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents: 7578
diff changeset
2359 if (nr != b_nr || nc != b_nc)
82be108cc558 First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents: 7578
diff changeset
2360 {
82be108cc558 First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents: 7578
diff changeset
2361 gripe_nonconformant ("operator .^", nr, nc, b_nr, b_nc);
82be108cc558 First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents: 7578
diff changeset
2362 return octave_value ();
82be108cc558 First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents: 7578
diff changeset
2363 }
82be108cc558 First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents: 7578
diff changeset
2364
82be108cc558 First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents: 7578
diff changeset
2365 FloatComplexMatrix result (nr, nc);
82be108cc558 First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents: 7578
diff changeset
2366
82be108cc558 First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents: 7578
diff changeset
2367 for (octave_idx_type j = 0; j < nc; j++)
82be108cc558 First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents: 7578
diff changeset
2368 for (octave_idx_type i = 0; i < nr; i++)
82be108cc558 First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents: 7578
diff changeset
2369 {
82be108cc558 First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents: 7578
diff changeset
2370 OCTAVE_QUIT;
82be108cc558 First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents: 7578
diff changeset
2371 result (i, j) = std::pow (a (i, j), b (i, j));
82be108cc558 First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents: 7578
diff changeset
2372 }
82be108cc558 First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents: 7578
diff changeset
2373
82be108cc558 First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents: 7578
diff changeset
2374 return result;
82be108cc558 First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents: 7578
diff changeset
2375 }
82be108cc558 First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents: 7578
diff changeset
2376
82be108cc558 First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents: 7578
diff changeset
2377 // Safer pow functions that work elementwise for N-d arrays.
82be108cc558 First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents: 7578
diff changeset
2378 //
82be108cc558 First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents: 7578
diff changeset
2379 // op2 \ op1: s nd cs cnd
82be108cc558 First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents: 7578
diff changeset
2380 // +-- +---+---+----+----+
82be108cc558 First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents: 7578
diff changeset
2381 // scalar | | * | 3 | * | 9 |
82be108cc558 First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents: 7578
diff changeset
2382 // +---+---+----+----+
82be108cc558 First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents: 7578
diff changeset
2383 // N_d | 1 | 4 | 7 | 10 |
82be108cc558 First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents: 7578
diff changeset
2384 // +---+---+----+----+
82be108cc558 First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents: 7578
diff changeset
2385 // complex_scalar | * | 5 | * | 11 |
82be108cc558 First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents: 7578
diff changeset
2386 // +---+---+----+----+
82be108cc558 First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents: 7578
diff changeset
2387 // complex_N_d | 2 | 6 | 8 | 12 |
82be108cc558 First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents: 7578
diff changeset
2388 // +---+---+----+----+
82be108cc558 First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents: 7578
diff changeset
2389 //
82be108cc558 First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents: 7578
diff changeset
2390 // * -> not needed.
82be108cc558 First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents: 7578
diff changeset
2391
82be108cc558 First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents: 7578
diff changeset
2392 // FIXME -- these functions need to be fixed so that things
82be108cc558 First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents: 7578
diff changeset
2393 // like
82be108cc558 First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents: 7578
diff changeset
2394 //
82be108cc558 First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents: 7578
diff changeset
2395 // a = -1; b = [ 0, 0.5, 1 ]; r = a .^ b
82be108cc558 First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents: 7578
diff changeset
2396 //
82be108cc558 First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents: 7578
diff changeset
2397 // and
82be108cc558 First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents: 7578
diff changeset
2398 //
82be108cc558 First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents: 7578
diff changeset
2399 // a = -1; b = [ 0, 0.5, 1 ]; for i = 1:3, r(i) = a .^ b(i), end
82be108cc558 First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents: 7578
diff changeset
2400 //
82be108cc558 First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents: 7578
diff changeset
2401 // produce identical results. Also, it would be nice if -1^0.5
82be108cc558 First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents: 7578
diff changeset
2402 // produced a pure imaginary result instead of a complex number with a
82be108cc558 First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents: 7578
diff changeset
2403 // small real part. But perhaps that's really a problem with the math
82be108cc558 First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents: 7578
diff changeset
2404 // library...
82be108cc558 First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents: 7578
diff changeset
2405
82be108cc558 First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents: 7578
diff changeset
2406 // -*- 1 -*-
82be108cc558 First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents: 7578
diff changeset
2407 octave_value
82be108cc558 First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents: 7578
diff changeset
2408 elem_xpow (float a, const FloatNDArray& b)
82be108cc558 First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents: 7578
diff changeset
2409 {
82be108cc558 First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents: 7578
diff changeset
2410 octave_value retval;
82be108cc558 First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents: 7578
diff changeset
2411
82be108cc558 First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents: 7578
diff changeset
2412 float d1, d2;
82be108cc558 First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents: 7578
diff changeset
2413
82be108cc558 First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents: 7578
diff changeset
2414 if (a < 0.0 && ! b.all_integers (d1, d2))
82be108cc558 First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents: 7578
diff changeset
2415 {
82be108cc558 First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents: 7578
diff changeset
2416 FloatComplex atmp (a);
82be108cc558 First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents: 7578
diff changeset
2417 FloatComplexNDArray result (b.dims ());
82be108cc558 First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents: 7578
diff changeset
2418 for (octave_idx_type i = 0; i < b.length (); i++)
82be108cc558 First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents: 7578
diff changeset
2419 {
82be108cc558 First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents: 7578
diff changeset
2420 OCTAVE_QUIT;
82be108cc558 First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents: 7578
diff changeset
2421 result(i) = std::pow (atmp, b(i));
82be108cc558 First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents: 7578
diff changeset
2422 }
82be108cc558 First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents: 7578
diff changeset
2423
82be108cc558 First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents: 7578
diff changeset
2424 retval = result;
82be108cc558 First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents: 7578
diff changeset
2425 }
82be108cc558 First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents: 7578
diff changeset
2426 else
82be108cc558 First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents: 7578
diff changeset
2427 {
82be108cc558 First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents: 7578
diff changeset
2428 FloatNDArray result (b.dims ());
82be108cc558 First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents: 7578
diff changeset
2429 for (octave_idx_type i = 0; i < b.length (); i++)
82be108cc558 First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents: 7578
diff changeset
2430 {
82be108cc558 First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents: 7578
diff changeset
2431 OCTAVE_QUIT;
82be108cc558 First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents: 7578
diff changeset
2432 result (i) = std::pow (a, b(i));
82be108cc558 First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents: 7578
diff changeset
2433 }
82be108cc558 First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents: 7578
diff changeset
2434
82be108cc558 First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents: 7578
diff changeset
2435 retval = result;
82be108cc558 First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents: 7578
diff changeset
2436 }
82be108cc558 First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents: 7578
diff changeset
2437
82be108cc558 First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents: 7578
diff changeset
2438 return retval;
82be108cc558 First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents: 7578
diff changeset
2439 }
82be108cc558 First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents: 7578
diff changeset
2440
82be108cc558 First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents: 7578
diff changeset
2441 // -*- 2 -*-
82be108cc558 First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents: 7578
diff changeset
2442 octave_value
82be108cc558 First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents: 7578
diff changeset
2443 elem_xpow (float a, const FloatComplexNDArray& b)
82be108cc558 First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents: 7578
diff changeset
2444 {
82be108cc558 First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents: 7578
diff changeset
2445 FloatComplexNDArray result (b.dims ());
82be108cc558 First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents: 7578
diff changeset
2446 FloatComplex atmp (a);
82be108cc558 First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents: 7578
diff changeset
2447
82be108cc558 First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents: 7578
diff changeset
2448 for (octave_idx_type i = 0; i < b.length (); i++)
82be108cc558 First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents: 7578
diff changeset
2449 {
82be108cc558 First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents: 7578
diff changeset
2450 OCTAVE_QUIT;
82be108cc558 First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents: 7578
diff changeset
2451 result(i) = std::pow (atmp, b(i));
82be108cc558 First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents: 7578
diff changeset
2452 }
82be108cc558 First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents: 7578
diff changeset
2453
82be108cc558 First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents: 7578
diff changeset
2454 return result;
82be108cc558 First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents: 7578
diff changeset
2455 }
82be108cc558 First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents: 7578
diff changeset
2456
82be108cc558 First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents: 7578
diff changeset
2457 // -*- 3 -*-
82be108cc558 First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents: 7578
diff changeset
2458 octave_value
82be108cc558 First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents: 7578
diff changeset
2459 elem_xpow (const FloatNDArray& a, float b)
82be108cc558 First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents: 7578
diff changeset
2460 {
82be108cc558 First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents: 7578
diff changeset
2461 octave_value retval;
82be108cc558 First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents: 7578
diff changeset
2462
8978
0a58c4cd1405 optimize element-wise power
Jaroslav Hajek <highegg@gmail.com>
parents: 8960
diff changeset
2463 if (! xisint (b))
7789
82be108cc558 First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents: 7578
diff changeset
2464 {
8978
0a58c4cd1405 optimize element-wise power
Jaroslav Hajek <highegg@gmail.com>
parents: 8960
diff changeset
2465 if (a.any_element_is_negative ())
0a58c4cd1405 optimize element-wise power
Jaroslav Hajek <highegg@gmail.com>
parents: 8960
diff changeset
2466 {
0a58c4cd1405 optimize element-wise power
Jaroslav Hajek <highegg@gmail.com>
parents: 8960
diff changeset
2467 FloatComplexNDArray result (a.dims ());
0a58c4cd1405 optimize element-wise power
Jaroslav Hajek <highegg@gmail.com>
parents: 8960
diff changeset
2468
0a58c4cd1405 optimize element-wise power
Jaroslav Hajek <highegg@gmail.com>
parents: 8960
diff changeset
2469 for (octave_idx_type i = 0; i < a.length (); i++)
0a58c4cd1405 optimize element-wise power
Jaroslav Hajek <highegg@gmail.com>
parents: 8960
diff changeset
2470 {
0a58c4cd1405 optimize element-wise power
Jaroslav Hajek <highegg@gmail.com>
parents: 8960
diff changeset
2471 OCTAVE_QUIT;
0a58c4cd1405 optimize element-wise power
Jaroslav Hajek <highegg@gmail.com>
parents: 8960
diff changeset
2472
0a58c4cd1405 optimize element-wise power
Jaroslav Hajek <highegg@gmail.com>
parents: 8960
diff changeset
2473 FloatComplex atmp (a (i));
0a58c4cd1405 optimize element-wise power
Jaroslav Hajek <highegg@gmail.com>
parents: 8960
diff changeset
2474
0a58c4cd1405 optimize element-wise power
Jaroslav Hajek <highegg@gmail.com>
parents: 8960
diff changeset
2475 result(i) = std::pow (atmp, b);
0a58c4cd1405 optimize element-wise power
Jaroslav Hajek <highegg@gmail.com>
parents: 8960
diff changeset
2476 }
0a58c4cd1405 optimize element-wise power
Jaroslav Hajek <highegg@gmail.com>
parents: 8960
diff changeset
2477
0a58c4cd1405 optimize element-wise power
Jaroslav Hajek <highegg@gmail.com>
parents: 8960
diff changeset
2478 retval = result;
0a58c4cd1405 optimize element-wise power
Jaroslav Hajek <highegg@gmail.com>
parents: 8960
diff changeset
2479 }
0a58c4cd1405 optimize element-wise power
Jaroslav Hajek <highegg@gmail.com>
parents: 8960
diff changeset
2480 else
0a58c4cd1405 optimize element-wise power
Jaroslav Hajek <highegg@gmail.com>
parents: 8960
diff changeset
2481 {
0a58c4cd1405 optimize element-wise power
Jaroslav Hajek <highegg@gmail.com>
parents: 8960
diff changeset
2482 FloatNDArray result (a.dims ());
0a58c4cd1405 optimize element-wise power
Jaroslav Hajek <highegg@gmail.com>
parents: 8960
diff changeset
2483 for (octave_idx_type i = 0; i < a.length (); i++)
0a58c4cd1405 optimize element-wise power
Jaroslav Hajek <highegg@gmail.com>
parents: 8960
diff changeset
2484 {
0a58c4cd1405 optimize element-wise power
Jaroslav Hajek <highegg@gmail.com>
parents: 8960
diff changeset
2485 OCTAVE_QUIT;
0a58c4cd1405 optimize element-wise power
Jaroslav Hajek <highegg@gmail.com>
parents: 8960
diff changeset
2486 result(i) = std::pow (a(i), b);
0a58c4cd1405 optimize element-wise power
Jaroslav Hajek <highegg@gmail.com>
parents: 8960
diff changeset
2487 }
0a58c4cd1405 optimize element-wise power
Jaroslav Hajek <highegg@gmail.com>
parents: 8960
diff changeset
2488
0a58c4cd1405 optimize element-wise power
Jaroslav Hajek <highegg@gmail.com>
parents: 8960
diff changeset
2489 retval = result;
0a58c4cd1405 optimize element-wise power
Jaroslav Hajek <highegg@gmail.com>
parents: 8960
diff changeset
2490 }
7789
82be108cc558 First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents: 7578
diff changeset
2491 }
82be108cc558 First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents: 7578
diff changeset
2492 else
82be108cc558 First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents: 7578
diff changeset
2493 {
82be108cc558 First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents: 7578
diff changeset
2494 FloatNDArray result (a.dims ());
82be108cc558 First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents: 7578
diff changeset
2495
8978
0a58c4cd1405 optimize element-wise power
Jaroslav Hajek <highegg@gmail.com>
parents: 8960
diff changeset
2496 int ib = static_cast<int> (b);
0a58c4cd1405 optimize element-wise power
Jaroslav Hajek <highegg@gmail.com>
parents: 8960
diff changeset
2497 if (ib == 2)
0a58c4cd1405 optimize element-wise power
Jaroslav Hajek <highegg@gmail.com>
parents: 8960
diff changeset
2498 {
0a58c4cd1405 optimize element-wise power
Jaroslav Hajek <highegg@gmail.com>
parents: 8960
diff changeset
2499 for (octave_idx_type i = 0; i < a.length (); i++)
0a58c4cd1405 optimize element-wise power
Jaroslav Hajek <highegg@gmail.com>
parents: 8960
diff changeset
2500 result.xelem (i) = a(i) * a(i);
0a58c4cd1405 optimize element-wise power
Jaroslav Hajek <highegg@gmail.com>
parents: 8960
diff changeset
2501 }
8979
a7c00773a089 optimize also .^-1 case
Jaroslav Hajek <highegg@gmail.com>
parents: 8978
diff changeset
2502 else if (ib == -1)
a7c00773a089 optimize also .^-1 case
Jaroslav Hajek <highegg@gmail.com>
parents: 8978
diff changeset
2503 {
a7c00773a089 optimize also .^-1 case
Jaroslav Hajek <highegg@gmail.com>
parents: 8978
diff changeset
2504 for (octave_idx_type i = 0; i < a.length (); i++)
a7c00773a089 optimize also .^-1 case
Jaroslav Hajek <highegg@gmail.com>
parents: 8978
diff changeset
2505 result.xelem (i) = 1.0f / a(i);
a7c00773a089 optimize also .^-1 case
Jaroslav Hajek <highegg@gmail.com>
parents: 8978
diff changeset
2506 }
8978
0a58c4cd1405 optimize element-wise power
Jaroslav Hajek <highegg@gmail.com>
parents: 8960
diff changeset
2507 else
0a58c4cd1405 optimize element-wise power
Jaroslav Hajek <highegg@gmail.com>
parents: 8960
diff changeset
2508 {
0a58c4cd1405 optimize element-wise power
Jaroslav Hajek <highegg@gmail.com>
parents: 8960
diff changeset
2509 for (octave_idx_type i = 0; i < a.length (); i++)
0a58c4cd1405 optimize element-wise power
Jaroslav Hajek <highegg@gmail.com>
parents: 8960
diff changeset
2510 {
0a58c4cd1405 optimize element-wise power
Jaroslav Hajek <highegg@gmail.com>
parents: 8960
diff changeset
2511 OCTAVE_QUIT;
0a58c4cd1405 optimize element-wise power
Jaroslav Hajek <highegg@gmail.com>
parents: 8960
diff changeset
2512 result(i) = std::pow (a(i), ib);
0a58c4cd1405 optimize element-wise power
Jaroslav Hajek <highegg@gmail.com>
parents: 8960
diff changeset
2513 }
0a58c4cd1405 optimize element-wise power
Jaroslav Hajek <highegg@gmail.com>
parents: 8960
diff changeset
2514 }
7789
82be108cc558 First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents: 7578
diff changeset
2515
82be108cc558 First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents: 7578
diff changeset
2516 retval = result;
82be108cc558 First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents: 7578
diff changeset
2517 }
82be108cc558 First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents: 7578
diff changeset
2518
82be108cc558 First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents: 7578
diff changeset
2519 return retval;
82be108cc558 First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents: 7578
diff changeset
2520 }
82be108cc558 First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents: 7578
diff changeset
2521
82be108cc558 First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents: 7578
diff changeset
2522 // -*- 4 -*-
82be108cc558 First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents: 7578
diff changeset
2523 octave_value
82be108cc558 First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents: 7578
diff changeset
2524 elem_xpow (const FloatNDArray& a, const FloatNDArray& b)
82be108cc558 First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents: 7578
diff changeset
2525 {
82be108cc558 First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents: 7578
diff changeset
2526 octave_value retval;
82be108cc558 First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents: 7578
diff changeset
2527
82be108cc558 First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents: 7578
diff changeset
2528 dim_vector a_dims = a.dims ();
82be108cc558 First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents: 7578
diff changeset
2529 dim_vector b_dims = b.dims ();
82be108cc558 First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents: 7578
diff changeset
2530
82be108cc558 First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents: 7578
diff changeset
2531 if (a_dims != b_dims)
82be108cc558 First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents: 7578
diff changeset
2532 {
82be108cc558 First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents: 7578
diff changeset
2533 gripe_nonconformant ("operator .^", a_dims, b_dims);
82be108cc558 First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents: 7578
diff changeset
2534 return octave_value ();
82be108cc558 First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents: 7578
diff changeset
2535 }
82be108cc558 First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents: 7578
diff changeset
2536
82be108cc558 First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents: 7578
diff changeset
2537 int len = a.length ();
82be108cc558 First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents: 7578
diff changeset
2538
82be108cc558 First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents: 7578
diff changeset
2539 bool convert_to_complex = false;
82be108cc558 First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents: 7578
diff changeset
2540
82be108cc558 First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents: 7578
diff changeset
2541 for (octave_idx_type i = 0; i < len; i++)
82be108cc558 First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents: 7578
diff changeset
2542 {
82be108cc558 First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents: 7578
diff changeset
2543 OCTAVE_QUIT;
82be108cc558 First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents: 7578
diff changeset
2544 float atmp = a(i);
82be108cc558 First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents: 7578
diff changeset
2545 float btmp = b(i);
82be108cc558 First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents: 7578
diff changeset
2546 if (atmp < 0.0 && static_cast<int> (btmp) != btmp)
82be108cc558 First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents: 7578
diff changeset
2547 {
82be108cc558 First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents: 7578
diff changeset
2548 convert_to_complex = true;
82be108cc558 First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents: 7578
diff changeset
2549 goto done;
82be108cc558 First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents: 7578
diff changeset
2550 }
82be108cc558 First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents: 7578
diff changeset
2551 }
82be108cc558 First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents: 7578
diff changeset
2552
82be108cc558 First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents: 7578
diff changeset
2553 done:
82be108cc558 First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents: 7578
diff changeset
2554
82be108cc558 First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents: 7578
diff changeset
2555 if (convert_to_complex)
82be108cc558 First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents: 7578
diff changeset
2556 {
82be108cc558 First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents: 7578
diff changeset
2557 FloatComplexNDArray complex_result (a_dims);
82be108cc558 First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents: 7578
diff changeset
2558
82be108cc558 First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents: 7578
diff changeset
2559 for (octave_idx_type i = 0; i < len; i++)
82be108cc558 First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents: 7578
diff changeset
2560 {
82be108cc558 First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents: 7578
diff changeset
2561 OCTAVE_QUIT;
82be108cc558 First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents: 7578
diff changeset
2562 FloatComplex atmp (a(i));
82be108cc558 First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents: 7578
diff changeset
2563 FloatComplex btmp (b(i));
82be108cc558 First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents: 7578
diff changeset
2564 complex_result(i) = std::pow (atmp, btmp);
82be108cc558 First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents: 7578
diff changeset
2565 }
82be108cc558 First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents: 7578
diff changeset
2566
82be108cc558 First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents: 7578
diff changeset
2567 retval = complex_result;
82be108cc558 First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents: 7578
diff changeset
2568 }
82be108cc558 First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents: 7578
diff changeset
2569 else
82be108cc558 First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents: 7578
diff changeset
2570 {
82be108cc558 First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents: 7578
diff changeset
2571 FloatNDArray result (a_dims);
82be108cc558 First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents: 7578
diff changeset
2572
82be108cc558 First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents: 7578
diff changeset
2573 for (octave_idx_type i = 0; i < len; i++)
82be108cc558 First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents: 7578
diff changeset
2574 {
82be108cc558 First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents: 7578
diff changeset
2575 OCTAVE_QUIT;
82be108cc558 First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents: 7578
diff changeset
2576 result(i) = std::pow (a(i), b(i));
82be108cc558 First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents: 7578
diff changeset
2577 }
82be108cc558 First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents: 7578
diff changeset
2578
82be108cc558 First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents: 7578
diff changeset
2579 retval = result;
82be108cc558 First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents: 7578
diff changeset
2580 }
82be108cc558 First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents: 7578
diff changeset
2581
82be108cc558 First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents: 7578
diff changeset
2582 return retval;
82be108cc558 First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents: 7578
diff changeset
2583 }
82be108cc558 First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents: 7578
diff changeset
2584
82be108cc558 First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents: 7578
diff changeset
2585 // -*- 5 -*-
82be108cc558 First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents: 7578
diff changeset
2586 octave_value
82be108cc558 First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents: 7578
diff changeset
2587 elem_xpow (const FloatNDArray& a, const FloatComplex& b)
82be108cc558 First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents: 7578
diff changeset
2588 {
82be108cc558 First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents: 7578
diff changeset
2589 FloatComplexNDArray result (a.dims ());
82be108cc558 First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents: 7578
diff changeset
2590
82be108cc558 First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents: 7578
diff changeset
2591 for (octave_idx_type i = 0; i < a.length (); i++)
82be108cc558 First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents: 7578
diff changeset
2592 {
82be108cc558 First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents: 7578
diff changeset
2593 OCTAVE_QUIT;
82be108cc558 First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents: 7578
diff changeset
2594 result(i) = std::pow (FloatComplex (a(i)), b);
82be108cc558 First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents: 7578
diff changeset
2595 }
82be108cc558 First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents: 7578
diff changeset
2596
82be108cc558 First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents: 7578
diff changeset
2597 return result;
82be108cc558 First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents: 7578
diff changeset
2598 }
82be108cc558 First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents: 7578
diff changeset
2599
82be108cc558 First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents: 7578
diff changeset
2600 // -*- 6 -*-
82be108cc558 First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents: 7578
diff changeset
2601 octave_value
82be108cc558 First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents: 7578
diff changeset
2602 elem_xpow (const FloatNDArray& a, const FloatComplexNDArray& b)
82be108cc558 First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents: 7578
diff changeset
2603 {
82be108cc558 First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents: 7578
diff changeset
2604 dim_vector a_dims = a.dims ();
82be108cc558 First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents: 7578
diff changeset
2605 dim_vector b_dims = b.dims ();
82be108cc558 First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents: 7578
diff changeset
2606
82be108cc558 First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents: 7578
diff changeset
2607 if (a_dims != b_dims)
82be108cc558 First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents: 7578
diff changeset
2608 {
82be108cc558 First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents: 7578
diff changeset
2609 gripe_nonconformant ("operator .^", a_dims, b_dims);
82be108cc558 First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents: 7578
diff changeset
2610 return octave_value ();
82be108cc558 First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents: 7578
diff changeset
2611 }
82be108cc558 First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents: 7578
diff changeset
2612
82be108cc558 First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents: 7578
diff changeset
2613 FloatComplexNDArray result (a_dims);
82be108cc558 First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents: 7578
diff changeset
2614
82be108cc558 First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents: 7578
diff changeset
2615 for (octave_idx_type i = 0; i < a.length (); i++)
82be108cc558 First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents: 7578
diff changeset
2616 {
82be108cc558 First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents: 7578
diff changeset
2617 OCTAVE_QUIT;
82be108cc558 First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents: 7578
diff changeset
2618 result(i) = std::pow (FloatComplex (a(i)), b(i));
82be108cc558 First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents: 7578
diff changeset
2619 }
82be108cc558 First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents: 7578
diff changeset
2620
82be108cc558 First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents: 7578
diff changeset
2621 return result;
82be108cc558 First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents: 7578
diff changeset
2622 }
82be108cc558 First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents: 7578
diff changeset
2623
82be108cc558 First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents: 7578
diff changeset
2624 // -*- 7 -*-
82be108cc558 First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents: 7578
diff changeset
2625 octave_value
82be108cc558 First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents: 7578
diff changeset
2626 elem_xpow (const FloatComplex& a, const FloatNDArray& b)
82be108cc558 First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents: 7578
diff changeset
2627 {
82be108cc558 First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents: 7578
diff changeset
2628 FloatComplexNDArray result (b.dims ());
82be108cc558 First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents: 7578
diff changeset
2629
82be108cc558 First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents: 7578
diff changeset
2630 for (octave_idx_type i = 0; i < b.length (); i++)
82be108cc558 First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents: 7578
diff changeset
2631 {
82be108cc558 First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents: 7578
diff changeset
2632 OCTAVE_QUIT;
82be108cc558 First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents: 7578
diff changeset
2633 float btmp = b(i);
82be108cc558 First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents: 7578
diff changeset
2634 if (xisint (btmp))
82be108cc558 First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents: 7578
diff changeset
2635 result(i) = std::pow (a, static_cast<int> (btmp));
82be108cc558 First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents: 7578
diff changeset
2636 else
82be108cc558 First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents: 7578
diff changeset
2637 result(i) = std::pow (a, btmp);
82be108cc558 First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents: 7578
diff changeset
2638 }
82be108cc558 First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents: 7578
diff changeset
2639
82be108cc558 First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents: 7578
diff changeset
2640 return result;
82be108cc558 First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents: 7578
diff changeset
2641 }
82be108cc558 First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents: 7578
diff changeset
2642
82be108cc558 First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents: 7578
diff changeset
2643 // -*- 8 -*-
82be108cc558 First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents: 7578
diff changeset
2644 octave_value
82be108cc558 First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents: 7578
diff changeset
2645 elem_xpow (const FloatComplex& a, const FloatComplexNDArray& b)
82be108cc558 First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents: 7578
diff changeset
2646 {
82be108cc558 First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents: 7578
diff changeset
2647 FloatComplexNDArray result (b.dims ());
82be108cc558 First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents: 7578
diff changeset
2648
82be108cc558 First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents: 7578
diff changeset
2649 for (octave_idx_type i = 0; i < b.length (); i++)
82be108cc558 First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents: 7578
diff changeset
2650 {
82be108cc558 First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents: 7578
diff changeset
2651 OCTAVE_QUIT;
82be108cc558 First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents: 7578
diff changeset
2652 result(i) = std::pow (a, b(i));
82be108cc558 First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents: 7578
diff changeset
2653 }
82be108cc558 First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents: 7578
diff changeset
2654
82be108cc558 First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents: 7578
diff changeset
2655 return result;
82be108cc558 First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents: 7578
diff changeset
2656 }
82be108cc558 First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents: 7578
diff changeset
2657
82be108cc558 First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents: 7578
diff changeset
2658 // -*- 9 -*-
82be108cc558 First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents: 7578
diff changeset
2659 octave_value
82be108cc558 First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents: 7578
diff changeset
2660 elem_xpow (const FloatComplexNDArray& a, float b)
82be108cc558 First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents: 7578
diff changeset
2661 {
82be108cc558 First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents: 7578
diff changeset
2662 FloatComplexNDArray result (a.dims ());
82be108cc558 First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents: 7578
diff changeset
2663
82be108cc558 First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents: 7578
diff changeset
2664 if (xisint (b))
82be108cc558 First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents: 7578
diff changeset
2665 {
8979
a7c00773a089 optimize also .^-1 case
Jaroslav Hajek <highegg@gmail.com>
parents: 8978
diff changeset
2666 if (b == -1)
a7c00773a089 optimize also .^-1 case
Jaroslav Hajek <highegg@gmail.com>
parents: 8978
diff changeset
2667 {
a7c00773a089 optimize also .^-1 case
Jaroslav Hajek <highegg@gmail.com>
parents: 8978
diff changeset
2668 for (octave_idx_type i = 0; i < a.length (); i++)
a7c00773a089 optimize also .^-1 case
Jaroslav Hajek <highegg@gmail.com>
parents: 8978
diff changeset
2669 result.xelem (i) = std::conj (a(i)) / std::norm (a(i));
a7c00773a089 optimize also .^-1 case
Jaroslav Hajek <highegg@gmail.com>
parents: 8978
diff changeset
2670 }
a7c00773a089 optimize also .^-1 case
Jaroslav Hajek <highegg@gmail.com>
parents: 8978
diff changeset
2671 else
a7c00773a089 optimize also .^-1 case
Jaroslav Hajek <highegg@gmail.com>
parents: 8978
diff changeset
2672 {
a7c00773a089 optimize also .^-1 case
Jaroslav Hajek <highegg@gmail.com>
parents: 8978
diff changeset
2673 for (octave_idx_type i = 0; i < a.length (); i++)
a7c00773a089 optimize also .^-1 case
Jaroslav Hajek <highegg@gmail.com>
parents: 8978
diff changeset
2674 {
a7c00773a089 optimize also .^-1 case
Jaroslav Hajek <highegg@gmail.com>
parents: 8978
diff changeset
2675 OCTAVE_QUIT;
a7c00773a089 optimize also .^-1 case
Jaroslav Hajek <highegg@gmail.com>
parents: 8978
diff changeset
2676 result(i) = std::pow (a(i), static_cast<int> (b));
a7c00773a089 optimize also .^-1 case
Jaroslav Hajek <highegg@gmail.com>
parents: 8978
diff changeset
2677 }
a7c00773a089 optimize also .^-1 case
Jaroslav Hajek <highegg@gmail.com>
parents: 8978
diff changeset
2678 }
7789
82be108cc558 First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents: 7578
diff changeset
2679 }
82be108cc558 First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents: 7578
diff changeset
2680 else
82be108cc558 First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents: 7578
diff changeset
2681 {
82be108cc558 First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents: 7578
diff changeset
2682 for (octave_idx_type i = 0; i < a.length (); i++)
82be108cc558 First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents: 7578
diff changeset
2683 {
82be108cc558 First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents: 7578
diff changeset
2684 OCTAVE_QUIT;
82be108cc558 First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents: 7578
diff changeset
2685 result(i) = std::pow (a(i), b);
82be108cc558 First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents: 7578
diff changeset
2686 }
82be108cc558 First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents: 7578
diff changeset
2687 }
82be108cc558 First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents: 7578
diff changeset
2688
82be108cc558 First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents: 7578
diff changeset
2689 return result;
82be108cc558 First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents: 7578
diff changeset
2690 }
82be108cc558 First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents: 7578
diff changeset
2691
82be108cc558 First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents: 7578
diff changeset
2692 // -*- 10 -*-
82be108cc558 First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents: 7578
diff changeset
2693 octave_value
82be108cc558 First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents: 7578
diff changeset
2694 elem_xpow (const FloatComplexNDArray& a, const FloatNDArray& b)
82be108cc558 First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents: 7578
diff changeset
2695 {
82be108cc558 First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents: 7578
diff changeset
2696 dim_vector a_dims = a.dims ();
82be108cc558 First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents: 7578
diff changeset
2697 dim_vector b_dims = b.dims ();
82be108cc558 First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents: 7578
diff changeset
2698
82be108cc558 First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents: 7578
diff changeset
2699 if (a_dims != b_dims)
82be108cc558 First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents: 7578
diff changeset
2700 {
82be108cc558 First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents: 7578
diff changeset
2701 gripe_nonconformant ("operator .^", a_dims, b_dims);
82be108cc558 First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents: 7578
diff changeset
2702 return octave_value ();
82be108cc558 First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents: 7578
diff changeset
2703 }
82be108cc558 First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents: 7578
diff changeset
2704
82be108cc558 First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents: 7578
diff changeset
2705 FloatComplexNDArray result (a_dims);
82be108cc558 First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents: 7578
diff changeset
2706
82be108cc558 First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents: 7578
diff changeset
2707 for (octave_idx_type i = 0; i < a.length (); i++)
82be108cc558 First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents: 7578
diff changeset
2708 {
82be108cc558 First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents: 7578
diff changeset
2709 OCTAVE_QUIT;
82be108cc558 First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents: 7578
diff changeset
2710 float btmp = b(i);
82be108cc558 First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents: 7578
diff changeset
2711 if (xisint (btmp))
82be108cc558 First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents: 7578
diff changeset
2712 result(i) = std::pow (a(i), static_cast<int> (btmp));
82be108cc558 First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents: 7578
diff changeset
2713 else
82be108cc558 First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents: 7578
diff changeset
2714 result(i) = std::pow (a(i), btmp);
82be108cc558 First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents: 7578
diff changeset
2715 }
82be108cc558 First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents: 7578
diff changeset
2716
82be108cc558 First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents: 7578
diff changeset
2717 return result;
82be108cc558 First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents: 7578
diff changeset
2718 }
82be108cc558 First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents: 7578
diff changeset
2719
82be108cc558 First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents: 7578
diff changeset
2720 // -*- 11 -*-
82be108cc558 First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents: 7578
diff changeset
2721 octave_value
82be108cc558 First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents: 7578
diff changeset
2722 elem_xpow (const FloatComplexNDArray& a, const FloatComplex& b)
82be108cc558 First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents: 7578
diff changeset
2723 {
82be108cc558 First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents: 7578
diff changeset
2724 FloatComplexNDArray result (a.dims ());
82be108cc558 First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents: 7578
diff changeset
2725
82be108cc558 First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents: 7578
diff changeset
2726 for (octave_idx_type i = 0; i < a.length (); i++)
82be108cc558 First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents: 7578
diff changeset
2727 {
82be108cc558 First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents: 7578
diff changeset
2728 OCTAVE_QUIT;
82be108cc558 First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents: 7578
diff changeset
2729 result(i) = std::pow (a(i), b);
82be108cc558 First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents: 7578
diff changeset
2730 }
82be108cc558 First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents: 7578
diff changeset
2731
82be108cc558 First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents: 7578
diff changeset
2732 return result;
82be108cc558 First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents: 7578
diff changeset
2733 }
82be108cc558 First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents: 7578
diff changeset
2734
82be108cc558 First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents: 7578
diff changeset
2735 // -*- 12 -*-
82be108cc558 First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents: 7578
diff changeset
2736 octave_value
82be108cc558 First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents: 7578
diff changeset
2737 elem_xpow (const FloatComplexNDArray& a, const FloatComplexNDArray& b)
82be108cc558 First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents: 7578
diff changeset
2738 {
82be108cc558 First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents: 7578
diff changeset
2739 dim_vector a_dims = a.dims ();
82be108cc558 First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents: 7578
diff changeset
2740 dim_vector b_dims = b.dims ();
82be108cc558 First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents: 7578
diff changeset
2741
82be108cc558 First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents: 7578
diff changeset
2742 if (a_dims != b_dims)
82be108cc558 First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents: 7578
diff changeset
2743 {
82be108cc558 First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents: 7578
diff changeset
2744 gripe_nonconformant ("operator .^", a_dims, b_dims);
82be108cc558 First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents: 7578
diff changeset
2745 return octave_value ();
82be108cc558 First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents: 7578
diff changeset
2746 }
82be108cc558 First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents: 7578
diff changeset
2747
82be108cc558 First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents: 7578
diff changeset
2748 FloatComplexNDArray result (a_dims);
82be108cc558 First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents: 7578
diff changeset
2749
82be108cc558 First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents: 7578
diff changeset
2750 for (octave_idx_type i = 0; i < a.length (); i++)
82be108cc558 First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents: 7578
diff changeset
2751 {
82be108cc558 First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents: 7578
diff changeset
2752 OCTAVE_QUIT;
82be108cc558 First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents: 7578
diff changeset
2753 result(i) = std::pow (a(i), b(i));
82be108cc558 First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents: 7578
diff changeset
2754 }
82be108cc558 First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents: 7578
diff changeset
2755
82be108cc558 First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents: 7578
diff changeset
2756 return result;
82be108cc558 First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents: 7578
diff changeset
2757 }
82be108cc558 First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents: 7578
diff changeset
2758
1
78fd87e624cb [project @ 1993-08-08 01:13:40 by jwe]
jwe
parents:
diff changeset
2759 /*
78fd87e624cb [project @ 1993-08-08 01:13:40 by jwe]
jwe
parents:
diff changeset
2760 ;;; Local Variables: ***
78fd87e624cb [project @ 1993-08-08 01:13:40 by jwe]
jwe
parents:
diff changeset
2761 ;;; mode: C++ ***
78fd87e624cb [project @ 1993-08-08 01:13:40 by jwe]
jwe
parents:
diff changeset
2762 ;;; End: ***
78fd87e624cb [project @ 1993-08-08 01:13:40 by jwe]
jwe
parents:
diff changeset
2763 */