annotate liboctave/dMatrix.cc @ 5956:cdef72fcd206

[project @ 2006-08-22 20:36:56 by jwe]
author jwe
date Tue, 22 Aug 2006 20:36:57 +0000
parents c038c2947ee1
children 85c7dc4afe6b
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
1993
1b57120c997b [project @ 1996-03-03 01:16:15 by jwe]
jwe
parents: 1968
diff changeset
1 // Matrix manipulations.
458
38cb88095913 [project @ 1994-06-06 00:41:10 by jwe]
jwe
parents:
diff changeset
2 /*
38cb88095913 [project @ 1994-06-06 00:41:10 by jwe]
jwe
parents:
diff changeset
3
2847
8b262e771614 [project @ 1997-03-27 16:18:26 by jwe]
jwe
parents: 2832
diff changeset
4 Copyright (C) 1996, 1997 John W. Eaton
458
38cb88095913 [project @ 1994-06-06 00:41:10 by jwe]
jwe
parents:
diff changeset
5
38cb88095913 [project @ 1994-06-06 00:41:10 by jwe]
jwe
parents:
diff changeset
6 This file is part of Octave.
38cb88095913 [project @ 1994-06-06 00:41:10 by jwe]
jwe
parents:
diff changeset
7
38cb88095913 [project @ 1994-06-06 00:41:10 by jwe]
jwe
parents:
diff changeset
8 Octave is free software; you can redistribute it and/or modify it
38cb88095913 [project @ 1994-06-06 00:41:10 by jwe]
jwe
parents:
diff changeset
9 under the terms of the GNU General Public License as published by the
38cb88095913 [project @ 1994-06-06 00:41:10 by jwe]
jwe
parents:
diff changeset
10 Free Software Foundation; either version 2, or (at your option) any
38cb88095913 [project @ 1994-06-06 00:41:10 by jwe]
jwe
parents:
diff changeset
11 later version.
38cb88095913 [project @ 1994-06-06 00:41:10 by jwe]
jwe
parents:
diff changeset
12
38cb88095913 [project @ 1994-06-06 00:41:10 by jwe]
jwe
parents:
diff changeset
13 Octave is distributed in the hope that it will be useful, but WITHOUT
38cb88095913 [project @ 1994-06-06 00:41:10 by jwe]
jwe
parents:
diff changeset
14 ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
38cb88095913 [project @ 1994-06-06 00:41:10 by jwe]
jwe
parents:
diff changeset
15 FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
38cb88095913 [project @ 1994-06-06 00:41:10 by jwe]
jwe
parents:
diff changeset
16 for more details.
38cb88095913 [project @ 1994-06-06 00:41:10 by jwe]
jwe
parents:
diff changeset
17
38cb88095913 [project @ 1994-06-06 00:41:10 by jwe]
jwe
parents:
diff changeset
18 You should have received a copy of the GNU General Public License
38cb88095913 [project @ 1994-06-06 00:41:10 by jwe]
jwe
parents:
diff changeset
19 along with Octave; see the file COPYING. If not, write to the Free
5307
4c8a2e4e0717 [project @ 2005-04-26 19:24:27 by jwe]
jwe
parents: 5275
diff changeset
20 Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
4c8a2e4e0717 [project @ 2005-04-26 19:24:27 by jwe]
jwe
parents: 5275
diff changeset
21 02110-1301, USA.
458
38cb88095913 [project @ 1994-06-06 00:41:10 by jwe]
jwe
parents:
diff changeset
22
38cb88095913 [project @ 1994-06-06 00:41:10 by jwe]
jwe
parents:
diff changeset
23 */
38cb88095913 [project @ 1994-06-06 00:41:10 by jwe]
jwe
parents:
diff changeset
24
38cb88095913 [project @ 1994-06-06 00:41:10 by jwe]
jwe
parents:
diff changeset
25 #ifdef HAVE_CONFIG_H
1192
b6360f2d4fa6 [project @ 1995-03-30 21:38:35 by jwe]
jwe
parents: 1011
diff changeset
26 #include <config.h>
458
38cb88095913 [project @ 1994-06-06 00:41:10 by jwe]
jwe
parents:
diff changeset
27 #endif
38cb88095913 [project @ 1994-06-06 00:41:10 by jwe]
jwe
parents:
diff changeset
28
1367
9f9131a8d706 [project @ 1995-09-06 00:07:03 by jwe]
jwe
parents: 1365
diff changeset
29 #include <cfloat>
9f9131a8d706 [project @ 1995-09-06 00:07:03 by jwe]
jwe
parents: 1365
diff changeset
30
3503
d14c483b3c12 [project @ 2000-02-01 04:06:07 by jwe]
jwe
parents: 3480
diff changeset
31 #include <iostream>
1367
9f9131a8d706 [project @ 1995-09-06 00:07:03 by jwe]
jwe
parents: 1365
diff changeset
32
4669
334a27c8f453 [project @ 2003-11-26 07:02:42 by jwe]
jwe
parents: 4634
diff changeset
33 #include "Array-util.h"
2317
8c09c04f7747 [project @ 1996-07-14 22:30:15 by jwe]
jwe
parents: 1993
diff changeset
34 #include "byte-swap.h"
2828
92826d6e8bd9 [project @ 1997-03-25 23:41:41 by jwe]
jwe
parents: 2800
diff changeset
35 #include "dMatrix.h"
1819
8b8498bf8ec5 [project @ 1996-01-31 11:29:17 by jwe]
jwe
parents: 1698
diff changeset
36 #include "dbleAEPBAL.h"
458
38cb88095913 [project @ 1994-06-06 00:41:10 by jwe]
jwe
parents:
diff changeset
37 #include "dbleDET.h"
1819
8b8498bf8ec5 [project @ 1996-01-31 11:29:17 by jwe]
jwe
parents: 1698
diff changeset
38 #include "dbleSCHUR.h"
740
d8295febb0df [project @ 1994-09-30 14:42:37 by jwe]
jwe
parents: 677
diff changeset
39 #include "dbleSVD.h"
1847
2ffe49eb95a5 [project @ 1996-02-03 12:47:55 by jwe]
jwe
parents: 1819
diff changeset
40 #include "f77-fcn.h"
458
38cb88095913 [project @ 1994-06-06 00:41:10 by jwe]
jwe
parents:
diff changeset
41 #include "lo-error.h"
2354
2ce6e1ec9b53 [project @ 1996-08-20 22:44:25 by jwe]
jwe
parents: 2349
diff changeset
42 #include "lo-ieee.h"
2ce6e1ec9b53 [project @ 1996-08-20 22:44:25 by jwe]
jwe
parents: 2349
diff changeset
43 #include "lo-mappers.h"
1968
a2e206524aa0 [project @ 1996-02-17 02:54:24 by jwe]
jwe
parents: 1959
diff changeset
44 #include "lo-utils.h"
1367
9f9131a8d706 [project @ 1995-09-06 00:07:03 by jwe]
jwe
parents: 1365
diff changeset
45 #include "mx-base.h"
2828
92826d6e8bd9 [project @ 1997-03-25 23:41:41 by jwe]
jwe
parents: 2800
diff changeset
46 #include "mx-m-dm.h"
3176
fccab8e7d35f [project @ 1998-05-18 20:33:31 by jwe]
jwe
parents: 3145
diff changeset
47 #include "mx-dm-m.h"
1367
9f9131a8d706 [project @ 1995-09-06 00:07:03 by jwe]
jwe
parents: 1365
diff changeset
48 #include "mx-inlines.cc"
1650
23aa282707e8 [project @ 1995-12-20 06:53:12 by jwe]
jwe
parents: 1574
diff changeset
49 #include "oct-cmplx.h"
4153
6b96ce9f5743 [project @ 2002-11-06 20:38:49 by jwe]
jwe
parents: 4130
diff changeset
50 #include "quit.h"
458
38cb88095913 [project @ 1994-06-06 00:41:10 by jwe]
jwe
parents:
diff changeset
51
4773
ccfbd6047a54 [project @ 2004-02-16 19:02:32 by jwe]
jwe
parents: 4669
diff changeset
52 #if defined (HAVE_FFTW3)
3827
ba548facf43b [project @ 2001-05-02 06:15:06 by jwe]
jwe
parents: 3769
diff changeset
53 #include "oct-fftw.h"
ba548facf43b [project @ 2001-05-02 06:15:06 by jwe]
jwe
parents: 3769
diff changeset
54 #endif
ba548facf43b [project @ 2001-05-02 06:15:06 by jwe]
jwe
parents: 3769
diff changeset
55
458
38cb88095913 [project @ 1994-06-06 00:41:10 by jwe]
jwe
parents:
diff changeset
56 // Fortran functions we call.
38cb88095913 [project @ 1994-06-06 00:41:10 by jwe]
jwe
parents:
diff changeset
57
38cb88095913 [project @ 1994-06-06 00:41:10 by jwe]
jwe
parents:
diff changeset
58 extern "C"
38cb88095913 [project @ 1994-06-06 00:41:10 by jwe]
jwe
parents:
diff changeset
59 {
4552
6f3382e08a52 [project @ 2003-10-27 20:38:02 by jwe]
jwe
parents: 4513
diff changeset
60 F77_RET_T
6f3382e08a52 [project @ 2003-10-27 20:38:02 by jwe]
jwe
parents: 4513
diff changeset
61 F77_FUNC (dgebal, DGEBAL) (F77_CONST_CHAR_ARG_DECL,
5275
23b37da9fd5b [project @ 2005-04-08 16:07:35 by jwe]
jwe
parents: 5105
diff changeset
62 const octave_idx_type&, double*, const octave_idx_type&, octave_idx_type&,
23b37da9fd5b [project @ 2005-04-08 16:07:35 by jwe]
jwe
parents: 5105
diff changeset
63 octave_idx_type&, double*, octave_idx_type&
4552
6f3382e08a52 [project @ 2003-10-27 20:38:02 by jwe]
jwe
parents: 4513
diff changeset
64 F77_CHAR_ARG_LEN_DECL);
6f3382e08a52 [project @ 2003-10-27 20:38:02 by jwe]
jwe
parents: 4513
diff changeset
65
6f3382e08a52 [project @ 2003-10-27 20:38:02 by jwe]
jwe
parents: 4513
diff changeset
66 F77_RET_T
6f3382e08a52 [project @ 2003-10-27 20:38:02 by jwe]
jwe
parents: 4513
diff changeset
67 F77_FUNC (dgebak, DGEBAK) (F77_CONST_CHAR_ARG_DECL,
6f3382e08a52 [project @ 2003-10-27 20:38:02 by jwe]
jwe
parents: 4513
diff changeset
68 F77_CONST_CHAR_ARG_DECL,
5275
23b37da9fd5b [project @ 2005-04-08 16:07:35 by jwe]
jwe
parents: 5105
diff changeset
69 const octave_idx_type&, const octave_idx_type&, const octave_idx_type&, double*,
23b37da9fd5b [project @ 2005-04-08 16:07:35 by jwe]
jwe
parents: 5105
diff changeset
70 const octave_idx_type&, double*, const octave_idx_type&, octave_idx_type&
4552
6f3382e08a52 [project @ 2003-10-27 20:38:02 by jwe]
jwe
parents: 4513
diff changeset
71 F77_CHAR_ARG_LEN_DECL
6f3382e08a52 [project @ 2003-10-27 20:38:02 by jwe]
jwe
parents: 4513
diff changeset
72 F77_CHAR_ARG_LEN_DECL);
6f3382e08a52 [project @ 2003-10-27 20:38:02 by jwe]
jwe
parents: 4513
diff changeset
73
6f3382e08a52 [project @ 2003-10-27 20:38:02 by jwe]
jwe
parents: 4513
diff changeset
74
6f3382e08a52 [project @ 2003-10-27 20:38:02 by jwe]
jwe
parents: 4513
diff changeset
75 F77_RET_T
6f3382e08a52 [project @ 2003-10-27 20:38:02 by jwe]
jwe
parents: 4513
diff changeset
76 F77_FUNC (dgemm, DGEMM) (F77_CONST_CHAR_ARG_DECL,
6f3382e08a52 [project @ 2003-10-27 20:38:02 by jwe]
jwe
parents: 4513
diff changeset
77 F77_CONST_CHAR_ARG_DECL,
5275
23b37da9fd5b [project @ 2005-04-08 16:07:35 by jwe]
jwe
parents: 5105
diff changeset
78 const octave_idx_type&, const octave_idx_type&, const octave_idx_type&,
23b37da9fd5b [project @ 2005-04-08 16:07:35 by jwe]
jwe
parents: 5105
diff changeset
79 const double&, const double*, const octave_idx_type&,
23b37da9fd5b [project @ 2005-04-08 16:07:35 by jwe]
jwe
parents: 5105
diff changeset
80 const double*, const octave_idx_type&, const double&,
23b37da9fd5b [project @ 2005-04-08 16:07:35 by jwe]
jwe
parents: 5105
diff changeset
81 double*, const octave_idx_type&
4552
6f3382e08a52 [project @ 2003-10-27 20:38:02 by jwe]
jwe
parents: 4513
diff changeset
82 F77_CHAR_ARG_LEN_DECL
6f3382e08a52 [project @ 2003-10-27 20:38:02 by jwe]
jwe
parents: 4513
diff changeset
83 F77_CHAR_ARG_LEN_DECL);
6f3382e08a52 [project @ 2003-10-27 20:38:02 by jwe]
jwe
parents: 4513
diff changeset
84
6f3382e08a52 [project @ 2003-10-27 20:38:02 by jwe]
jwe
parents: 4513
diff changeset
85 F77_RET_T
5275
23b37da9fd5b [project @ 2005-04-08 16:07:35 by jwe]
jwe
parents: 5105
diff changeset
86 F77_FUNC (dgetrf, DGETRF) (const octave_idx_type&, const octave_idx_type&, double*, const octave_idx_type&,
23b37da9fd5b [project @ 2005-04-08 16:07:35 by jwe]
jwe
parents: 5105
diff changeset
87 octave_idx_type*, octave_idx_type&);
4329
d53c33d93440 [project @ 2003-02-18 20:00:48 by jwe]
jwe
parents: 4316
diff changeset
88
4552
6f3382e08a52 [project @ 2003-10-27 20:38:02 by jwe]
jwe
parents: 4513
diff changeset
89 F77_RET_T
5275
23b37da9fd5b [project @ 2005-04-08 16:07:35 by jwe]
jwe
parents: 5105
diff changeset
90 F77_FUNC (dgetrs, DGETRS) (F77_CONST_CHAR_ARG_DECL, const octave_idx_type&, const octave_idx_type&,
23b37da9fd5b [project @ 2005-04-08 16:07:35 by jwe]
jwe
parents: 5105
diff changeset
91 const double*, const octave_idx_type&,
23b37da9fd5b [project @ 2005-04-08 16:07:35 by jwe]
jwe
parents: 5105
diff changeset
92 const octave_idx_type*, double*, const octave_idx_type&, octave_idx_type&
4552
6f3382e08a52 [project @ 2003-10-27 20:38:02 by jwe]
jwe
parents: 4513
diff changeset
93 F77_CHAR_ARG_LEN_DECL);
6f3382e08a52 [project @ 2003-10-27 20:38:02 by jwe]
jwe
parents: 4513
diff changeset
94
6f3382e08a52 [project @ 2003-10-27 20:38:02 by jwe]
jwe
parents: 4513
diff changeset
95 F77_RET_T
5275
23b37da9fd5b [project @ 2005-04-08 16:07:35 by jwe]
jwe
parents: 5105
diff changeset
96 F77_FUNC (dgetri, DGETRI) (const octave_idx_type&, double*, const octave_idx_type&, const octave_idx_type*,
23b37da9fd5b [project @ 2005-04-08 16:07:35 by jwe]
jwe
parents: 5105
diff changeset
97 double*, const octave_idx_type&, octave_idx_type&);
4552
6f3382e08a52 [project @ 2003-10-27 20:38:02 by jwe]
jwe
parents: 4513
diff changeset
98
6f3382e08a52 [project @ 2003-10-27 20:38:02 by jwe]
jwe
parents: 4513
diff changeset
99 F77_RET_T
5275
23b37da9fd5b [project @ 2005-04-08 16:07:35 by jwe]
jwe
parents: 5105
diff changeset
100 F77_FUNC (dgecon, DGECON) (F77_CONST_CHAR_ARG_DECL, const octave_idx_type&, double*,
23b37da9fd5b [project @ 2005-04-08 16:07:35 by jwe]
jwe
parents: 5105
diff changeset
101 const octave_idx_type&, const double&, double&,
23b37da9fd5b [project @ 2005-04-08 16:07:35 by jwe]
jwe
parents: 5105
diff changeset
102 double*, octave_idx_type*, octave_idx_type&
4552
6f3382e08a52 [project @ 2003-10-27 20:38:02 by jwe]
jwe
parents: 4513
diff changeset
103 F77_CHAR_ARG_LEN_DECL);
6f3382e08a52 [project @ 2003-10-27 20:38:02 by jwe]
jwe
parents: 4513
diff changeset
104
6f3382e08a52 [project @ 2003-10-27 20:38:02 by jwe]
jwe
parents: 4513
diff changeset
105 F77_RET_T
5275
23b37da9fd5b [project @ 2005-04-08 16:07:35 by jwe]
jwe
parents: 5105
diff changeset
106 F77_FUNC (dgelss, DGELSS) (const octave_idx_type&, const octave_idx_type&, const octave_idx_type&,
23b37da9fd5b [project @ 2005-04-08 16:07:35 by jwe]
jwe
parents: 5105
diff changeset
107 double*, const octave_idx_type&, double*,
23b37da9fd5b [project @ 2005-04-08 16:07:35 by jwe]
jwe
parents: 5105
diff changeset
108 const octave_idx_type&, double*, double&, octave_idx_type&,
23b37da9fd5b [project @ 2005-04-08 16:07:35 by jwe]
jwe
parents: 5105
diff changeset
109 double*, const octave_idx_type&, octave_idx_type&);
458
38cb88095913 [project @ 1994-06-06 00:41:10 by jwe]
jwe
parents:
diff changeset
110
5785
6b9cec830d72 [project @ 2006-05-03 19:32:46 by dbateman]
dbateman
parents: 5775
diff changeset
111 F77_RET_T
6b9cec830d72 [project @ 2006-05-03 19:32:46 by dbateman]
dbateman
parents: 5775
diff changeset
112 F77_FUNC (dpotrf, DPOTRF) (F77_CONST_CHAR_ARG_DECL, const octave_idx_type&,
6b9cec830d72 [project @ 2006-05-03 19:32:46 by dbateman]
dbateman
parents: 5775
diff changeset
113 double *, const octave_idx_type&,
6b9cec830d72 [project @ 2006-05-03 19:32:46 by dbateman]
dbateman
parents: 5775
diff changeset
114 octave_idx_type& F77_CHAR_ARG_LEN_DECL);
6b9cec830d72 [project @ 2006-05-03 19:32:46 by dbateman]
dbateman
parents: 5775
diff changeset
115
6b9cec830d72 [project @ 2006-05-03 19:32:46 by dbateman]
dbateman
parents: 5775
diff changeset
116 F77_RET_T
6b9cec830d72 [project @ 2006-05-03 19:32:46 by dbateman]
dbateman
parents: 5775
diff changeset
117 F77_FUNC (dpocon, DPOCON) (F77_CONST_CHAR_ARG_DECL, const octave_idx_type&,
6b9cec830d72 [project @ 2006-05-03 19:32:46 by dbateman]
dbateman
parents: 5775
diff changeset
118 double*, const octave_idx_type&, const double&,
6b9cec830d72 [project @ 2006-05-03 19:32:46 by dbateman]
dbateman
parents: 5775
diff changeset
119 double&, double*, octave_idx_type*,
6b9cec830d72 [project @ 2006-05-03 19:32:46 by dbateman]
dbateman
parents: 5775
diff changeset
120 octave_idx_type& F77_CHAR_ARG_LEN_DECL);
6b9cec830d72 [project @ 2006-05-03 19:32:46 by dbateman]
dbateman
parents: 5775
diff changeset
121 F77_RET_T
6b9cec830d72 [project @ 2006-05-03 19:32:46 by dbateman]
dbateman
parents: 5775
diff changeset
122 F77_FUNC (dpotrs, DPOTRS) (F77_CONST_CHAR_ARG_DECL, const octave_idx_type&,
6b9cec830d72 [project @ 2006-05-03 19:32:46 by dbateman]
dbateman
parents: 5775
diff changeset
123 const octave_idx_type&, const double*,
6b9cec830d72 [project @ 2006-05-03 19:32:46 by dbateman]
dbateman
parents: 5775
diff changeset
124 const octave_idx_type&, double*,
6b9cec830d72 [project @ 2006-05-03 19:32:46 by dbateman]
dbateman
parents: 5775
diff changeset
125 const octave_idx_type&, octave_idx_type&
6b9cec830d72 [project @ 2006-05-03 19:32:46 by dbateman]
dbateman
parents: 5775
diff changeset
126 F77_CHAR_ARG_LEN_DECL);
6b9cec830d72 [project @ 2006-05-03 19:32:46 by dbateman]
dbateman
parents: 5775
diff changeset
127
6b9cec830d72 [project @ 2006-05-03 19:32:46 by dbateman]
dbateman
parents: 5775
diff changeset
128 F77_RET_T
6b9cec830d72 [project @ 2006-05-03 19:32:46 by dbateman]
dbateman
parents: 5775
diff changeset
129 F77_FUNC (dtrcon, DTRCON) (F77_CONST_CHAR_ARG_DECL, F77_CONST_CHAR_ARG_DECL,
6b9cec830d72 [project @ 2006-05-03 19:32:46 by dbateman]
dbateman
parents: 5775
diff changeset
130 F77_CONST_CHAR_ARG_DECL, const octave_idx_type&,
6b9cec830d72 [project @ 2006-05-03 19:32:46 by dbateman]
dbateman
parents: 5775
diff changeset
131 const double*, const octave_idx_type&, double&,
6b9cec830d72 [project @ 2006-05-03 19:32:46 by dbateman]
dbateman
parents: 5775
diff changeset
132 double*, octave_idx_type*, octave_idx_type&
6b9cec830d72 [project @ 2006-05-03 19:32:46 by dbateman]
dbateman
parents: 5775
diff changeset
133 F77_CHAR_ARG_LEN_DECL
6b9cec830d72 [project @ 2006-05-03 19:32:46 by dbateman]
dbateman
parents: 5775
diff changeset
134 F77_CHAR_ARG_LEN_DECL
6b9cec830d72 [project @ 2006-05-03 19:32:46 by dbateman]
dbateman
parents: 5775
diff changeset
135 F77_CHAR_ARG_LEN_DECL);
6b9cec830d72 [project @ 2006-05-03 19:32:46 by dbateman]
dbateman
parents: 5775
diff changeset
136 F77_RET_T
6b9cec830d72 [project @ 2006-05-03 19:32:46 by dbateman]
dbateman
parents: 5775
diff changeset
137 F77_FUNC (dtrtrs, DTRTRS) (F77_CONST_CHAR_ARG_DECL, F77_CONST_CHAR_ARG_DECL,
6b9cec830d72 [project @ 2006-05-03 19:32:46 by dbateman]
dbateman
parents: 5775
diff changeset
138 F77_CONST_CHAR_ARG_DECL, const octave_idx_type&,
6b9cec830d72 [project @ 2006-05-03 19:32:46 by dbateman]
dbateman
parents: 5775
diff changeset
139 const octave_idx_type&, const double*,
6b9cec830d72 [project @ 2006-05-03 19:32:46 by dbateman]
dbateman
parents: 5775
diff changeset
140 const octave_idx_type&, double*,
6b9cec830d72 [project @ 2006-05-03 19:32:46 by dbateman]
dbateman
parents: 5775
diff changeset
141 const octave_idx_type&, octave_idx_type&
6b9cec830d72 [project @ 2006-05-03 19:32:46 by dbateman]
dbateman
parents: 5775
diff changeset
142 F77_CHAR_ARG_LEN_DECL
6b9cec830d72 [project @ 2006-05-03 19:32:46 by dbateman]
dbateman
parents: 5775
diff changeset
143 F77_CHAR_ARG_LEN_DECL
6b9cec830d72 [project @ 2006-05-03 19:32:46 by dbateman]
dbateman
parents: 5775
diff changeset
144 F77_CHAR_ARG_LEN_DECL);
6b9cec830d72 [project @ 2006-05-03 19:32:46 by dbateman]
dbateman
parents: 5775
diff changeset
145
1360
7eb93d12654c [project @ 1995-09-05 21:51:54 by jwe]
jwe
parents: 1321
diff changeset
146 // Note that the original complex fft routines were not written for
7eb93d12654c [project @ 1995-09-05 21:51:54 by jwe]
jwe
parents: 1321
diff changeset
147 // double complex arguments. They have been modified by adding an
7eb93d12654c [project @ 1995-09-05 21:51:54 by jwe]
jwe
parents: 1321
diff changeset
148 // implicit double precision (a-h,o-z) statement at the beginning of
7eb93d12654c [project @ 1995-09-05 21:51:54 by jwe]
jwe
parents: 1321
diff changeset
149 // each subroutine.
458
38cb88095913 [project @ 1994-06-06 00:41:10 by jwe]
jwe
parents:
diff changeset
150
4552
6f3382e08a52 [project @ 2003-10-27 20:38:02 by jwe]
jwe
parents: 4513
diff changeset
151 F77_RET_T
5275
23b37da9fd5b [project @ 2005-04-08 16:07:35 by jwe]
jwe
parents: 5105
diff changeset
152 F77_FUNC (cffti, CFFTI) (const octave_idx_type&, Complex*);
4552
6f3382e08a52 [project @ 2003-10-27 20:38:02 by jwe]
jwe
parents: 4513
diff changeset
153
6f3382e08a52 [project @ 2003-10-27 20:38:02 by jwe]
jwe
parents: 4513
diff changeset
154 F77_RET_T
5275
23b37da9fd5b [project @ 2005-04-08 16:07:35 by jwe]
jwe
parents: 5105
diff changeset
155 F77_FUNC (cfftf, CFFTF) (const octave_idx_type&, Complex*, Complex*);
4552
6f3382e08a52 [project @ 2003-10-27 20:38:02 by jwe]
jwe
parents: 4513
diff changeset
156
6f3382e08a52 [project @ 2003-10-27 20:38:02 by jwe]
jwe
parents: 4513
diff changeset
157 F77_RET_T
5275
23b37da9fd5b [project @ 2005-04-08 16:07:35 by jwe]
jwe
parents: 5105
diff changeset
158 F77_FUNC (cfftb, CFFTB) (const octave_idx_type&, Complex*, Complex*);
4552
6f3382e08a52 [project @ 2003-10-27 20:38:02 by jwe]
jwe
parents: 4513
diff changeset
159
6f3382e08a52 [project @ 2003-10-27 20:38:02 by jwe]
jwe
parents: 4513
diff changeset
160 F77_RET_T
6f3382e08a52 [project @ 2003-10-27 20:38:02 by jwe]
jwe
parents: 4513
diff changeset
161 F77_FUNC (dlartg, DLARTG) (const double&, const double&, double&,
6f3382e08a52 [project @ 2003-10-27 20:38:02 by jwe]
jwe
parents: 4513
diff changeset
162 double&, double&);
6f3382e08a52 [project @ 2003-10-27 20:38:02 by jwe]
jwe
parents: 4513
diff changeset
163
6f3382e08a52 [project @ 2003-10-27 20:38:02 by jwe]
jwe
parents: 4513
diff changeset
164 F77_RET_T
6f3382e08a52 [project @ 2003-10-27 20:38:02 by jwe]
jwe
parents: 4513
diff changeset
165 F77_FUNC (dtrsyl, DTRSYL) (F77_CONST_CHAR_ARG_DECL,
6f3382e08a52 [project @ 2003-10-27 20:38:02 by jwe]
jwe
parents: 4513
diff changeset
166 F77_CONST_CHAR_ARG_DECL,
5275
23b37da9fd5b [project @ 2005-04-08 16:07:35 by jwe]
jwe
parents: 5105
diff changeset
167 const octave_idx_type&, const octave_idx_type&, const octave_idx_type&,
23b37da9fd5b [project @ 2005-04-08 16:07:35 by jwe]
jwe
parents: 5105
diff changeset
168 const double*, const octave_idx_type&, const double*,
23b37da9fd5b [project @ 2005-04-08 16:07:35 by jwe]
jwe
parents: 5105
diff changeset
169 const octave_idx_type&, const double*, const octave_idx_type&,
23b37da9fd5b [project @ 2005-04-08 16:07:35 by jwe]
jwe
parents: 5105
diff changeset
170 double&, octave_idx_type&
4552
6f3382e08a52 [project @ 2003-10-27 20:38:02 by jwe]
jwe
parents: 4513
diff changeset
171 F77_CHAR_ARG_LEN_DECL
6f3382e08a52 [project @ 2003-10-27 20:38:02 by jwe]
jwe
parents: 4513
diff changeset
172 F77_CHAR_ARG_LEN_DECL);
6f3382e08a52 [project @ 2003-10-27 20:38:02 by jwe]
jwe
parents: 4513
diff changeset
173
6f3382e08a52 [project @ 2003-10-27 20:38:02 by jwe]
jwe
parents: 4513
diff changeset
174 F77_RET_T
5275
23b37da9fd5b [project @ 2005-04-08 16:07:35 by jwe]
jwe
parents: 5105
diff changeset
175 F77_FUNC (xdlange, XDLANGE) (F77_CONST_CHAR_ARG_DECL, const octave_idx_type&,
23b37da9fd5b [project @ 2005-04-08 16:07:35 by jwe]
jwe
parents: 5105
diff changeset
176 const octave_idx_type&, const double*,
23b37da9fd5b [project @ 2005-04-08 16:07:35 by jwe]
jwe
parents: 5105
diff changeset
177 const octave_idx_type&, double*, double&
4552
6f3382e08a52 [project @ 2003-10-27 20:38:02 by jwe]
jwe
parents: 4513
diff changeset
178 F77_CHAR_ARG_LEN_DECL);
458
38cb88095913 [project @ 1994-06-06 00:41:10 by jwe]
jwe
parents:
diff changeset
179 }
38cb88095913 [project @ 1994-06-06 00:41:10 by jwe]
jwe
parents:
diff changeset
180
1360
7eb93d12654c [project @ 1995-09-05 21:51:54 by jwe]
jwe
parents: 1321
diff changeset
181 // Matrix class.
458
38cb88095913 [project @ 1994-06-06 00:41:10 by jwe]
jwe
parents:
diff changeset
182
2349
b369227ce3d2 [project @ 1996-07-27 07:59:20 by jwe]
jwe
parents: 2317
diff changeset
183 Matrix::Matrix (const RowVector& rv)
b369227ce3d2 [project @ 1996-07-27 07:59:20 by jwe]
jwe
parents: 2317
diff changeset
184 : MArray2<double> (1, rv.length (), 0.0)
b369227ce3d2 [project @ 1996-07-27 07:59:20 by jwe]
jwe
parents: 2317
diff changeset
185 {
5275
23b37da9fd5b [project @ 2005-04-08 16:07:35 by jwe]
jwe
parents: 5105
diff changeset
186 for (octave_idx_type i = 0; i < rv.length (); i++)
2349
b369227ce3d2 [project @ 1996-07-27 07:59:20 by jwe]
jwe
parents: 2317
diff changeset
187 elem (0, i) = rv.elem (i);
b369227ce3d2 [project @ 1996-07-27 07:59:20 by jwe]
jwe
parents: 2317
diff changeset
188 }
b369227ce3d2 [project @ 1996-07-27 07:59:20 by jwe]
jwe
parents: 2317
diff changeset
189
b369227ce3d2 [project @ 1996-07-27 07:59:20 by jwe]
jwe
parents: 2317
diff changeset
190 Matrix::Matrix (const ColumnVector& cv)
b369227ce3d2 [project @ 1996-07-27 07:59:20 by jwe]
jwe
parents: 2317
diff changeset
191 : MArray2<double> (cv.length (), 1, 0.0)
b369227ce3d2 [project @ 1996-07-27 07:59:20 by jwe]
jwe
parents: 2317
diff changeset
192 {
5275
23b37da9fd5b [project @ 2005-04-08 16:07:35 by jwe]
jwe
parents: 5105
diff changeset
193 for (octave_idx_type i = 0; i < cv.length (); i++)
2349
b369227ce3d2 [project @ 1996-07-27 07:59:20 by jwe]
jwe
parents: 2317
diff changeset
194 elem (i, 0) = cv.elem (i);
b369227ce3d2 [project @ 1996-07-27 07:59:20 by jwe]
jwe
parents: 2317
diff changeset
195 }
b369227ce3d2 [project @ 1996-07-27 07:59:20 by jwe]
jwe
parents: 2317
diff changeset
196
458
38cb88095913 [project @ 1994-06-06 00:41:10 by jwe]
jwe
parents:
diff changeset
197 Matrix::Matrix (const DiagMatrix& a)
1214
0bf4d2b7def4 [project @ 1995-04-06 02:33:59 by jwe]
jwe
parents: 1205
diff changeset
198 : MArray2<double> (a.rows (), a.cols (), 0.0)
458
38cb88095913 [project @ 1994-06-06 00:41:10 by jwe]
jwe
parents:
diff changeset
199 {
5275
23b37da9fd5b [project @ 2005-04-08 16:07:35 by jwe]
jwe
parents: 5105
diff changeset
200 for (octave_idx_type i = 0; i < a.length (); i++)
458
38cb88095913 [project @ 1994-06-06 00:41:10 by jwe]
jwe
parents:
diff changeset
201 elem (i, i) = a.elem (i, i);
38cb88095913 [project @ 1994-06-06 00:41:10 by jwe]
jwe
parents:
diff changeset
202 }
38cb88095913 [project @ 1994-06-06 00:41:10 by jwe]
jwe
parents:
diff changeset
203
5775
ace8d8d26933 [project @ 2006-04-24 19:13:06 by jwe]
jwe
parents: 5717
diff changeset
204 // FIXME -- could we use a templated mixed-type copy function
1574
dd7d27461567 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents: 1561
diff changeset
205 // here?
dd7d27461567 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents: 1561
diff changeset
206
2828
92826d6e8bd9 [project @ 1997-03-25 23:41:41 by jwe]
jwe
parents: 2800
diff changeset
207 Matrix::Matrix (const boolMatrix& a)
92826d6e8bd9 [project @ 1997-03-25 23:41:41 by jwe]
jwe
parents: 2800
diff changeset
208 : MArray2<double> (a.rows (), a.cols ())
92826d6e8bd9 [project @ 1997-03-25 23:41:41 by jwe]
jwe
parents: 2800
diff changeset
209 {
5275
23b37da9fd5b [project @ 2005-04-08 16:07:35 by jwe]
jwe
parents: 5105
diff changeset
210 for (octave_idx_type i = 0; i < a.rows (); i++)
23b37da9fd5b [project @ 2005-04-08 16:07:35 by jwe]
jwe
parents: 5105
diff changeset
211 for (octave_idx_type j = 0; j < a.cols (); j++)
2828
92826d6e8bd9 [project @ 1997-03-25 23:41:41 by jwe]
jwe
parents: 2800
diff changeset
212 elem (i, j) = a.elem (i, j);
92826d6e8bd9 [project @ 1997-03-25 23:41:41 by jwe]
jwe
parents: 2800
diff changeset
213 }
92826d6e8bd9 [project @ 1997-03-25 23:41:41 by jwe]
jwe
parents: 2800
diff changeset
214
1574
dd7d27461567 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents: 1561
diff changeset
215 Matrix::Matrix (const charMatrix& a)
dd7d27461567 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents: 1561
diff changeset
216 : MArray2<double> (a.rows (), a.cols ())
dd7d27461567 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents: 1561
diff changeset
217 {
5275
23b37da9fd5b [project @ 2005-04-08 16:07:35 by jwe]
jwe
parents: 5105
diff changeset
218 for (octave_idx_type i = 0; i < a.rows (); i++)
23b37da9fd5b [project @ 2005-04-08 16:07:35 by jwe]
jwe
parents: 5105
diff changeset
219 for (octave_idx_type j = 0; j < a.cols (); j++)
1574
dd7d27461567 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents: 1561
diff changeset
220 elem (i, j) = a.elem (i, j);
dd7d27461567 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents: 1561
diff changeset
221 }
dd7d27461567 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents: 1561
diff changeset
222
2385
170053c0f75e [project @ 1996-10-12 18:23:01 by jwe]
jwe
parents: 2354
diff changeset
223 bool
458
38cb88095913 [project @ 1994-06-06 00:41:10 by jwe]
jwe
parents:
diff changeset
224 Matrix::operator == (const Matrix& a) const
38cb88095913 [project @ 1994-06-06 00:41:10 by jwe]
jwe
parents:
diff changeset
225 {
38cb88095913 [project @ 1994-06-06 00:41:10 by jwe]
jwe
parents:
diff changeset
226 if (rows () != a.rows () || cols () != a.cols ())
2385
170053c0f75e [project @ 1996-10-12 18:23:01 by jwe]
jwe
parents: 2354
diff changeset
227 return false;
458
38cb88095913 [project @ 1994-06-06 00:41:10 by jwe]
jwe
parents:
diff changeset
228
3769
7c8e3c42ed04 [project @ 2001-01-31 22:15:51 by jwe]
jwe
parents: 3754
diff changeset
229 return mx_inline_equal (data (), a.data (), length ());
458
38cb88095913 [project @ 1994-06-06 00:41:10 by jwe]
jwe
parents:
diff changeset
230 }
38cb88095913 [project @ 1994-06-06 00:41:10 by jwe]
jwe
parents:
diff changeset
231
2385
170053c0f75e [project @ 1996-10-12 18:23:01 by jwe]
jwe
parents: 2354
diff changeset
232 bool
458
38cb88095913 [project @ 1994-06-06 00:41:10 by jwe]
jwe
parents:
diff changeset
233 Matrix::operator != (const Matrix& a) const
38cb88095913 [project @ 1994-06-06 00:41:10 by jwe]
jwe
parents:
diff changeset
234 {
38cb88095913 [project @ 1994-06-06 00:41:10 by jwe]
jwe
parents:
diff changeset
235 return !(*this == a);
38cb88095913 [project @ 1994-06-06 00:41:10 by jwe]
jwe
parents:
diff changeset
236 }
38cb88095913 [project @ 1994-06-06 00:41:10 by jwe]
jwe
parents:
diff changeset
237
3354
87721841efd7 [project @ 1999-11-17 19:06:11 by jwe]
jwe
parents: 3331
diff changeset
238 bool
87721841efd7 [project @ 1999-11-17 19:06:11 by jwe]
jwe
parents: 3331
diff changeset
239 Matrix::is_symmetric (void) const
87721841efd7 [project @ 1999-11-17 19:06:11 by jwe]
jwe
parents: 3331
diff changeset
240 {
87721841efd7 [project @ 1999-11-17 19:06:11 by jwe]
jwe
parents: 3331
diff changeset
241 if (is_square () && rows () > 0)
87721841efd7 [project @ 1999-11-17 19:06:11 by jwe]
jwe
parents: 3331
diff changeset
242 {
5275
23b37da9fd5b [project @ 2005-04-08 16:07:35 by jwe]
jwe
parents: 5105
diff changeset
243 for (octave_idx_type i = 0; i < rows (); i++)
23b37da9fd5b [project @ 2005-04-08 16:07:35 by jwe]
jwe
parents: 5105
diff changeset
244 for (octave_idx_type j = i+1; j < cols (); j++)
3354
87721841efd7 [project @ 1999-11-17 19:06:11 by jwe]
jwe
parents: 3331
diff changeset
245 if (elem (i, j) != elem (j, i))
87721841efd7 [project @ 1999-11-17 19:06:11 by jwe]
jwe
parents: 3331
diff changeset
246 return false;
87721841efd7 [project @ 1999-11-17 19:06:11 by jwe]
jwe
parents: 3331
diff changeset
247
87721841efd7 [project @ 1999-11-17 19:06:11 by jwe]
jwe
parents: 3331
diff changeset
248 return true;
87721841efd7 [project @ 1999-11-17 19:06:11 by jwe]
jwe
parents: 3331
diff changeset
249 }
87721841efd7 [project @ 1999-11-17 19:06:11 by jwe]
jwe
parents: 3331
diff changeset
250
87721841efd7 [project @ 1999-11-17 19:06:11 by jwe]
jwe
parents: 3331
diff changeset
251 return false;
87721841efd7 [project @ 1999-11-17 19:06:11 by jwe]
jwe
parents: 3331
diff changeset
252 }
87721841efd7 [project @ 1999-11-17 19:06:11 by jwe]
jwe
parents: 3331
diff changeset
253
458
38cb88095913 [project @ 1994-06-06 00:41:10 by jwe]
jwe
parents:
diff changeset
254 Matrix&
5275
23b37da9fd5b [project @ 2005-04-08 16:07:35 by jwe]
jwe
parents: 5105
diff changeset
255 Matrix::insert (const Matrix& a, octave_idx_type r, octave_idx_type c)
458
38cb88095913 [project @ 1994-06-06 00:41:10 by jwe]
jwe
parents:
diff changeset
256 {
1561
ffee86c37931 [project @ 1995-10-12 08:08:25 by jwe]
jwe
parents: 1484
diff changeset
257 Array2<double>::insert (a, r, c);
458
38cb88095913 [project @ 1994-06-06 00:41:10 by jwe]
jwe
parents:
diff changeset
258 return *this;
38cb88095913 [project @ 1994-06-06 00:41:10 by jwe]
jwe
parents:
diff changeset
259 }
38cb88095913 [project @ 1994-06-06 00:41:10 by jwe]
jwe
parents:
diff changeset
260
38cb88095913 [project @ 1994-06-06 00:41:10 by jwe]
jwe
parents:
diff changeset
261 Matrix&
5275
23b37da9fd5b [project @ 2005-04-08 16:07:35 by jwe]
jwe
parents: 5105
diff changeset
262 Matrix::insert (const RowVector& a, octave_idx_type r, octave_idx_type c)
458
38cb88095913 [project @ 1994-06-06 00:41:10 by jwe]
jwe
parents:
diff changeset
263 {
5275
23b37da9fd5b [project @ 2005-04-08 16:07:35 by jwe]
jwe
parents: 5105
diff changeset
264 octave_idx_type a_len = a.length ();
4316
236c10efcde2 [project @ 2003-02-10 21:57:15 by jwe]
jwe
parents: 4309
diff changeset
265
1698
0892abda7553 [project @ 1996-01-07 02:28:21 by jwe]
jwe
parents: 1697
diff changeset
266 if (r < 0 || r >= rows () || c < 0 || c + a_len > cols ())
458
38cb88095913 [project @ 1994-06-06 00:41:10 by jwe]
jwe
parents:
diff changeset
267 {
38cb88095913 [project @ 1994-06-06 00:41:10 by jwe]
jwe
parents:
diff changeset
268 (*current_liboctave_error_handler) ("range error for insert");
38cb88095913 [project @ 1994-06-06 00:41:10 by jwe]
jwe
parents:
diff changeset
269 return *this;
38cb88095913 [project @ 1994-06-06 00:41:10 by jwe]
jwe
parents:
diff changeset
270 }
38cb88095913 [project @ 1994-06-06 00:41:10 by jwe]
jwe
parents:
diff changeset
271
4316
236c10efcde2 [project @ 2003-02-10 21:57:15 by jwe]
jwe
parents: 4309
diff changeset
272 if (a_len > 0)
236c10efcde2 [project @ 2003-02-10 21:57:15 by jwe]
jwe
parents: 4309
diff changeset
273 {
236c10efcde2 [project @ 2003-02-10 21:57:15 by jwe]
jwe
parents: 4309
diff changeset
274 make_unique ();
236c10efcde2 [project @ 2003-02-10 21:57:15 by jwe]
jwe
parents: 4309
diff changeset
275
5275
23b37da9fd5b [project @ 2005-04-08 16:07:35 by jwe]
jwe
parents: 5105
diff changeset
276 for (octave_idx_type i = 0; i < a_len; i++)
4316
236c10efcde2 [project @ 2003-02-10 21:57:15 by jwe]
jwe
parents: 4309
diff changeset
277 xelem (r, c+i) = a.elem (i);
236c10efcde2 [project @ 2003-02-10 21:57:15 by jwe]
jwe
parents: 4309
diff changeset
278 }
458
38cb88095913 [project @ 1994-06-06 00:41:10 by jwe]
jwe
parents:
diff changeset
279
38cb88095913 [project @ 1994-06-06 00:41:10 by jwe]
jwe
parents:
diff changeset
280 return *this;
38cb88095913 [project @ 1994-06-06 00:41:10 by jwe]
jwe
parents:
diff changeset
281 }
38cb88095913 [project @ 1994-06-06 00:41:10 by jwe]
jwe
parents:
diff changeset
282
38cb88095913 [project @ 1994-06-06 00:41:10 by jwe]
jwe
parents:
diff changeset
283 Matrix&
5275
23b37da9fd5b [project @ 2005-04-08 16:07:35 by jwe]
jwe
parents: 5105
diff changeset
284 Matrix::insert (const ColumnVector& a, octave_idx_type r, octave_idx_type c)
458
38cb88095913 [project @ 1994-06-06 00:41:10 by jwe]
jwe
parents:
diff changeset
285 {
5275
23b37da9fd5b [project @ 2005-04-08 16:07:35 by jwe]
jwe
parents: 5105
diff changeset
286 octave_idx_type a_len = a.length ();
4316
236c10efcde2 [project @ 2003-02-10 21:57:15 by jwe]
jwe
parents: 4309
diff changeset
287
1698
0892abda7553 [project @ 1996-01-07 02:28:21 by jwe]
jwe
parents: 1697
diff changeset
288 if (r < 0 || r + a_len > rows () || c < 0 || c >= cols ())
458
38cb88095913 [project @ 1994-06-06 00:41:10 by jwe]
jwe
parents:
diff changeset
289 {
38cb88095913 [project @ 1994-06-06 00:41:10 by jwe]
jwe
parents:
diff changeset
290 (*current_liboctave_error_handler) ("range error for insert");
38cb88095913 [project @ 1994-06-06 00:41:10 by jwe]
jwe
parents:
diff changeset
291 return *this;
38cb88095913 [project @ 1994-06-06 00:41:10 by jwe]
jwe
parents:
diff changeset
292 }
38cb88095913 [project @ 1994-06-06 00:41:10 by jwe]
jwe
parents:
diff changeset
293
4316
236c10efcde2 [project @ 2003-02-10 21:57:15 by jwe]
jwe
parents: 4309
diff changeset
294 if (a_len > 0)
236c10efcde2 [project @ 2003-02-10 21:57:15 by jwe]
jwe
parents: 4309
diff changeset
295 {
236c10efcde2 [project @ 2003-02-10 21:57:15 by jwe]
jwe
parents: 4309
diff changeset
296 make_unique ();
236c10efcde2 [project @ 2003-02-10 21:57:15 by jwe]
jwe
parents: 4309
diff changeset
297
5275
23b37da9fd5b [project @ 2005-04-08 16:07:35 by jwe]
jwe
parents: 5105
diff changeset
298 for (octave_idx_type i = 0; i < a_len; i++)
4316
236c10efcde2 [project @ 2003-02-10 21:57:15 by jwe]
jwe
parents: 4309
diff changeset
299 xelem (r+i, c) = a.elem (i);
236c10efcde2 [project @ 2003-02-10 21:57:15 by jwe]
jwe
parents: 4309
diff changeset
300 }
458
38cb88095913 [project @ 1994-06-06 00:41:10 by jwe]
jwe
parents:
diff changeset
301
38cb88095913 [project @ 1994-06-06 00:41:10 by jwe]
jwe
parents:
diff changeset
302 return *this;
38cb88095913 [project @ 1994-06-06 00:41:10 by jwe]
jwe
parents:
diff changeset
303 }
38cb88095913 [project @ 1994-06-06 00:41:10 by jwe]
jwe
parents:
diff changeset
304
38cb88095913 [project @ 1994-06-06 00:41:10 by jwe]
jwe
parents:
diff changeset
305 Matrix&
5275
23b37da9fd5b [project @ 2005-04-08 16:07:35 by jwe]
jwe
parents: 5105
diff changeset
306 Matrix::insert (const DiagMatrix& a, octave_idx_type r, octave_idx_type c)
458
38cb88095913 [project @ 1994-06-06 00:41:10 by jwe]
jwe
parents:
diff changeset
307 {
5275
23b37da9fd5b [project @ 2005-04-08 16:07:35 by jwe]
jwe
parents: 5105
diff changeset
308 octave_idx_type a_nr = a.rows ();
23b37da9fd5b [project @ 2005-04-08 16:07:35 by jwe]
jwe
parents: 5105
diff changeset
309 octave_idx_type a_nc = a.cols ();
1697
597c3ca9f6e8 [project @ 1996-01-07 02:13:24 by jwe]
jwe
parents: 1657
diff changeset
310
1698
0892abda7553 [project @ 1996-01-07 02:28:21 by jwe]
jwe
parents: 1697
diff changeset
311 if (r < 0 || r + a_nr > rows () || c < 0 || c + a_nc > cols ())
458
38cb88095913 [project @ 1994-06-06 00:41:10 by jwe]
jwe
parents:
diff changeset
312 {
38cb88095913 [project @ 1994-06-06 00:41:10 by jwe]
jwe
parents:
diff changeset
313 (*current_liboctave_error_handler) ("range error for insert");
38cb88095913 [project @ 1994-06-06 00:41:10 by jwe]
jwe
parents:
diff changeset
314 return *this;
38cb88095913 [project @ 1994-06-06 00:41:10 by jwe]
jwe
parents:
diff changeset
315 }
38cb88095913 [project @ 1994-06-06 00:41:10 by jwe]
jwe
parents:
diff changeset
316
1697
597c3ca9f6e8 [project @ 1996-01-07 02:13:24 by jwe]
jwe
parents: 1657
diff changeset
317 fill (0.0, r, c, r + a_nr - 1, c + a_nc - 1);
597c3ca9f6e8 [project @ 1996-01-07 02:13:24 by jwe]
jwe
parents: 1657
diff changeset
318
5275
23b37da9fd5b [project @ 2005-04-08 16:07:35 by jwe]
jwe
parents: 5105
diff changeset
319 octave_idx_type a_len = a.length ();
4316
236c10efcde2 [project @ 2003-02-10 21:57:15 by jwe]
jwe
parents: 4309
diff changeset
320
236c10efcde2 [project @ 2003-02-10 21:57:15 by jwe]
jwe
parents: 4309
diff changeset
321 if (a_len > 0)
236c10efcde2 [project @ 2003-02-10 21:57:15 by jwe]
jwe
parents: 4309
diff changeset
322 {
236c10efcde2 [project @ 2003-02-10 21:57:15 by jwe]
jwe
parents: 4309
diff changeset
323 make_unique ();
236c10efcde2 [project @ 2003-02-10 21:57:15 by jwe]
jwe
parents: 4309
diff changeset
324
5275
23b37da9fd5b [project @ 2005-04-08 16:07:35 by jwe]
jwe
parents: 5105
diff changeset
325 for (octave_idx_type i = 0; i < a_len; i++)
4316
236c10efcde2 [project @ 2003-02-10 21:57:15 by jwe]
jwe
parents: 4309
diff changeset
326 xelem (r+i, c+i) = a.elem (i, i);
236c10efcde2 [project @ 2003-02-10 21:57:15 by jwe]
jwe
parents: 4309
diff changeset
327 }
458
38cb88095913 [project @ 1994-06-06 00:41:10 by jwe]
jwe
parents:
diff changeset
328
38cb88095913 [project @ 1994-06-06 00:41:10 by jwe]
jwe
parents:
diff changeset
329 return *this;
38cb88095913 [project @ 1994-06-06 00:41:10 by jwe]
jwe
parents:
diff changeset
330 }
38cb88095913 [project @ 1994-06-06 00:41:10 by jwe]
jwe
parents:
diff changeset
331
38cb88095913 [project @ 1994-06-06 00:41:10 by jwe]
jwe
parents:
diff changeset
332 Matrix&
38cb88095913 [project @ 1994-06-06 00:41:10 by jwe]
jwe
parents:
diff changeset
333 Matrix::fill (double val)
38cb88095913 [project @ 1994-06-06 00:41:10 by jwe]
jwe
parents:
diff changeset
334 {
5275
23b37da9fd5b [project @ 2005-04-08 16:07:35 by jwe]
jwe
parents: 5105
diff changeset
335 octave_idx_type nr = rows ();
23b37da9fd5b [project @ 2005-04-08 16:07:35 by jwe]
jwe
parents: 5105
diff changeset
336 octave_idx_type nc = cols ();
4316
236c10efcde2 [project @ 2003-02-10 21:57:15 by jwe]
jwe
parents: 4309
diff changeset
337
458
38cb88095913 [project @ 1994-06-06 00:41:10 by jwe]
jwe
parents:
diff changeset
338 if (nr > 0 && nc > 0)
4316
236c10efcde2 [project @ 2003-02-10 21:57:15 by jwe]
jwe
parents: 4309
diff changeset
339 {
236c10efcde2 [project @ 2003-02-10 21:57:15 by jwe]
jwe
parents: 4309
diff changeset
340 make_unique ();
236c10efcde2 [project @ 2003-02-10 21:57:15 by jwe]
jwe
parents: 4309
diff changeset
341
5275
23b37da9fd5b [project @ 2005-04-08 16:07:35 by jwe]
jwe
parents: 5105
diff changeset
342 for (octave_idx_type j = 0; j < nc; j++)
23b37da9fd5b [project @ 2005-04-08 16:07:35 by jwe]
jwe
parents: 5105
diff changeset
343 for (octave_idx_type i = 0; i < nr; i++)
4316
236c10efcde2 [project @ 2003-02-10 21:57:15 by jwe]
jwe
parents: 4309
diff changeset
344 xelem (i, j) = val;
236c10efcde2 [project @ 2003-02-10 21:57:15 by jwe]
jwe
parents: 4309
diff changeset
345 }
458
38cb88095913 [project @ 1994-06-06 00:41:10 by jwe]
jwe
parents:
diff changeset
346
38cb88095913 [project @ 1994-06-06 00:41:10 by jwe]
jwe
parents:
diff changeset
347 return *this;
38cb88095913 [project @ 1994-06-06 00:41:10 by jwe]
jwe
parents:
diff changeset
348 }
38cb88095913 [project @ 1994-06-06 00:41:10 by jwe]
jwe
parents:
diff changeset
349
38cb88095913 [project @ 1994-06-06 00:41:10 by jwe]
jwe
parents:
diff changeset
350 Matrix&
5275
23b37da9fd5b [project @ 2005-04-08 16:07:35 by jwe]
jwe
parents: 5105
diff changeset
351 Matrix::fill (double val, octave_idx_type r1, octave_idx_type c1, octave_idx_type r2, octave_idx_type c2)
458
38cb88095913 [project @ 1994-06-06 00:41:10 by jwe]
jwe
parents:
diff changeset
352 {
5275
23b37da9fd5b [project @ 2005-04-08 16:07:35 by jwe]
jwe
parents: 5105
diff changeset
353 octave_idx_type nr = rows ();
23b37da9fd5b [project @ 2005-04-08 16:07:35 by jwe]
jwe
parents: 5105
diff changeset
354 octave_idx_type nc = cols ();
4316
236c10efcde2 [project @ 2003-02-10 21:57:15 by jwe]
jwe
parents: 4309
diff changeset
355
458
38cb88095913 [project @ 1994-06-06 00:41:10 by jwe]
jwe
parents:
diff changeset
356 if (r1 < 0 || r2 < 0 || c1 < 0 || c2 < 0
38cb88095913 [project @ 1994-06-06 00:41:10 by jwe]
jwe
parents:
diff changeset
357 || r1 >= nr || r2 >= nr || c1 >= nc || c2 >= nc)
38cb88095913 [project @ 1994-06-06 00:41:10 by jwe]
jwe
parents:
diff changeset
358 {
38cb88095913 [project @ 1994-06-06 00:41:10 by jwe]
jwe
parents:
diff changeset
359 (*current_liboctave_error_handler) ("range error for fill");
38cb88095913 [project @ 1994-06-06 00:41:10 by jwe]
jwe
parents:
diff changeset
360 return *this;
38cb88095913 [project @ 1994-06-06 00:41:10 by jwe]
jwe
parents:
diff changeset
361 }
38cb88095913 [project @ 1994-06-06 00:41:10 by jwe]
jwe
parents:
diff changeset
362
5275
23b37da9fd5b [project @ 2005-04-08 16:07:35 by jwe]
jwe
parents: 5105
diff changeset
363 if (r1 > r2) { octave_idx_type tmp = r1; r1 = r2; r2 = tmp; }
23b37da9fd5b [project @ 2005-04-08 16:07:35 by jwe]
jwe
parents: 5105
diff changeset
364 if (c1 > c2) { octave_idx_type tmp = c1; c1 = c2; c2 = tmp; }
458
38cb88095913 [project @ 1994-06-06 00:41:10 by jwe]
jwe
parents:
diff changeset
365
4316
236c10efcde2 [project @ 2003-02-10 21:57:15 by jwe]
jwe
parents: 4309
diff changeset
366 if (r2 >= r1 && c2 >= c1)
236c10efcde2 [project @ 2003-02-10 21:57:15 by jwe]
jwe
parents: 4309
diff changeset
367 {
236c10efcde2 [project @ 2003-02-10 21:57:15 by jwe]
jwe
parents: 4309
diff changeset
368 make_unique ();
236c10efcde2 [project @ 2003-02-10 21:57:15 by jwe]
jwe
parents: 4309
diff changeset
369
5275
23b37da9fd5b [project @ 2005-04-08 16:07:35 by jwe]
jwe
parents: 5105
diff changeset
370 for (octave_idx_type j = c1; j <= c2; j++)
23b37da9fd5b [project @ 2005-04-08 16:07:35 by jwe]
jwe
parents: 5105
diff changeset
371 for (octave_idx_type i = r1; i <= r2; i++)
4316
236c10efcde2 [project @ 2003-02-10 21:57:15 by jwe]
jwe
parents: 4309
diff changeset
372 xelem (i, j) = val;
236c10efcde2 [project @ 2003-02-10 21:57:15 by jwe]
jwe
parents: 4309
diff changeset
373 }
458
38cb88095913 [project @ 1994-06-06 00:41:10 by jwe]
jwe
parents:
diff changeset
374
38cb88095913 [project @ 1994-06-06 00:41:10 by jwe]
jwe
parents:
diff changeset
375 return *this;
38cb88095913 [project @ 1994-06-06 00:41:10 by jwe]
jwe
parents:
diff changeset
376 }
38cb88095913 [project @ 1994-06-06 00:41:10 by jwe]
jwe
parents:
diff changeset
377
38cb88095913 [project @ 1994-06-06 00:41:10 by jwe]
jwe
parents:
diff changeset
378 Matrix
38cb88095913 [project @ 1994-06-06 00:41:10 by jwe]
jwe
parents:
diff changeset
379 Matrix::append (const Matrix& a) const
38cb88095913 [project @ 1994-06-06 00:41:10 by jwe]
jwe
parents:
diff changeset
380 {
5275
23b37da9fd5b [project @ 2005-04-08 16:07:35 by jwe]
jwe
parents: 5105
diff changeset
381 octave_idx_type nr = rows ();
23b37da9fd5b [project @ 2005-04-08 16:07:35 by jwe]
jwe
parents: 5105
diff changeset
382 octave_idx_type nc = cols ();
458
38cb88095913 [project @ 1994-06-06 00:41:10 by jwe]
jwe
parents:
diff changeset
383 if (nr != a.rows ())
38cb88095913 [project @ 1994-06-06 00:41:10 by jwe]
jwe
parents:
diff changeset
384 {
38cb88095913 [project @ 1994-06-06 00:41:10 by jwe]
jwe
parents:
diff changeset
385 (*current_liboctave_error_handler) ("row dimension mismatch for append");
38cb88095913 [project @ 1994-06-06 00:41:10 by jwe]
jwe
parents:
diff changeset
386 return Matrix ();
38cb88095913 [project @ 1994-06-06 00:41:10 by jwe]
jwe
parents:
diff changeset
387 }
38cb88095913 [project @ 1994-06-06 00:41:10 by jwe]
jwe
parents:
diff changeset
388
5275
23b37da9fd5b [project @ 2005-04-08 16:07:35 by jwe]
jwe
parents: 5105
diff changeset
389 octave_idx_type nc_insert = nc;
458
38cb88095913 [project @ 1994-06-06 00:41:10 by jwe]
jwe
parents:
diff changeset
390 Matrix retval (nr, nc + a.cols ());
38cb88095913 [project @ 1994-06-06 00:41:10 by jwe]
jwe
parents:
diff changeset
391 retval.insert (*this, 0, 0);
38cb88095913 [project @ 1994-06-06 00:41:10 by jwe]
jwe
parents:
diff changeset
392 retval.insert (a, 0, nc_insert);
38cb88095913 [project @ 1994-06-06 00:41:10 by jwe]
jwe
parents:
diff changeset
393 return retval;
38cb88095913 [project @ 1994-06-06 00:41:10 by jwe]
jwe
parents:
diff changeset
394 }
38cb88095913 [project @ 1994-06-06 00:41:10 by jwe]
jwe
parents:
diff changeset
395
38cb88095913 [project @ 1994-06-06 00:41:10 by jwe]
jwe
parents:
diff changeset
396 Matrix
38cb88095913 [project @ 1994-06-06 00:41:10 by jwe]
jwe
parents:
diff changeset
397 Matrix::append (const RowVector& a) const
38cb88095913 [project @ 1994-06-06 00:41:10 by jwe]
jwe
parents:
diff changeset
398 {
5275
23b37da9fd5b [project @ 2005-04-08 16:07:35 by jwe]
jwe
parents: 5105
diff changeset
399 octave_idx_type nr = rows ();
23b37da9fd5b [project @ 2005-04-08 16:07:35 by jwe]
jwe
parents: 5105
diff changeset
400 octave_idx_type nc = cols ();
458
38cb88095913 [project @ 1994-06-06 00:41:10 by jwe]
jwe
parents:
diff changeset
401 if (nr != 1)
38cb88095913 [project @ 1994-06-06 00:41:10 by jwe]
jwe
parents:
diff changeset
402 {
38cb88095913 [project @ 1994-06-06 00:41:10 by jwe]
jwe
parents:
diff changeset
403 (*current_liboctave_error_handler) ("row dimension mismatch for append");
38cb88095913 [project @ 1994-06-06 00:41:10 by jwe]
jwe
parents:
diff changeset
404 return Matrix ();
38cb88095913 [project @ 1994-06-06 00:41:10 by jwe]
jwe
parents:
diff changeset
405 }
38cb88095913 [project @ 1994-06-06 00:41:10 by jwe]
jwe
parents:
diff changeset
406
5275
23b37da9fd5b [project @ 2005-04-08 16:07:35 by jwe]
jwe
parents: 5105
diff changeset
407 octave_idx_type nc_insert = nc;
458
38cb88095913 [project @ 1994-06-06 00:41:10 by jwe]
jwe
parents:
diff changeset
408 Matrix retval (nr, nc + a.length ());
38cb88095913 [project @ 1994-06-06 00:41:10 by jwe]
jwe
parents:
diff changeset
409 retval.insert (*this, 0, 0);
38cb88095913 [project @ 1994-06-06 00:41:10 by jwe]
jwe
parents:
diff changeset
410 retval.insert (a, 0, nc_insert);
38cb88095913 [project @ 1994-06-06 00:41:10 by jwe]
jwe
parents:
diff changeset
411 return retval;
38cb88095913 [project @ 1994-06-06 00:41:10 by jwe]
jwe
parents:
diff changeset
412 }
38cb88095913 [project @ 1994-06-06 00:41:10 by jwe]
jwe
parents:
diff changeset
413
38cb88095913 [project @ 1994-06-06 00:41:10 by jwe]
jwe
parents:
diff changeset
414 Matrix
38cb88095913 [project @ 1994-06-06 00:41:10 by jwe]
jwe
parents:
diff changeset
415 Matrix::append (const ColumnVector& a) const
38cb88095913 [project @ 1994-06-06 00:41:10 by jwe]
jwe
parents:
diff changeset
416 {
5275
23b37da9fd5b [project @ 2005-04-08 16:07:35 by jwe]
jwe
parents: 5105
diff changeset
417 octave_idx_type nr = rows ();
23b37da9fd5b [project @ 2005-04-08 16:07:35 by jwe]
jwe
parents: 5105
diff changeset
418 octave_idx_type nc = cols ();
458
38cb88095913 [project @ 1994-06-06 00:41:10 by jwe]
jwe
parents:
diff changeset
419 if (nr != a.length ())
38cb88095913 [project @ 1994-06-06 00:41:10 by jwe]
jwe
parents:
diff changeset
420 {
38cb88095913 [project @ 1994-06-06 00:41:10 by jwe]
jwe
parents:
diff changeset
421 (*current_liboctave_error_handler) ("row dimension mismatch for append");
38cb88095913 [project @ 1994-06-06 00:41:10 by jwe]
jwe
parents:
diff changeset
422 return Matrix ();
38cb88095913 [project @ 1994-06-06 00:41:10 by jwe]
jwe
parents:
diff changeset
423 }
38cb88095913 [project @ 1994-06-06 00:41:10 by jwe]
jwe
parents:
diff changeset
424
5275
23b37da9fd5b [project @ 2005-04-08 16:07:35 by jwe]
jwe
parents: 5105
diff changeset
425 octave_idx_type nc_insert = nc;
458
38cb88095913 [project @ 1994-06-06 00:41:10 by jwe]
jwe
parents:
diff changeset
426 Matrix retval (nr, nc + 1);
38cb88095913 [project @ 1994-06-06 00:41:10 by jwe]
jwe
parents:
diff changeset
427 retval.insert (*this, 0, 0);
38cb88095913 [project @ 1994-06-06 00:41:10 by jwe]
jwe
parents:
diff changeset
428 retval.insert (a, 0, nc_insert);
38cb88095913 [project @ 1994-06-06 00:41:10 by jwe]
jwe
parents:
diff changeset
429 return retval;
38cb88095913 [project @ 1994-06-06 00:41:10 by jwe]
jwe
parents:
diff changeset
430 }
38cb88095913 [project @ 1994-06-06 00:41:10 by jwe]
jwe
parents:
diff changeset
431
38cb88095913 [project @ 1994-06-06 00:41:10 by jwe]
jwe
parents:
diff changeset
432 Matrix
38cb88095913 [project @ 1994-06-06 00:41:10 by jwe]
jwe
parents:
diff changeset
433 Matrix::append (const DiagMatrix& a) const
38cb88095913 [project @ 1994-06-06 00:41:10 by jwe]
jwe
parents:
diff changeset
434 {
5275
23b37da9fd5b [project @ 2005-04-08 16:07:35 by jwe]
jwe
parents: 5105
diff changeset
435 octave_idx_type nr = rows ();
23b37da9fd5b [project @ 2005-04-08 16:07:35 by jwe]
jwe
parents: 5105
diff changeset
436 octave_idx_type nc = cols ();
458
38cb88095913 [project @ 1994-06-06 00:41:10 by jwe]
jwe
parents:
diff changeset
437 if (nr != a.rows ())
38cb88095913 [project @ 1994-06-06 00:41:10 by jwe]
jwe
parents:
diff changeset
438 {
38cb88095913 [project @ 1994-06-06 00:41:10 by jwe]
jwe
parents:
diff changeset
439 (*current_liboctave_error_handler) ("row dimension mismatch for append");
38cb88095913 [project @ 1994-06-06 00:41:10 by jwe]
jwe
parents:
diff changeset
440 return *this;
38cb88095913 [project @ 1994-06-06 00:41:10 by jwe]
jwe
parents:
diff changeset
441 }
38cb88095913 [project @ 1994-06-06 00:41:10 by jwe]
jwe
parents:
diff changeset
442
5275
23b37da9fd5b [project @ 2005-04-08 16:07:35 by jwe]
jwe
parents: 5105
diff changeset
443 octave_idx_type nc_insert = nc;
458
38cb88095913 [project @ 1994-06-06 00:41:10 by jwe]
jwe
parents:
diff changeset
444 Matrix retval (nr, nc + a.cols ());
38cb88095913 [project @ 1994-06-06 00:41:10 by jwe]
jwe
parents:
diff changeset
445 retval.insert (*this, 0, 0);
38cb88095913 [project @ 1994-06-06 00:41:10 by jwe]
jwe
parents:
diff changeset
446 retval.insert (a, 0, nc_insert);
38cb88095913 [project @ 1994-06-06 00:41:10 by jwe]
jwe
parents:
diff changeset
447 return retval;
38cb88095913 [project @ 1994-06-06 00:41:10 by jwe]
jwe
parents:
diff changeset
448 }
38cb88095913 [project @ 1994-06-06 00:41:10 by jwe]
jwe
parents:
diff changeset
449
38cb88095913 [project @ 1994-06-06 00:41:10 by jwe]
jwe
parents:
diff changeset
450 Matrix
38cb88095913 [project @ 1994-06-06 00:41:10 by jwe]
jwe
parents:
diff changeset
451 Matrix::stack (const Matrix& a) const
38cb88095913 [project @ 1994-06-06 00:41:10 by jwe]
jwe
parents:
diff changeset
452 {
5275
23b37da9fd5b [project @ 2005-04-08 16:07:35 by jwe]
jwe
parents: 5105
diff changeset
453 octave_idx_type nr = rows ();
23b37da9fd5b [project @ 2005-04-08 16:07:35 by jwe]
jwe
parents: 5105
diff changeset
454 octave_idx_type nc = cols ();
458
38cb88095913 [project @ 1994-06-06 00:41:10 by jwe]
jwe
parents:
diff changeset
455 if (nc != a.cols ())
38cb88095913 [project @ 1994-06-06 00:41:10 by jwe]
jwe
parents:
diff changeset
456 {
38cb88095913 [project @ 1994-06-06 00:41:10 by jwe]
jwe
parents:
diff changeset
457 (*current_liboctave_error_handler)
38cb88095913 [project @ 1994-06-06 00:41:10 by jwe]
jwe
parents:
diff changeset
458 ("column dimension mismatch for stack");
38cb88095913 [project @ 1994-06-06 00:41:10 by jwe]
jwe
parents:
diff changeset
459 return Matrix ();
38cb88095913 [project @ 1994-06-06 00:41:10 by jwe]
jwe
parents:
diff changeset
460 }
38cb88095913 [project @ 1994-06-06 00:41:10 by jwe]
jwe
parents:
diff changeset
461
5275
23b37da9fd5b [project @ 2005-04-08 16:07:35 by jwe]
jwe
parents: 5105
diff changeset
462 octave_idx_type nr_insert = nr;
458
38cb88095913 [project @ 1994-06-06 00:41:10 by jwe]
jwe
parents:
diff changeset
463 Matrix retval (nr + a.rows (), nc);
38cb88095913 [project @ 1994-06-06 00:41:10 by jwe]
jwe
parents:
diff changeset
464 retval.insert (*this, 0, 0);
38cb88095913 [project @ 1994-06-06 00:41:10 by jwe]
jwe
parents:
diff changeset
465 retval.insert (a, nr_insert, 0);
38cb88095913 [project @ 1994-06-06 00:41:10 by jwe]
jwe
parents:
diff changeset
466 return retval;
38cb88095913 [project @ 1994-06-06 00:41:10 by jwe]
jwe
parents:
diff changeset
467 }
38cb88095913 [project @ 1994-06-06 00:41:10 by jwe]
jwe
parents:
diff changeset
468
38cb88095913 [project @ 1994-06-06 00:41:10 by jwe]
jwe
parents:
diff changeset
469 Matrix
38cb88095913 [project @ 1994-06-06 00:41:10 by jwe]
jwe
parents:
diff changeset
470 Matrix::stack (const RowVector& a) const
38cb88095913 [project @ 1994-06-06 00:41:10 by jwe]
jwe
parents:
diff changeset
471 {
5275
23b37da9fd5b [project @ 2005-04-08 16:07:35 by jwe]
jwe
parents: 5105
diff changeset
472 octave_idx_type nr = rows ();
23b37da9fd5b [project @ 2005-04-08 16:07:35 by jwe]
jwe
parents: 5105
diff changeset
473 octave_idx_type nc = cols ();
458
38cb88095913 [project @ 1994-06-06 00:41:10 by jwe]
jwe
parents:
diff changeset
474 if (nc != a.length ())
38cb88095913 [project @ 1994-06-06 00:41:10 by jwe]
jwe
parents:
diff changeset
475 {
38cb88095913 [project @ 1994-06-06 00:41:10 by jwe]
jwe
parents:
diff changeset
476 (*current_liboctave_error_handler)
38cb88095913 [project @ 1994-06-06 00:41:10 by jwe]
jwe
parents:
diff changeset
477 ("column dimension mismatch for stack");
38cb88095913 [project @ 1994-06-06 00:41:10 by jwe]
jwe
parents:
diff changeset
478 return Matrix ();
38cb88095913 [project @ 1994-06-06 00:41:10 by jwe]
jwe
parents:
diff changeset
479 }
38cb88095913 [project @ 1994-06-06 00:41:10 by jwe]
jwe
parents:
diff changeset
480
5275
23b37da9fd5b [project @ 2005-04-08 16:07:35 by jwe]
jwe
parents: 5105
diff changeset
481 octave_idx_type nr_insert = nr;
458
38cb88095913 [project @ 1994-06-06 00:41:10 by jwe]
jwe
parents:
diff changeset
482 Matrix retval (nr + 1, nc);
38cb88095913 [project @ 1994-06-06 00:41:10 by jwe]
jwe
parents:
diff changeset
483 retval.insert (*this, 0, 0);
38cb88095913 [project @ 1994-06-06 00:41:10 by jwe]
jwe
parents:
diff changeset
484 retval.insert (a, nr_insert, 0);
38cb88095913 [project @ 1994-06-06 00:41:10 by jwe]
jwe
parents:
diff changeset
485 return retval;
38cb88095913 [project @ 1994-06-06 00:41:10 by jwe]
jwe
parents:
diff changeset
486 }
38cb88095913 [project @ 1994-06-06 00:41:10 by jwe]
jwe
parents:
diff changeset
487
38cb88095913 [project @ 1994-06-06 00:41:10 by jwe]
jwe
parents:
diff changeset
488 Matrix
38cb88095913 [project @ 1994-06-06 00:41:10 by jwe]
jwe
parents:
diff changeset
489 Matrix::stack (const ColumnVector& a) const
38cb88095913 [project @ 1994-06-06 00:41:10 by jwe]
jwe
parents:
diff changeset
490 {
5275
23b37da9fd5b [project @ 2005-04-08 16:07:35 by jwe]
jwe
parents: 5105
diff changeset
491 octave_idx_type nr = rows ();
23b37da9fd5b [project @ 2005-04-08 16:07:35 by jwe]
jwe
parents: 5105
diff changeset
492 octave_idx_type nc = cols ();
458
38cb88095913 [project @ 1994-06-06 00:41:10 by jwe]
jwe
parents:
diff changeset
493 if (nc != 1)
38cb88095913 [project @ 1994-06-06 00:41:10 by jwe]
jwe
parents:
diff changeset
494 {
38cb88095913 [project @ 1994-06-06 00:41:10 by jwe]
jwe
parents:
diff changeset
495 (*current_liboctave_error_handler)
38cb88095913 [project @ 1994-06-06 00:41:10 by jwe]
jwe
parents:
diff changeset
496 ("column dimension mismatch for stack");
38cb88095913 [project @ 1994-06-06 00:41:10 by jwe]
jwe
parents:
diff changeset
497 return Matrix ();
38cb88095913 [project @ 1994-06-06 00:41:10 by jwe]
jwe
parents:
diff changeset
498 }
38cb88095913 [project @ 1994-06-06 00:41:10 by jwe]
jwe
parents:
diff changeset
499
5275
23b37da9fd5b [project @ 2005-04-08 16:07:35 by jwe]
jwe
parents: 5105
diff changeset
500 octave_idx_type nr_insert = nr;
458
38cb88095913 [project @ 1994-06-06 00:41:10 by jwe]
jwe
parents:
diff changeset
501 Matrix retval (nr + a.length (), nc);
38cb88095913 [project @ 1994-06-06 00:41:10 by jwe]
jwe
parents:
diff changeset
502 retval.insert (*this, 0, 0);
38cb88095913 [project @ 1994-06-06 00:41:10 by jwe]
jwe
parents:
diff changeset
503 retval.insert (a, nr_insert, 0);
38cb88095913 [project @ 1994-06-06 00:41:10 by jwe]
jwe
parents:
diff changeset
504 return retval;
38cb88095913 [project @ 1994-06-06 00:41:10 by jwe]
jwe
parents:
diff changeset
505 }
38cb88095913 [project @ 1994-06-06 00:41:10 by jwe]
jwe
parents:
diff changeset
506
38cb88095913 [project @ 1994-06-06 00:41:10 by jwe]
jwe
parents:
diff changeset
507 Matrix
38cb88095913 [project @ 1994-06-06 00:41:10 by jwe]
jwe
parents:
diff changeset
508 Matrix::stack (const DiagMatrix& a) const
38cb88095913 [project @ 1994-06-06 00:41:10 by jwe]
jwe
parents:
diff changeset
509 {
5275
23b37da9fd5b [project @ 2005-04-08 16:07:35 by jwe]
jwe
parents: 5105
diff changeset
510 octave_idx_type nr = rows ();
23b37da9fd5b [project @ 2005-04-08 16:07:35 by jwe]
jwe
parents: 5105
diff changeset
511 octave_idx_type nc = cols ();
458
38cb88095913 [project @ 1994-06-06 00:41:10 by jwe]
jwe
parents:
diff changeset
512 if (nc != a.cols ())
38cb88095913 [project @ 1994-06-06 00:41:10 by jwe]
jwe
parents:
diff changeset
513 {
38cb88095913 [project @ 1994-06-06 00:41:10 by jwe]
jwe
parents:
diff changeset
514 (*current_liboctave_error_handler)
38cb88095913 [project @ 1994-06-06 00:41:10 by jwe]
jwe
parents:
diff changeset
515 ("column dimension mismatch for stack");
38cb88095913 [project @ 1994-06-06 00:41:10 by jwe]
jwe
parents:
diff changeset
516 return Matrix ();
38cb88095913 [project @ 1994-06-06 00:41:10 by jwe]
jwe
parents:
diff changeset
517 }
38cb88095913 [project @ 1994-06-06 00:41:10 by jwe]
jwe
parents:
diff changeset
518
5275
23b37da9fd5b [project @ 2005-04-08 16:07:35 by jwe]
jwe
parents: 5105
diff changeset
519 octave_idx_type nr_insert = nr;
458
38cb88095913 [project @ 1994-06-06 00:41:10 by jwe]
jwe
parents:
diff changeset
520 Matrix retval (nr + a.rows (), nc);
38cb88095913 [project @ 1994-06-06 00:41:10 by jwe]
jwe
parents:
diff changeset
521 retval.insert (*this, 0, 0);
38cb88095913 [project @ 1994-06-06 00:41:10 by jwe]
jwe
parents:
diff changeset
522 retval.insert (a, nr_insert, 0);
38cb88095913 [project @ 1994-06-06 00:41:10 by jwe]
jwe
parents:
diff changeset
523 return retval;
38cb88095913 [project @ 1994-06-06 00:41:10 by jwe]
jwe
parents:
diff changeset
524 }
38cb88095913 [project @ 1994-06-06 00:41:10 by jwe]
jwe
parents:
diff changeset
525
38cb88095913 [project @ 1994-06-06 00:41:10 by jwe]
jwe
parents:
diff changeset
526 Matrix
1205
8302fab9fe24 [project @ 1995-04-04 02:05:01 by jwe]
jwe
parents: 1195
diff changeset
527 real (const ComplexMatrix& a)
8302fab9fe24 [project @ 1995-04-04 02:05:01 by jwe]
jwe
parents: 1195
diff changeset
528 {
5275
23b37da9fd5b [project @ 2005-04-08 16:07:35 by jwe]
jwe
parents: 5105
diff changeset
529 octave_idx_type a_len = a.length ();
1205
8302fab9fe24 [project @ 1995-04-04 02:05:01 by jwe]
jwe
parents: 1195
diff changeset
530 Matrix retval;
8302fab9fe24 [project @ 1995-04-04 02:05:01 by jwe]
jwe
parents: 1195
diff changeset
531 if (a_len > 0)
3769
7c8e3c42ed04 [project @ 2001-01-31 22:15:51 by jwe]
jwe
parents: 3754
diff changeset
532 retval = Matrix (mx_inline_real_dup (a.data (), a_len),
7c8e3c42ed04 [project @ 2001-01-31 22:15:51 by jwe]
jwe
parents: 3754
diff changeset
533 a.rows (), a.cols ());
1205
8302fab9fe24 [project @ 1995-04-04 02:05:01 by jwe]
jwe
parents: 1195
diff changeset
534 return retval;
8302fab9fe24 [project @ 1995-04-04 02:05:01 by jwe]
jwe
parents: 1195
diff changeset
535 }
8302fab9fe24 [project @ 1995-04-04 02:05:01 by jwe]
jwe
parents: 1195
diff changeset
536
8302fab9fe24 [project @ 1995-04-04 02:05:01 by jwe]
jwe
parents: 1195
diff changeset
537 Matrix
8302fab9fe24 [project @ 1995-04-04 02:05:01 by jwe]
jwe
parents: 1195
diff changeset
538 imag (const ComplexMatrix& a)
8302fab9fe24 [project @ 1995-04-04 02:05:01 by jwe]
jwe
parents: 1195
diff changeset
539 {
5275
23b37da9fd5b [project @ 2005-04-08 16:07:35 by jwe]
jwe
parents: 5105
diff changeset
540 octave_idx_type a_len = a.length ();
1205
8302fab9fe24 [project @ 1995-04-04 02:05:01 by jwe]
jwe
parents: 1195
diff changeset
541 Matrix retval;
8302fab9fe24 [project @ 1995-04-04 02:05:01 by jwe]
jwe
parents: 1195
diff changeset
542 if (a_len > 0)
3769
7c8e3c42ed04 [project @ 2001-01-31 22:15:51 by jwe]
jwe
parents: 3754
diff changeset
543 retval = Matrix (mx_inline_imag_dup (a.data (), a_len),
7c8e3c42ed04 [project @ 2001-01-31 22:15:51 by jwe]
jwe
parents: 3754
diff changeset
544 a.rows (), a.cols ());
1205
8302fab9fe24 [project @ 1995-04-04 02:05:01 by jwe]
jwe
parents: 1195
diff changeset
545 return retval;
8302fab9fe24 [project @ 1995-04-04 02:05:01 by jwe]
jwe
parents: 1195
diff changeset
546 }
8302fab9fe24 [project @ 1995-04-04 02:05:01 by jwe]
jwe
parents: 1195
diff changeset
547
8302fab9fe24 [project @ 1995-04-04 02:05:01 by jwe]
jwe
parents: 1195
diff changeset
548 Matrix
5275
23b37da9fd5b [project @ 2005-04-08 16:07:35 by jwe]
jwe
parents: 5105
diff changeset
549 Matrix::extract (octave_idx_type r1, octave_idx_type c1, octave_idx_type r2, octave_idx_type c2) const
458
38cb88095913 [project @ 1994-06-06 00:41:10 by jwe]
jwe
parents:
diff changeset
550 {
5275
23b37da9fd5b [project @ 2005-04-08 16:07:35 by jwe]
jwe
parents: 5105
diff changeset
551 if (r1 > r2) { octave_idx_type tmp = r1; r1 = r2; r2 = tmp; }
23b37da9fd5b [project @ 2005-04-08 16:07:35 by jwe]
jwe
parents: 5105
diff changeset
552 if (c1 > c2) { octave_idx_type tmp = c1; c1 = c2; c2 = tmp; }
23b37da9fd5b [project @ 2005-04-08 16:07:35 by jwe]
jwe
parents: 5105
diff changeset
553
23b37da9fd5b [project @ 2005-04-08 16:07:35 by jwe]
jwe
parents: 5105
diff changeset
554 octave_idx_type new_r = r2 - r1 + 1;
23b37da9fd5b [project @ 2005-04-08 16:07:35 by jwe]
jwe
parents: 5105
diff changeset
555 octave_idx_type new_c = c2 - c1 + 1;
458
38cb88095913 [project @ 1994-06-06 00:41:10 by jwe]
jwe
parents:
diff changeset
556
38cb88095913 [project @ 1994-06-06 00:41:10 by jwe]
jwe
parents:
diff changeset
557 Matrix result (new_r, new_c);
38cb88095913 [project @ 1994-06-06 00:41:10 by jwe]
jwe
parents:
diff changeset
558
5275
23b37da9fd5b [project @ 2005-04-08 16:07:35 by jwe]
jwe
parents: 5105
diff changeset
559 for (octave_idx_type j = 0; j < new_c; j++)
23b37da9fd5b [project @ 2005-04-08 16:07:35 by jwe]
jwe
parents: 5105
diff changeset
560 for (octave_idx_type i = 0; i < new_r; i++)
4316
236c10efcde2 [project @ 2003-02-10 21:57:15 by jwe]
jwe
parents: 4309
diff changeset
561 result.xelem (i, j) = elem (r1+i, c1+j);
236c10efcde2 [project @ 2003-02-10 21:57:15 by jwe]
jwe
parents: 4309
diff changeset
562
236c10efcde2 [project @ 2003-02-10 21:57:15 by jwe]
jwe
parents: 4309
diff changeset
563 return result;
236c10efcde2 [project @ 2003-02-10 21:57:15 by jwe]
jwe
parents: 4309
diff changeset
564 }
236c10efcde2 [project @ 2003-02-10 21:57:15 by jwe]
jwe
parents: 4309
diff changeset
565
236c10efcde2 [project @ 2003-02-10 21:57:15 by jwe]
jwe
parents: 4309
diff changeset
566 Matrix
5275
23b37da9fd5b [project @ 2005-04-08 16:07:35 by jwe]
jwe
parents: 5105
diff changeset
567 Matrix::extract_n (octave_idx_type r1, octave_idx_type c1, octave_idx_type nr, octave_idx_type nc) const
4316
236c10efcde2 [project @ 2003-02-10 21:57:15 by jwe]
jwe
parents: 4309
diff changeset
568 {
236c10efcde2 [project @ 2003-02-10 21:57:15 by jwe]
jwe
parents: 4309
diff changeset
569 Matrix result (nr, nc);
236c10efcde2 [project @ 2003-02-10 21:57:15 by jwe]
jwe
parents: 4309
diff changeset
570
5275
23b37da9fd5b [project @ 2005-04-08 16:07:35 by jwe]
jwe
parents: 5105
diff changeset
571 for (octave_idx_type j = 0; j < nc; j++)
23b37da9fd5b [project @ 2005-04-08 16:07:35 by jwe]
jwe
parents: 5105
diff changeset
572 for (octave_idx_type i = 0; i < nr; i++)
4316
236c10efcde2 [project @ 2003-02-10 21:57:15 by jwe]
jwe
parents: 4309
diff changeset
573 result.xelem (i, j) = elem (r1+i, c1+j);
458
38cb88095913 [project @ 1994-06-06 00:41:10 by jwe]
jwe
parents:
diff changeset
574
38cb88095913 [project @ 1994-06-06 00:41:10 by jwe]
jwe
parents:
diff changeset
575 return result;
38cb88095913 [project @ 1994-06-06 00:41:10 by jwe]
jwe
parents:
diff changeset
576 }
38cb88095913 [project @ 1994-06-06 00:41:10 by jwe]
jwe
parents:
diff changeset
577
38cb88095913 [project @ 1994-06-06 00:41:10 by jwe]
jwe
parents:
diff changeset
578 // extract row or column i.
38cb88095913 [project @ 1994-06-06 00:41:10 by jwe]
jwe
parents:
diff changeset
579
38cb88095913 [project @ 1994-06-06 00:41:10 by jwe]
jwe
parents:
diff changeset
580 RowVector
5275
23b37da9fd5b [project @ 2005-04-08 16:07:35 by jwe]
jwe
parents: 5105
diff changeset
581 Matrix::row (octave_idx_type i) const
458
38cb88095913 [project @ 1994-06-06 00:41:10 by jwe]
jwe
parents:
diff changeset
582 {
5275
23b37da9fd5b [project @ 2005-04-08 16:07:35 by jwe]
jwe
parents: 5105
diff changeset
583 octave_idx_type nc = cols ();
458
38cb88095913 [project @ 1994-06-06 00:41:10 by jwe]
jwe
parents:
diff changeset
584 if (i < 0 || i >= rows ())
38cb88095913 [project @ 1994-06-06 00:41:10 by jwe]
jwe
parents:
diff changeset
585 {
38cb88095913 [project @ 1994-06-06 00:41:10 by jwe]
jwe
parents:
diff changeset
586 (*current_liboctave_error_handler) ("invalid row selection");
38cb88095913 [project @ 1994-06-06 00:41:10 by jwe]
jwe
parents:
diff changeset
587 return RowVector ();
38cb88095913 [project @ 1994-06-06 00:41:10 by jwe]
jwe
parents:
diff changeset
588 }
38cb88095913 [project @ 1994-06-06 00:41:10 by jwe]
jwe
parents:
diff changeset
589
38cb88095913 [project @ 1994-06-06 00:41:10 by jwe]
jwe
parents:
diff changeset
590 RowVector retval (nc);
5275
23b37da9fd5b [project @ 2005-04-08 16:07:35 by jwe]
jwe
parents: 5105
diff changeset
591 for (octave_idx_type j = 0; j < nc; j++)
4316
236c10efcde2 [project @ 2003-02-10 21:57:15 by jwe]
jwe
parents: 4309
diff changeset
592 retval.xelem (j) = elem (i, j);
458
38cb88095913 [project @ 1994-06-06 00:41:10 by jwe]
jwe
parents:
diff changeset
593
38cb88095913 [project @ 1994-06-06 00:41:10 by jwe]
jwe
parents:
diff changeset
594 return retval;
38cb88095913 [project @ 1994-06-06 00:41:10 by jwe]
jwe
parents:
diff changeset
595 }
38cb88095913 [project @ 1994-06-06 00:41:10 by jwe]
jwe
parents:
diff changeset
596
38cb88095913 [project @ 1994-06-06 00:41:10 by jwe]
jwe
parents:
diff changeset
597 ColumnVector
5275
23b37da9fd5b [project @ 2005-04-08 16:07:35 by jwe]
jwe
parents: 5105
diff changeset
598 Matrix::column (octave_idx_type i) const
458
38cb88095913 [project @ 1994-06-06 00:41:10 by jwe]
jwe
parents:
diff changeset
599 {
5275
23b37da9fd5b [project @ 2005-04-08 16:07:35 by jwe]
jwe
parents: 5105
diff changeset
600 octave_idx_type nr = rows ();
458
38cb88095913 [project @ 1994-06-06 00:41:10 by jwe]
jwe
parents:
diff changeset
601 if (i < 0 || i >= cols ())
38cb88095913 [project @ 1994-06-06 00:41:10 by jwe]
jwe
parents:
diff changeset
602 {
38cb88095913 [project @ 1994-06-06 00:41:10 by jwe]
jwe
parents:
diff changeset
603 (*current_liboctave_error_handler) ("invalid column selection");
38cb88095913 [project @ 1994-06-06 00:41:10 by jwe]
jwe
parents:
diff changeset
604 return ColumnVector ();
38cb88095913 [project @ 1994-06-06 00:41:10 by jwe]
jwe
parents:
diff changeset
605 }
38cb88095913 [project @ 1994-06-06 00:41:10 by jwe]
jwe
parents:
diff changeset
606
38cb88095913 [project @ 1994-06-06 00:41:10 by jwe]
jwe
parents:
diff changeset
607 ColumnVector retval (nr);
5275
23b37da9fd5b [project @ 2005-04-08 16:07:35 by jwe]
jwe
parents: 5105
diff changeset
608 for (octave_idx_type j = 0; j < nr; j++)
4316
236c10efcde2 [project @ 2003-02-10 21:57:15 by jwe]
jwe
parents: 4309
diff changeset
609 retval.xelem (j) = elem (j, i);
458
38cb88095913 [project @ 1994-06-06 00:41:10 by jwe]
jwe
parents:
diff changeset
610
38cb88095913 [project @ 1994-06-06 00:41:10 by jwe]
jwe
parents:
diff changeset
611 return retval;
38cb88095913 [project @ 1994-06-06 00:41:10 by jwe]
jwe
parents:
diff changeset
612 }
38cb88095913 [project @ 1994-06-06 00:41:10 by jwe]
jwe
parents:
diff changeset
613
38cb88095913 [project @ 1994-06-06 00:41:10 by jwe]
jwe
parents:
diff changeset
614 Matrix
38cb88095913 [project @ 1994-06-06 00:41:10 by jwe]
jwe
parents:
diff changeset
615 Matrix::inverse (void) const
38cb88095913 [project @ 1994-06-06 00:41:10 by jwe]
jwe
parents:
diff changeset
616 {
5275
23b37da9fd5b [project @ 2005-04-08 16:07:35 by jwe]
jwe
parents: 5105
diff changeset
617 octave_idx_type info;
458
38cb88095913 [project @ 1994-06-06 00:41:10 by jwe]
jwe
parents:
diff changeset
618 double rcond;
4329
d53c33d93440 [project @ 2003-02-18 20:00:48 by jwe]
jwe
parents: 4316
diff changeset
619 return inverse (info, rcond, 0, 0);
458
38cb88095913 [project @ 1994-06-06 00:41:10 by jwe]
jwe
parents:
diff changeset
620 }
38cb88095913 [project @ 1994-06-06 00:41:10 by jwe]
jwe
parents:
diff changeset
621
38cb88095913 [project @ 1994-06-06 00:41:10 by jwe]
jwe
parents:
diff changeset
622 Matrix
5275
23b37da9fd5b [project @ 2005-04-08 16:07:35 by jwe]
jwe
parents: 5105
diff changeset
623 Matrix::inverse (octave_idx_type& info) const
458
38cb88095913 [project @ 1994-06-06 00:41:10 by jwe]
jwe
parents:
diff changeset
624 {
38cb88095913 [project @ 1994-06-06 00:41:10 by jwe]
jwe
parents:
diff changeset
625 double rcond;
4329
d53c33d93440 [project @ 2003-02-18 20:00:48 by jwe]
jwe
parents: 4316
diff changeset
626 return inverse (info, rcond, 0, 0);
458
38cb88095913 [project @ 1994-06-06 00:41:10 by jwe]
jwe
parents:
diff changeset
627 }
38cb88095913 [project @ 1994-06-06 00:41:10 by jwe]
jwe
parents:
diff changeset
628
38cb88095913 [project @ 1994-06-06 00:41:10 by jwe]
jwe
parents:
diff changeset
629 Matrix
5275
23b37da9fd5b [project @ 2005-04-08 16:07:35 by jwe]
jwe
parents: 5105
diff changeset
630 Matrix::inverse (octave_idx_type& info, double& rcond, int force, int calc_cond) const
458
38cb88095913 [project @ 1994-06-06 00:41:10 by jwe]
jwe
parents:
diff changeset
631 {
1948
d7dec93d4b87 [project @ 1996-02-14 03:45:49 by jwe]
jwe
parents: 1882
diff changeset
632 Matrix retval;
d7dec93d4b87 [project @ 1996-02-14 03:45:49 by jwe]
jwe
parents: 1882
diff changeset
633
5275
23b37da9fd5b [project @ 2005-04-08 16:07:35 by jwe]
jwe
parents: 5105
diff changeset
634 octave_idx_type nr = rows ();
23b37da9fd5b [project @ 2005-04-08 16:07:35 by jwe]
jwe
parents: 5105
diff changeset
635 octave_idx_type nc = cols ();
1948
d7dec93d4b87 [project @ 1996-02-14 03:45:49 by jwe]
jwe
parents: 1882
diff changeset
636
458
38cb88095913 [project @ 1994-06-06 00:41:10 by jwe]
jwe
parents:
diff changeset
637 if (nr != nc || nr == 0 || nc == 0)
1948
d7dec93d4b87 [project @ 1996-02-14 03:45:49 by jwe]
jwe
parents: 1882
diff changeset
638 (*current_liboctave_error_handler) ("inverse requires square matrix");
458
38cb88095913 [project @ 1994-06-06 00:41:10 by jwe]
jwe
parents:
diff changeset
639 else
38cb88095913 [project @ 1994-06-06 00:41:10 by jwe]
jwe
parents:
diff changeset
640 {
5275
23b37da9fd5b [project @ 2005-04-08 16:07:35 by jwe]
jwe
parents: 5105
diff changeset
641 Array<octave_idx_type> ipvt (nr);
23b37da9fd5b [project @ 2005-04-08 16:07:35 by jwe]
jwe
parents: 5105
diff changeset
642 octave_idx_type *pipvt = ipvt.fortran_vec ();
1948
d7dec93d4b87 [project @ 1996-02-14 03:45:49 by jwe]
jwe
parents: 1882
diff changeset
643
d7dec93d4b87 [project @ 1996-02-14 03:45:49 by jwe]
jwe
parents: 1882
diff changeset
644 retval = *this;
d7dec93d4b87 [project @ 1996-02-14 03:45:49 by jwe]
jwe
parents: 1882
diff changeset
645 double *tmp_data = retval.fortran_vec ();
d7dec93d4b87 [project @ 1996-02-14 03:45:49 by jwe]
jwe
parents: 1882
diff changeset
646
4329
d53c33d93440 [project @ 2003-02-18 20:00:48 by jwe]
jwe
parents: 4316
diff changeset
647 Array<double> z(1);
5275
23b37da9fd5b [project @ 2005-04-08 16:07:35 by jwe]
jwe
parents: 5105
diff changeset
648 octave_idx_type lwork = -1;
4329
d53c33d93440 [project @ 2003-02-18 20:00:48 by jwe]
jwe
parents: 4316
diff changeset
649
4330
9f86c2055b58 [project @ 2003-02-18 22:31:55 by jwe]
jwe
parents: 4329
diff changeset
650 // Query the optimum work array size.
4329
d53c33d93440 [project @ 2003-02-18 20:00:48 by jwe]
jwe
parents: 4316
diff changeset
651 F77_XFCN (dgetri, DGETRI, (nc, tmp_data, nr, pipvt,
d53c33d93440 [project @ 2003-02-18 20:00:48 by jwe]
jwe
parents: 4316
diff changeset
652 z.fortran_vec (), lwork, info));
d53c33d93440 [project @ 2003-02-18 20:00:48 by jwe]
jwe
parents: 4316
diff changeset
653
d53c33d93440 [project @ 2003-02-18 20:00:48 by jwe]
jwe
parents: 4316
diff changeset
654 if (f77_exception_encountered)
d53c33d93440 [project @ 2003-02-18 20:00:48 by jwe]
jwe
parents: 4316
diff changeset
655 {
d53c33d93440 [project @ 2003-02-18 20:00:48 by jwe]
jwe
parents: 4316
diff changeset
656 (*current_liboctave_error_handler)
d53c33d93440 [project @ 2003-02-18 20:00:48 by jwe]
jwe
parents: 4316
diff changeset
657 ("unrecoverable error in dgetri");
d53c33d93440 [project @ 2003-02-18 20:00:48 by jwe]
jwe
parents: 4316
diff changeset
658 return retval;
d53c33d93440 [project @ 2003-02-18 20:00:48 by jwe]
jwe
parents: 4316
diff changeset
659 }
d53c33d93440 [project @ 2003-02-18 20:00:48 by jwe]
jwe
parents: 4316
diff changeset
660
5275
23b37da9fd5b [project @ 2005-04-08 16:07:35 by jwe]
jwe
parents: 5105
diff changeset
661 lwork = static_cast<octave_idx_type> (z(0));
4329
d53c33d93440 [project @ 2003-02-18 20:00:48 by jwe]
jwe
parents: 4316
diff changeset
662 lwork = (lwork < 2 *nc ? 2*nc : lwork);
d53c33d93440 [project @ 2003-02-18 20:00:48 by jwe]
jwe
parents: 4316
diff changeset
663 z.resize (lwork);
d53c33d93440 [project @ 2003-02-18 20:00:48 by jwe]
jwe
parents: 4316
diff changeset
664 double *pz = z.fortran_vec ();
d53c33d93440 [project @ 2003-02-18 20:00:48 by jwe]
jwe
parents: 4316
diff changeset
665
d53c33d93440 [project @ 2003-02-18 20:00:48 by jwe]
jwe
parents: 4316
diff changeset
666 info = 0;
d53c33d93440 [project @ 2003-02-18 20:00:48 by jwe]
jwe
parents: 4316
diff changeset
667
4330
9f86c2055b58 [project @ 2003-02-18 22:31:55 by jwe]
jwe
parents: 4329
diff changeset
668 // Calculate the norm of the matrix, for later use.
4329
d53c33d93440 [project @ 2003-02-18 20:00:48 by jwe]
jwe
parents: 4316
diff changeset
669 double anorm = 0;
d53c33d93440 [project @ 2003-02-18 20:00:48 by jwe]
jwe
parents: 4316
diff changeset
670 if (calc_cond)
5275
23b37da9fd5b [project @ 2005-04-08 16:07:35 by jwe]
jwe
parents: 5105
diff changeset
671 anorm = retval.abs().sum().row(static_cast<octave_idx_type>(0)).max();
4329
d53c33d93440 [project @ 2003-02-18 20:00:48 by jwe]
jwe
parents: 4316
diff changeset
672
d53c33d93440 [project @ 2003-02-18 20:00:48 by jwe]
jwe
parents: 4316
diff changeset
673 F77_XFCN (dgetrf, DGETRF, (nc, nc, tmp_data, nr, pipvt, info));
1948
d7dec93d4b87 [project @ 1996-02-14 03:45:49 by jwe]
jwe
parents: 1882
diff changeset
674
d7dec93d4b87 [project @ 1996-02-14 03:45:49 by jwe]
jwe
parents: 1882
diff changeset
675 if (f77_exception_encountered)
4329
d53c33d93440 [project @ 2003-02-18 20:00:48 by jwe]
jwe
parents: 4316
diff changeset
676 (*current_liboctave_error_handler) ("unrecoverable error in dgetrf");
1948
d7dec93d4b87 [project @ 1996-02-14 03:45:49 by jwe]
jwe
parents: 1882
diff changeset
677 else
d7dec93d4b87 [project @ 1996-02-14 03:45:49 by jwe]
jwe
parents: 1882
diff changeset
678 {
4330
9f86c2055b58 [project @ 2003-02-18 22:31:55 by jwe]
jwe
parents: 4329
diff changeset
679 // Throw-away extra info LAPACK gives so as to not change output.
4509
9ec494b3eb5f [project @ 2003-09-11 19:08:25 by jwe]
jwe
parents: 4469
diff changeset
680 rcond = 0.0;
9ec494b3eb5f [project @ 2003-09-11 19:08:25 by jwe]
jwe
parents: 4469
diff changeset
681 if (info != 0)
1948
d7dec93d4b87 [project @ 1996-02-14 03:45:49 by jwe]
jwe
parents: 1882
diff changeset
682 info = -1;
4329
d53c33d93440 [project @ 2003-02-18 20:00:48 by jwe]
jwe
parents: 4316
diff changeset
683 else if (calc_cond)
d53c33d93440 [project @ 2003-02-18 20:00:48 by jwe]
jwe
parents: 4316
diff changeset
684 {
5275
23b37da9fd5b [project @ 2005-04-08 16:07:35 by jwe]
jwe
parents: 5105
diff changeset
685 octave_idx_type dgecon_info = 0;
5061
4689ee5e88ec [project @ 2004-11-03 21:23:42 by jwe]
jwe
parents: 4944
diff changeset
686
4330
9f86c2055b58 [project @ 2003-02-18 22:31:55 by jwe]
jwe
parents: 4329
diff changeset
687 // Now calculate the condition number for non-singular matrix.
4329
d53c33d93440 [project @ 2003-02-18 20:00:48 by jwe]
jwe
parents: 4316
diff changeset
688 char job = '1';
5275
23b37da9fd5b [project @ 2005-04-08 16:07:35 by jwe]
jwe
parents: 5105
diff changeset
689 Array<octave_idx_type> iz (nc);
23b37da9fd5b [project @ 2005-04-08 16:07:35 by jwe]
jwe
parents: 5105
diff changeset
690 octave_idx_type *piz = iz.fortran_vec ();
4552
6f3382e08a52 [project @ 2003-10-27 20:38:02 by jwe]
jwe
parents: 4513
diff changeset
691 F77_XFCN (dgecon, DGECON, (F77_CONST_CHAR_ARG2 (&job, 1),
6f3382e08a52 [project @ 2003-10-27 20:38:02 by jwe]
jwe
parents: 4513
diff changeset
692 nc, tmp_data, nr, anorm,
5061
4689ee5e88ec [project @ 2004-11-03 21:23:42 by jwe]
jwe
parents: 4944
diff changeset
693 rcond, pz, piz, dgecon_info
4552
6f3382e08a52 [project @ 2003-10-27 20:38:02 by jwe]
jwe
parents: 4513
diff changeset
694 F77_CHAR_ARG_LEN (1)));
4329
d53c33d93440 [project @ 2003-02-18 20:00:48 by jwe]
jwe
parents: 4316
diff changeset
695
d53c33d93440 [project @ 2003-02-18 20:00:48 by jwe]
jwe
parents: 4316
diff changeset
696 if (f77_exception_encountered)
d53c33d93440 [project @ 2003-02-18 20:00:48 by jwe]
jwe
parents: 4316
diff changeset
697 (*current_liboctave_error_handler)
d53c33d93440 [project @ 2003-02-18 20:00:48 by jwe]
jwe
parents: 4316
diff changeset
698 ("unrecoverable error in dgecon");
d53c33d93440 [project @ 2003-02-18 20:00:48 by jwe]
jwe
parents: 4316
diff changeset
699
5061
4689ee5e88ec [project @ 2004-11-03 21:23:42 by jwe]
jwe
parents: 4944
diff changeset
700 if (dgecon_info != 0)
4329
d53c33d93440 [project @ 2003-02-18 20:00:48 by jwe]
jwe
parents: 4316
diff changeset
701 info = -1;
d53c33d93440 [project @ 2003-02-18 20:00:48 by jwe]
jwe
parents: 4316
diff changeset
702 }
1948
d7dec93d4b87 [project @ 1996-02-14 03:45:49 by jwe]
jwe
parents: 1882
diff changeset
703
d7dec93d4b87 [project @ 1996-02-14 03:45:49 by jwe]
jwe
parents: 1882
diff changeset
704 if (info == -1 && ! force)
d7dec93d4b87 [project @ 1996-02-14 03:45:49 by jwe]
jwe
parents: 1882
diff changeset
705 retval = *this; // Restore matrix contents.
d7dec93d4b87 [project @ 1996-02-14 03:45:49 by jwe]
jwe
parents: 1882
diff changeset
706 else
d7dec93d4b87 [project @ 1996-02-14 03:45:49 by jwe]
jwe
parents: 1882
diff changeset
707 {
5275
23b37da9fd5b [project @ 2005-04-08 16:07:35 by jwe]
jwe
parents: 5105
diff changeset
708 octave_idx_type dgetri_info = 0;
5061
4689ee5e88ec [project @ 2004-11-03 21:23:42 by jwe]
jwe
parents: 4944
diff changeset
709
4329
d53c33d93440 [project @ 2003-02-18 20:00:48 by jwe]
jwe
parents: 4316
diff changeset
710 F77_XFCN (dgetri, DGETRI, (nc, tmp_data, nr, pipvt,
5061
4689ee5e88ec [project @ 2004-11-03 21:23:42 by jwe]
jwe
parents: 4944
diff changeset
711 pz, lwork, dgetri_info));
1948
d7dec93d4b87 [project @ 1996-02-14 03:45:49 by jwe]
jwe
parents: 1882
diff changeset
712
d7dec93d4b87 [project @ 1996-02-14 03:45:49 by jwe]
jwe
parents: 1882
diff changeset
713 if (f77_exception_encountered)
d7dec93d4b87 [project @ 1996-02-14 03:45:49 by jwe]
jwe
parents: 1882
diff changeset
714 (*current_liboctave_error_handler)
4329
d53c33d93440 [project @ 2003-02-18 20:00:48 by jwe]
jwe
parents: 4316
diff changeset
715 ("unrecoverable error in dgetri");
d53c33d93440 [project @ 2003-02-18 20:00:48 by jwe]
jwe
parents: 4316
diff changeset
716
5061
4689ee5e88ec [project @ 2004-11-03 21:23:42 by jwe]
jwe
parents: 4944
diff changeset
717 if (dgetri_info != 0)
4329
d53c33d93440 [project @ 2003-02-18 20:00:48 by jwe]
jwe
parents: 4316
diff changeset
718 info = -1;
1948
d7dec93d4b87 [project @ 1996-02-14 03:45:49 by jwe]
jwe
parents: 1882
diff changeset
719 }
d7dec93d4b87 [project @ 1996-02-14 03:45:49 by jwe]
jwe
parents: 1882
diff changeset
720 }
458
38cb88095913 [project @ 1994-06-06 00:41:10 by jwe]
jwe
parents:
diff changeset
721 }
38cb88095913 [project @ 1994-06-06 00:41:10 by jwe]
jwe
parents:
diff changeset
722
1948
d7dec93d4b87 [project @ 1996-02-14 03:45:49 by jwe]
jwe
parents: 1882
diff changeset
723 return retval;
458
38cb88095913 [project @ 1994-06-06 00:41:10 by jwe]
jwe
parents:
diff changeset
724 }
38cb88095913 [project @ 1994-06-06 00:41:10 by jwe]
jwe
parents:
diff changeset
725
740
d8295febb0df [project @ 1994-09-30 14:42:37 by jwe]
jwe
parents: 677
diff changeset
726 Matrix
4384
f1fcc371e5ef [project @ 2003-04-23 19:51:57 by jwe]
jwe
parents: 4330
diff changeset
727 Matrix::pseudo_inverse (double tol) const
740
d8295febb0df [project @ 1994-09-30 14:42:37 by jwe]
jwe
parents: 677
diff changeset
728 {
3480
45742a3b1f7c [project @ 2000-01-26 06:16:41 by jwe]
jwe
parents: 3469
diff changeset
729 SVD result (*this, SVD::economy);
740
d8295febb0df [project @ 1994-09-30 14:42:37 by jwe]
jwe
parents: 677
diff changeset
730
d8295febb0df [project @ 1994-09-30 14:42:37 by jwe]
jwe
parents: 677
diff changeset
731 DiagMatrix S = result.singular_values ();
d8295febb0df [project @ 1994-09-30 14:42:37 by jwe]
jwe
parents: 677
diff changeset
732 Matrix U = result.left_singular_matrix ();
d8295febb0df [project @ 1994-09-30 14:42:37 by jwe]
jwe
parents: 677
diff changeset
733 Matrix V = result.right_singular_matrix ();
d8295febb0df [project @ 1994-09-30 14:42:37 by jwe]
jwe
parents: 677
diff changeset
734
d8295febb0df [project @ 1994-09-30 14:42:37 by jwe]
jwe
parents: 677
diff changeset
735 ColumnVector sigma = S.diag ();
d8295febb0df [project @ 1994-09-30 14:42:37 by jwe]
jwe
parents: 677
diff changeset
736
5275
23b37da9fd5b [project @ 2005-04-08 16:07:35 by jwe]
jwe
parents: 5105
diff changeset
737 octave_idx_type r = sigma.length () - 1;
23b37da9fd5b [project @ 2005-04-08 16:07:35 by jwe]
jwe
parents: 5105
diff changeset
738 octave_idx_type nr = rows ();
23b37da9fd5b [project @ 2005-04-08 16:07:35 by jwe]
jwe
parents: 5105
diff changeset
739 octave_idx_type nc = cols ();
740
d8295febb0df [project @ 1994-09-30 14:42:37 by jwe]
jwe
parents: 677
diff changeset
740
d8295febb0df [project @ 1994-09-30 14:42:37 by jwe]
jwe
parents: 677
diff changeset
741 if (tol <= 0.0)
d8295febb0df [project @ 1994-09-30 14:42:37 by jwe]
jwe
parents: 677
diff changeset
742 {
d8295febb0df [project @ 1994-09-30 14:42:37 by jwe]
jwe
parents: 677
diff changeset
743 if (nr > nc)
d8295febb0df [project @ 1994-09-30 14:42:37 by jwe]
jwe
parents: 677
diff changeset
744 tol = nr * sigma.elem (0) * DBL_EPSILON;
d8295febb0df [project @ 1994-09-30 14:42:37 by jwe]
jwe
parents: 677
diff changeset
745 else
d8295febb0df [project @ 1994-09-30 14:42:37 by jwe]
jwe
parents: 677
diff changeset
746 tol = nc * sigma.elem (0) * DBL_EPSILON;
d8295febb0df [project @ 1994-09-30 14:42:37 by jwe]
jwe
parents: 677
diff changeset
747 }
d8295febb0df [project @ 1994-09-30 14:42:37 by jwe]
jwe
parents: 677
diff changeset
748
d8295febb0df [project @ 1994-09-30 14:42:37 by jwe]
jwe
parents: 677
diff changeset
749 while (r >= 0 && sigma.elem (r) < tol)
d8295febb0df [project @ 1994-09-30 14:42:37 by jwe]
jwe
parents: 677
diff changeset
750 r--;
d8295febb0df [project @ 1994-09-30 14:42:37 by jwe]
jwe
parents: 677
diff changeset
751
d8295febb0df [project @ 1994-09-30 14:42:37 by jwe]
jwe
parents: 677
diff changeset
752 if (r < 0)
d8295febb0df [project @ 1994-09-30 14:42:37 by jwe]
jwe
parents: 677
diff changeset
753 return Matrix (nc, nr, 0.0);
d8295febb0df [project @ 1994-09-30 14:42:37 by jwe]
jwe
parents: 677
diff changeset
754 else
d8295febb0df [project @ 1994-09-30 14:42:37 by jwe]
jwe
parents: 677
diff changeset
755 {
d8295febb0df [project @ 1994-09-30 14:42:37 by jwe]
jwe
parents: 677
diff changeset
756 Matrix Ur = U.extract (0, 0, nr-1, r);
d8295febb0df [project @ 1994-09-30 14:42:37 by jwe]
jwe
parents: 677
diff changeset
757 DiagMatrix D = DiagMatrix (sigma.extract (0, r)) . inverse ();
d8295febb0df [project @ 1994-09-30 14:42:37 by jwe]
jwe
parents: 677
diff changeset
758 Matrix Vr = V.extract (0, 0, nc-1, r);
d8295febb0df [project @ 1994-09-30 14:42:37 by jwe]
jwe
parents: 677
diff changeset
759 return Vr * D * Ur.transpose ();
d8295febb0df [project @ 1994-09-30 14:42:37 by jwe]
jwe
parents: 677
diff changeset
760 }
d8295febb0df [project @ 1994-09-30 14:42:37 by jwe]
jwe
parents: 677
diff changeset
761 }
d8295febb0df [project @ 1994-09-30 14:42:37 by jwe]
jwe
parents: 677
diff changeset
762
4773
ccfbd6047a54 [project @ 2004-02-16 19:02:32 by jwe]
jwe
parents: 4669
diff changeset
763 #if defined (HAVE_FFTW3)
3827
ba548facf43b [project @ 2001-05-02 06:15:06 by jwe]
jwe
parents: 3769
diff changeset
764
ba548facf43b [project @ 2001-05-02 06:15:06 by jwe]
jwe
parents: 3769
diff changeset
765 ComplexMatrix
ba548facf43b [project @ 2001-05-02 06:15:06 by jwe]
jwe
parents: 3769
diff changeset
766 Matrix::fourier (void) const
ba548facf43b [project @ 2001-05-02 06:15:06 by jwe]
jwe
parents: 3769
diff changeset
767 {
ba548facf43b [project @ 2001-05-02 06:15:06 by jwe]
jwe
parents: 3769
diff changeset
768 size_t nr = rows ();
ba548facf43b [project @ 2001-05-02 06:15:06 by jwe]
jwe
parents: 3769
diff changeset
769 size_t nc = cols ();
ba548facf43b [project @ 2001-05-02 06:15:06 by jwe]
jwe
parents: 3769
diff changeset
770
ba548facf43b [project @ 2001-05-02 06:15:06 by jwe]
jwe
parents: 3769
diff changeset
771 ComplexMatrix retval (nr, nc);
ba548facf43b [project @ 2001-05-02 06:15:06 by jwe]
jwe
parents: 3769
diff changeset
772
ba548facf43b [project @ 2001-05-02 06:15:06 by jwe]
jwe
parents: 3769
diff changeset
773 size_t npts, nsamples;
ba548facf43b [project @ 2001-05-02 06:15:06 by jwe]
jwe
parents: 3769
diff changeset
774
ba548facf43b [project @ 2001-05-02 06:15:06 by jwe]
jwe
parents: 3769
diff changeset
775 if (nr == 1 || nc == 1)
ba548facf43b [project @ 2001-05-02 06:15:06 by jwe]
jwe
parents: 3769
diff changeset
776 {
ba548facf43b [project @ 2001-05-02 06:15:06 by jwe]
jwe
parents: 3769
diff changeset
777 npts = nr > nc ? nr : nc;
ba548facf43b [project @ 2001-05-02 06:15:06 by jwe]
jwe
parents: 3769
diff changeset
778 nsamples = 1;
ba548facf43b [project @ 2001-05-02 06:15:06 by jwe]
jwe
parents: 3769
diff changeset
779 }
ba548facf43b [project @ 2001-05-02 06:15:06 by jwe]
jwe
parents: 3769
diff changeset
780 else
ba548facf43b [project @ 2001-05-02 06:15:06 by jwe]
jwe
parents: 3769
diff changeset
781 {
ba548facf43b [project @ 2001-05-02 06:15:06 by jwe]
jwe
parents: 3769
diff changeset
782 npts = nr;
ba548facf43b [project @ 2001-05-02 06:15:06 by jwe]
jwe
parents: 3769
diff changeset
783 nsamples = nc;
ba548facf43b [project @ 2001-05-02 06:15:06 by jwe]
jwe
parents: 3769
diff changeset
784 }
ba548facf43b [project @ 2001-05-02 06:15:06 by jwe]
jwe
parents: 3769
diff changeset
785
4773
ccfbd6047a54 [project @ 2004-02-16 19:02:32 by jwe]
jwe
parents: 4669
diff changeset
786 const double *in (fortran_vec ());
3827
ba548facf43b [project @ 2001-05-02 06:15:06 by jwe]
jwe
parents: 3769
diff changeset
787 Complex *out (retval.fortran_vec ());
ba548facf43b [project @ 2001-05-02 06:15:06 by jwe]
jwe
parents: 3769
diff changeset
788
4773
ccfbd6047a54 [project @ 2004-02-16 19:02:32 by jwe]
jwe
parents: 4669
diff changeset
789 octave_fftw::fft (in, out, npts, nsamples);
3827
ba548facf43b [project @ 2001-05-02 06:15:06 by jwe]
jwe
parents: 3769
diff changeset
790
ba548facf43b [project @ 2001-05-02 06:15:06 by jwe]
jwe
parents: 3769
diff changeset
791 return retval;
ba548facf43b [project @ 2001-05-02 06:15:06 by jwe]
jwe
parents: 3769
diff changeset
792 }
ba548facf43b [project @ 2001-05-02 06:15:06 by jwe]
jwe
parents: 3769
diff changeset
793
ba548facf43b [project @ 2001-05-02 06:15:06 by jwe]
jwe
parents: 3769
diff changeset
794 ComplexMatrix
ba548facf43b [project @ 2001-05-02 06:15:06 by jwe]
jwe
parents: 3769
diff changeset
795 Matrix::ifourier (void) const
ba548facf43b [project @ 2001-05-02 06:15:06 by jwe]
jwe
parents: 3769
diff changeset
796 {
ba548facf43b [project @ 2001-05-02 06:15:06 by jwe]
jwe
parents: 3769
diff changeset
797 size_t nr = rows ();
ba548facf43b [project @ 2001-05-02 06:15:06 by jwe]
jwe
parents: 3769
diff changeset
798 size_t nc = cols ();
ba548facf43b [project @ 2001-05-02 06:15:06 by jwe]
jwe
parents: 3769
diff changeset
799
ba548facf43b [project @ 2001-05-02 06:15:06 by jwe]
jwe
parents: 3769
diff changeset
800 ComplexMatrix retval (nr, nc);
ba548facf43b [project @ 2001-05-02 06:15:06 by jwe]
jwe
parents: 3769
diff changeset
801
ba548facf43b [project @ 2001-05-02 06:15:06 by jwe]
jwe
parents: 3769
diff changeset
802 size_t npts, nsamples;
ba548facf43b [project @ 2001-05-02 06:15:06 by jwe]
jwe
parents: 3769
diff changeset
803
ba548facf43b [project @ 2001-05-02 06:15:06 by jwe]
jwe
parents: 3769
diff changeset
804 if (nr == 1 || nc == 1)
ba548facf43b [project @ 2001-05-02 06:15:06 by jwe]
jwe
parents: 3769
diff changeset
805 {
ba548facf43b [project @ 2001-05-02 06:15:06 by jwe]
jwe
parents: 3769
diff changeset
806 npts = nr > nc ? nr : nc;
ba548facf43b [project @ 2001-05-02 06:15:06 by jwe]
jwe
parents: 3769
diff changeset
807 nsamples = 1;
ba548facf43b [project @ 2001-05-02 06:15:06 by jwe]
jwe
parents: 3769
diff changeset
808 }
ba548facf43b [project @ 2001-05-02 06:15:06 by jwe]
jwe
parents: 3769
diff changeset
809 else
ba548facf43b [project @ 2001-05-02 06:15:06 by jwe]
jwe
parents: 3769
diff changeset
810 {
ba548facf43b [project @ 2001-05-02 06:15:06 by jwe]
jwe
parents: 3769
diff changeset
811 npts = nr;
ba548facf43b [project @ 2001-05-02 06:15:06 by jwe]
jwe
parents: 3769
diff changeset
812 nsamples = nc;
ba548facf43b [project @ 2001-05-02 06:15:06 by jwe]
jwe
parents: 3769
diff changeset
813 }
ba548facf43b [project @ 2001-05-02 06:15:06 by jwe]
jwe
parents: 3769
diff changeset
814
ba548facf43b [project @ 2001-05-02 06:15:06 by jwe]
jwe
parents: 3769
diff changeset
815 ComplexMatrix tmp (*this);
ba548facf43b [project @ 2001-05-02 06:15:06 by jwe]
jwe
parents: 3769
diff changeset
816 Complex *in (tmp.fortran_vec ());
ba548facf43b [project @ 2001-05-02 06:15:06 by jwe]
jwe
parents: 3769
diff changeset
817 Complex *out (retval.fortran_vec ());
ba548facf43b [project @ 2001-05-02 06:15:06 by jwe]
jwe
parents: 3769
diff changeset
818
4773
ccfbd6047a54 [project @ 2004-02-16 19:02:32 by jwe]
jwe
parents: 4669
diff changeset
819 octave_fftw::ifft (in, out, npts, nsamples);
3827
ba548facf43b [project @ 2001-05-02 06:15:06 by jwe]
jwe
parents: 3769
diff changeset
820
ba548facf43b [project @ 2001-05-02 06:15:06 by jwe]
jwe
parents: 3769
diff changeset
821 return retval;
ba548facf43b [project @ 2001-05-02 06:15:06 by jwe]
jwe
parents: 3769
diff changeset
822 }
ba548facf43b [project @ 2001-05-02 06:15:06 by jwe]
jwe
parents: 3769
diff changeset
823
ba548facf43b [project @ 2001-05-02 06:15:06 by jwe]
jwe
parents: 3769
diff changeset
824 ComplexMatrix
ba548facf43b [project @ 2001-05-02 06:15:06 by jwe]
jwe
parents: 3769
diff changeset
825 Matrix::fourier2d (void) const
ba548facf43b [project @ 2001-05-02 06:15:06 by jwe]
jwe
parents: 3769
diff changeset
826 {
4773
ccfbd6047a54 [project @ 2004-02-16 19:02:32 by jwe]
jwe
parents: 4669
diff changeset
827 dim_vector dv(rows (), cols ());
ccfbd6047a54 [project @ 2004-02-16 19:02:32 by jwe]
jwe
parents: 4669
diff changeset
828
ccfbd6047a54 [project @ 2004-02-16 19:02:32 by jwe]
jwe
parents: 4669
diff changeset
829 const double *in = fortran_vec ();
ccfbd6047a54 [project @ 2004-02-16 19:02:32 by jwe]
jwe
parents: 4669
diff changeset
830 ComplexMatrix retval (rows (), cols ());
ccfbd6047a54 [project @ 2004-02-16 19:02:32 by jwe]
jwe
parents: 4669
diff changeset
831 octave_fftw::fftNd (in, retval.fortran_vec (), 2, dv);
3827
ba548facf43b [project @ 2001-05-02 06:15:06 by jwe]
jwe
parents: 3769
diff changeset
832
ba548facf43b [project @ 2001-05-02 06:15:06 by jwe]
jwe
parents: 3769
diff changeset
833 return retval;
ba548facf43b [project @ 2001-05-02 06:15:06 by jwe]
jwe
parents: 3769
diff changeset
834 }
ba548facf43b [project @ 2001-05-02 06:15:06 by jwe]
jwe
parents: 3769
diff changeset
835
ba548facf43b [project @ 2001-05-02 06:15:06 by jwe]
jwe
parents: 3769
diff changeset
836 ComplexMatrix
ba548facf43b [project @ 2001-05-02 06:15:06 by jwe]
jwe
parents: 3769
diff changeset
837 Matrix::ifourier2d (void) const
ba548facf43b [project @ 2001-05-02 06:15:06 by jwe]
jwe
parents: 3769
diff changeset
838 {
4773
ccfbd6047a54 [project @ 2004-02-16 19:02:32 by jwe]
jwe
parents: 4669
diff changeset
839 dim_vector dv(rows (), cols ());
3827
ba548facf43b [project @ 2001-05-02 06:15:06 by jwe]
jwe
parents: 3769
diff changeset
840
ba548facf43b [project @ 2001-05-02 06:15:06 by jwe]
jwe
parents: 3769
diff changeset
841 ComplexMatrix retval (*this);
4773
ccfbd6047a54 [project @ 2004-02-16 19:02:32 by jwe]
jwe
parents: 4669
diff changeset
842 Complex *out (retval.fortran_vec ());
ccfbd6047a54 [project @ 2004-02-16 19:02:32 by jwe]
jwe
parents: 4669
diff changeset
843
ccfbd6047a54 [project @ 2004-02-16 19:02:32 by jwe]
jwe
parents: 4669
diff changeset
844 octave_fftw::ifftNd (out, out, 2, dv);
3827
ba548facf43b [project @ 2001-05-02 06:15:06 by jwe]
jwe
parents: 3769
diff changeset
845
ba548facf43b [project @ 2001-05-02 06:15:06 by jwe]
jwe
parents: 3769
diff changeset
846 return retval;
ba548facf43b [project @ 2001-05-02 06:15:06 by jwe]
jwe
parents: 3769
diff changeset
847 }
ba548facf43b [project @ 2001-05-02 06:15:06 by jwe]
jwe
parents: 3769
diff changeset
848
ba548facf43b [project @ 2001-05-02 06:15:06 by jwe]
jwe
parents: 3769
diff changeset
849 #else
ba548facf43b [project @ 2001-05-02 06:15:06 by jwe]
jwe
parents: 3769
diff changeset
850
458
38cb88095913 [project @ 1994-06-06 00:41:10 by jwe]
jwe
parents:
diff changeset
851 ComplexMatrix
38cb88095913 [project @ 1994-06-06 00:41:10 by jwe]
jwe
parents:
diff changeset
852 Matrix::fourier (void) const
38cb88095913 [project @ 1994-06-06 00:41:10 by jwe]
jwe
parents:
diff changeset
853 {
1948
d7dec93d4b87 [project @ 1996-02-14 03:45:49 by jwe]
jwe
parents: 1882
diff changeset
854 ComplexMatrix retval;
d7dec93d4b87 [project @ 1996-02-14 03:45:49 by jwe]
jwe
parents: 1882
diff changeset
855
5275
23b37da9fd5b [project @ 2005-04-08 16:07:35 by jwe]
jwe
parents: 5105
diff changeset
856 octave_idx_type nr = rows ();
23b37da9fd5b [project @ 2005-04-08 16:07:35 by jwe]
jwe
parents: 5105
diff changeset
857 octave_idx_type nc = cols ();
23b37da9fd5b [project @ 2005-04-08 16:07:35 by jwe]
jwe
parents: 5105
diff changeset
858
23b37da9fd5b [project @ 2005-04-08 16:07:35 by jwe]
jwe
parents: 5105
diff changeset
859 octave_idx_type npts, nsamples;
1948
d7dec93d4b87 [project @ 1996-02-14 03:45:49 by jwe]
jwe
parents: 1882
diff changeset
860
458
38cb88095913 [project @ 1994-06-06 00:41:10 by jwe]
jwe
parents:
diff changeset
861 if (nr == 1 || nc == 1)
38cb88095913 [project @ 1994-06-06 00:41:10 by jwe]
jwe
parents:
diff changeset
862 {
38cb88095913 [project @ 1994-06-06 00:41:10 by jwe]
jwe
parents:
diff changeset
863 npts = nr > nc ? nr : nc;
38cb88095913 [project @ 1994-06-06 00:41:10 by jwe]
jwe
parents:
diff changeset
864 nsamples = 1;
38cb88095913 [project @ 1994-06-06 00:41:10 by jwe]
jwe
parents:
diff changeset
865 }
38cb88095913 [project @ 1994-06-06 00:41:10 by jwe]
jwe
parents:
diff changeset
866 else
38cb88095913 [project @ 1994-06-06 00:41:10 by jwe]
jwe
parents:
diff changeset
867 {
38cb88095913 [project @ 1994-06-06 00:41:10 by jwe]
jwe
parents:
diff changeset
868 npts = nr;
38cb88095913 [project @ 1994-06-06 00:41:10 by jwe]
jwe
parents:
diff changeset
869 nsamples = nc;
38cb88095913 [project @ 1994-06-06 00:41:10 by jwe]
jwe
parents:
diff changeset
870 }
38cb88095913 [project @ 1994-06-06 00:41:10 by jwe]
jwe
parents:
diff changeset
871
5275
23b37da9fd5b [project @ 2005-04-08 16:07:35 by jwe]
jwe
parents: 5105
diff changeset
872 octave_idx_type nn = 4*npts+15;
1948
d7dec93d4b87 [project @ 1996-02-14 03:45:49 by jwe]
jwe
parents: 1882
diff changeset
873
d7dec93d4b87 [project @ 1996-02-14 03:45:49 by jwe]
jwe
parents: 1882
diff changeset
874 Array<Complex> wsave (nn);
d7dec93d4b87 [project @ 1996-02-14 03:45:49 by jwe]
jwe
parents: 1882
diff changeset
875 Complex *pwsave = wsave.fortran_vec ();
d7dec93d4b87 [project @ 1996-02-14 03:45:49 by jwe]
jwe
parents: 1882
diff changeset
876
3585
d9803711e047 [project @ 2000-02-08 04:35:39 by jwe]
jwe
parents: 3580
diff changeset
877 retval = ComplexMatrix (*this);
1948
d7dec93d4b87 [project @ 1996-02-14 03:45:49 by jwe]
jwe
parents: 1882
diff changeset
878 Complex *tmp_data = retval.fortran_vec ();
d7dec93d4b87 [project @ 1996-02-14 03:45:49 by jwe]
jwe
parents: 1882
diff changeset
879
3887
7da18459c08b [project @ 2002-04-04 00:44:21 by jwe]
jwe
parents: 3864
diff changeset
880 F77_FUNC (cffti, CFFTI) (npts, pwsave);
458
38cb88095913 [project @ 1994-06-06 00:41:10 by jwe]
jwe
parents:
diff changeset
881
5275
23b37da9fd5b [project @ 2005-04-08 16:07:35 by jwe]
jwe
parents: 5105
diff changeset
882 for (octave_idx_type j = 0; j < nsamples; j++)
4153
6b96ce9f5743 [project @ 2002-11-06 20:38:49 by jwe]
jwe
parents: 4130
diff changeset
883 {
6b96ce9f5743 [project @ 2002-11-06 20:38:49 by jwe]
jwe
parents: 4130
diff changeset
884 OCTAVE_QUIT;
6b96ce9f5743 [project @ 2002-11-06 20:38:49 by jwe]
jwe
parents: 4130
diff changeset
885
6b96ce9f5743 [project @ 2002-11-06 20:38:49 by jwe]
jwe
parents: 4130
diff changeset
886 F77_FUNC (cfftf, CFFTF) (npts, &tmp_data[npts*j], pwsave);
6b96ce9f5743 [project @ 2002-11-06 20:38:49 by jwe]
jwe
parents: 4130
diff changeset
887 }
1948
d7dec93d4b87 [project @ 1996-02-14 03:45:49 by jwe]
jwe
parents: 1882
diff changeset
888
d7dec93d4b87 [project @ 1996-02-14 03:45:49 by jwe]
jwe
parents: 1882
diff changeset
889 return retval;
458
38cb88095913 [project @ 1994-06-06 00:41:10 by jwe]
jwe
parents:
diff changeset
890 }
38cb88095913 [project @ 1994-06-06 00:41:10 by jwe]
jwe
parents:
diff changeset
891
38cb88095913 [project @ 1994-06-06 00:41:10 by jwe]
jwe
parents:
diff changeset
892 ComplexMatrix
38cb88095913 [project @ 1994-06-06 00:41:10 by jwe]
jwe
parents:
diff changeset
893 Matrix::ifourier (void) const
38cb88095913 [project @ 1994-06-06 00:41:10 by jwe]
jwe
parents:
diff changeset
894 {
1948
d7dec93d4b87 [project @ 1996-02-14 03:45:49 by jwe]
jwe
parents: 1882
diff changeset
895 ComplexMatrix retval;
d7dec93d4b87 [project @ 1996-02-14 03:45:49 by jwe]
jwe
parents: 1882
diff changeset
896
5275
23b37da9fd5b [project @ 2005-04-08 16:07:35 by jwe]
jwe
parents: 5105
diff changeset
897 octave_idx_type nr = rows ();
23b37da9fd5b [project @ 2005-04-08 16:07:35 by jwe]
jwe
parents: 5105
diff changeset
898 octave_idx_type nc = cols ();
23b37da9fd5b [project @ 2005-04-08 16:07:35 by jwe]
jwe
parents: 5105
diff changeset
899
23b37da9fd5b [project @ 2005-04-08 16:07:35 by jwe]
jwe
parents: 5105
diff changeset
900 octave_idx_type npts, nsamples;
1948
d7dec93d4b87 [project @ 1996-02-14 03:45:49 by jwe]
jwe
parents: 1882
diff changeset
901
458
38cb88095913 [project @ 1994-06-06 00:41:10 by jwe]
jwe
parents:
diff changeset
902 if (nr == 1 || nc == 1)
38cb88095913 [project @ 1994-06-06 00:41:10 by jwe]
jwe
parents:
diff changeset
903 {
38cb88095913 [project @ 1994-06-06 00:41:10 by jwe]
jwe
parents:
diff changeset
904 npts = nr > nc ? nr : nc;
38cb88095913 [project @ 1994-06-06 00:41:10 by jwe]
jwe
parents:
diff changeset
905 nsamples = 1;
38cb88095913 [project @ 1994-06-06 00:41:10 by jwe]
jwe
parents:
diff changeset
906 }
38cb88095913 [project @ 1994-06-06 00:41:10 by jwe]
jwe
parents:
diff changeset
907 else
38cb88095913 [project @ 1994-06-06 00:41:10 by jwe]
jwe
parents:
diff changeset
908 {
38cb88095913 [project @ 1994-06-06 00:41:10 by jwe]
jwe
parents:
diff changeset
909 npts = nr;
38cb88095913 [project @ 1994-06-06 00:41:10 by jwe]
jwe
parents:
diff changeset
910 nsamples = nc;
38cb88095913 [project @ 1994-06-06 00:41:10 by jwe]
jwe
parents:
diff changeset
911 }
38cb88095913 [project @ 1994-06-06 00:41:10 by jwe]
jwe
parents:
diff changeset
912
5275
23b37da9fd5b [project @ 2005-04-08 16:07:35 by jwe]
jwe
parents: 5105
diff changeset
913 octave_idx_type nn = 4*npts+15;
1948
d7dec93d4b87 [project @ 1996-02-14 03:45:49 by jwe]
jwe
parents: 1882
diff changeset
914
d7dec93d4b87 [project @ 1996-02-14 03:45:49 by jwe]
jwe
parents: 1882
diff changeset
915 Array<Complex> wsave (nn);
d7dec93d4b87 [project @ 1996-02-14 03:45:49 by jwe]
jwe
parents: 1882
diff changeset
916 Complex *pwsave = wsave.fortran_vec ();
d7dec93d4b87 [project @ 1996-02-14 03:45:49 by jwe]
jwe
parents: 1882
diff changeset
917
3585
d9803711e047 [project @ 2000-02-08 04:35:39 by jwe]
jwe
parents: 3580
diff changeset
918 retval = ComplexMatrix (*this);
1948
d7dec93d4b87 [project @ 1996-02-14 03:45:49 by jwe]
jwe
parents: 1882
diff changeset
919 Complex *tmp_data = retval.fortran_vec ();
d7dec93d4b87 [project @ 1996-02-14 03:45:49 by jwe]
jwe
parents: 1882
diff changeset
920
3887
7da18459c08b [project @ 2002-04-04 00:44:21 by jwe]
jwe
parents: 3864
diff changeset
921 F77_FUNC (cffti, CFFTI) (npts, pwsave);
458
38cb88095913 [project @ 1994-06-06 00:41:10 by jwe]
jwe
parents:
diff changeset
922
5275
23b37da9fd5b [project @ 2005-04-08 16:07:35 by jwe]
jwe
parents: 5105
diff changeset
923 for (octave_idx_type j = 0; j < nsamples; j++)
4153
6b96ce9f5743 [project @ 2002-11-06 20:38:49 by jwe]
jwe
parents: 4130
diff changeset
924 {
6b96ce9f5743 [project @ 2002-11-06 20:38:49 by jwe]
jwe
parents: 4130
diff changeset
925 OCTAVE_QUIT;
6b96ce9f5743 [project @ 2002-11-06 20:38:49 by jwe]
jwe
parents: 4130
diff changeset
926
6b96ce9f5743 [project @ 2002-11-06 20:38:49 by jwe]
jwe
parents: 4130
diff changeset
927 F77_FUNC (cfftb, CFFTB) (npts, &tmp_data[npts*j], pwsave);
6b96ce9f5743 [project @ 2002-11-06 20:38:49 by jwe]
jwe
parents: 4130
diff changeset
928 }
458
38cb88095913 [project @ 1994-06-06 00:41:10 by jwe]
jwe
parents:
diff changeset
929
5275
23b37da9fd5b [project @ 2005-04-08 16:07:35 by jwe]
jwe
parents: 5105
diff changeset
930 for (octave_idx_type j = 0; j < npts*nsamples; j++)
3572
8d641545e006 [project @ 2000-02-03 21:39:48 by jwe]
jwe
parents: 3504
diff changeset
931 tmp_data[j] = tmp_data[j] / static_cast<double> (npts);
458
38cb88095913 [project @ 1994-06-06 00:41:10 by jwe]
jwe
parents:
diff changeset
932
1948
d7dec93d4b87 [project @ 1996-02-14 03:45:49 by jwe]
jwe
parents: 1882
diff changeset
933 return retval;
458
38cb88095913 [project @ 1994-06-06 00:41:10 by jwe]
jwe
parents:
diff changeset
934 }
38cb88095913 [project @ 1994-06-06 00:41:10 by jwe]
jwe
parents:
diff changeset
935
677
01da6806197b [project @ 1994-09-08 04:43:13 by jwe]
jwe
parents: 533
diff changeset
936 ComplexMatrix
01da6806197b [project @ 1994-09-08 04:43:13 by jwe]
jwe
parents: 533
diff changeset
937 Matrix::fourier2d (void) const
01da6806197b [project @ 1994-09-08 04:43:13 by jwe]
jwe
parents: 533
diff changeset
938 {
1948
d7dec93d4b87 [project @ 1996-02-14 03:45:49 by jwe]
jwe
parents: 1882
diff changeset
939 ComplexMatrix retval;
d7dec93d4b87 [project @ 1996-02-14 03:45:49 by jwe]
jwe
parents: 1882
diff changeset
940
5275
23b37da9fd5b [project @ 2005-04-08 16:07:35 by jwe]
jwe
parents: 5105
diff changeset
941 octave_idx_type nr = rows ();
23b37da9fd5b [project @ 2005-04-08 16:07:35 by jwe]
jwe
parents: 5105
diff changeset
942 octave_idx_type nc = cols ();
23b37da9fd5b [project @ 2005-04-08 16:07:35 by jwe]
jwe
parents: 5105
diff changeset
943
23b37da9fd5b [project @ 2005-04-08 16:07:35 by jwe]
jwe
parents: 5105
diff changeset
944 octave_idx_type npts, nsamples;
1948
d7dec93d4b87 [project @ 1996-02-14 03:45:49 by jwe]
jwe
parents: 1882
diff changeset
945
677
01da6806197b [project @ 1994-09-08 04:43:13 by jwe]
jwe
parents: 533
diff changeset
946 if (nr == 1 || nc == 1)
01da6806197b [project @ 1994-09-08 04:43:13 by jwe]
jwe
parents: 533
diff changeset
947 {
01da6806197b [project @ 1994-09-08 04:43:13 by jwe]
jwe
parents: 533
diff changeset
948 npts = nr > nc ? nr : nc;
01da6806197b [project @ 1994-09-08 04:43:13 by jwe]
jwe
parents: 533
diff changeset
949 nsamples = 1;
01da6806197b [project @ 1994-09-08 04:43:13 by jwe]
jwe
parents: 533
diff changeset
950 }
01da6806197b [project @ 1994-09-08 04:43:13 by jwe]
jwe
parents: 533
diff changeset
951 else
01da6806197b [project @ 1994-09-08 04:43:13 by jwe]
jwe
parents: 533
diff changeset
952 {
01da6806197b [project @ 1994-09-08 04:43:13 by jwe]
jwe
parents: 533
diff changeset
953 npts = nr;
01da6806197b [project @ 1994-09-08 04:43:13 by jwe]
jwe
parents: 533
diff changeset
954 nsamples = nc;
01da6806197b [project @ 1994-09-08 04:43:13 by jwe]
jwe
parents: 533
diff changeset
955 }
01da6806197b [project @ 1994-09-08 04:43:13 by jwe]
jwe
parents: 533
diff changeset
956
5275
23b37da9fd5b [project @ 2005-04-08 16:07:35 by jwe]
jwe
parents: 5105
diff changeset
957 octave_idx_type nn = 4*npts+15;
1948
d7dec93d4b87 [project @ 1996-02-14 03:45:49 by jwe]
jwe
parents: 1882
diff changeset
958
d7dec93d4b87 [project @ 1996-02-14 03:45:49 by jwe]
jwe
parents: 1882
diff changeset
959 Array<Complex> wsave (nn);
d7dec93d4b87 [project @ 1996-02-14 03:45:49 by jwe]
jwe
parents: 1882
diff changeset
960 Complex *pwsave = wsave.fortran_vec ();
d7dec93d4b87 [project @ 1996-02-14 03:45:49 by jwe]
jwe
parents: 1882
diff changeset
961
3585
d9803711e047 [project @ 2000-02-08 04:35:39 by jwe]
jwe
parents: 3580
diff changeset
962 retval = ComplexMatrix (*this);
1948
d7dec93d4b87 [project @ 1996-02-14 03:45:49 by jwe]
jwe
parents: 1882
diff changeset
963 Complex *tmp_data = retval.fortran_vec ();
d7dec93d4b87 [project @ 1996-02-14 03:45:49 by jwe]
jwe
parents: 1882
diff changeset
964
3887
7da18459c08b [project @ 2002-04-04 00:44:21 by jwe]
jwe
parents: 3864
diff changeset
965 F77_FUNC (cffti, CFFTI) (npts, pwsave);
677
01da6806197b [project @ 1994-09-08 04:43:13 by jwe]
jwe
parents: 533
diff changeset
966
5275
23b37da9fd5b [project @ 2005-04-08 16:07:35 by jwe]
jwe
parents: 5105
diff changeset
967 for (octave_idx_type j = 0; j < nsamples; j++)
4153
6b96ce9f5743 [project @ 2002-11-06 20:38:49 by jwe]
jwe
parents: 4130
diff changeset
968 {
6b96ce9f5743 [project @ 2002-11-06 20:38:49 by jwe]
jwe
parents: 4130
diff changeset
969 OCTAVE_QUIT;
6b96ce9f5743 [project @ 2002-11-06 20:38:49 by jwe]
jwe
parents: 4130
diff changeset
970
6b96ce9f5743 [project @ 2002-11-06 20:38:49 by jwe]
jwe
parents: 4130
diff changeset
971 F77_FUNC (cfftf, CFFTF) (npts, &tmp_data[npts*j], pwsave);
6b96ce9f5743 [project @ 2002-11-06 20:38:49 by jwe]
jwe
parents: 4130
diff changeset
972 }
677
01da6806197b [project @ 1994-09-08 04:43:13 by jwe]
jwe
parents: 533
diff changeset
973
01da6806197b [project @ 1994-09-08 04:43:13 by jwe]
jwe
parents: 533
diff changeset
974 npts = nc;
01da6806197b [project @ 1994-09-08 04:43:13 by jwe]
jwe
parents: 533
diff changeset
975 nsamples = nr;
01da6806197b [project @ 1994-09-08 04:43:13 by jwe]
jwe
parents: 533
diff changeset
976 nn = 4*npts+15;
1948
d7dec93d4b87 [project @ 1996-02-14 03:45:49 by jwe]
jwe
parents: 1882
diff changeset
977
d7dec93d4b87 [project @ 1996-02-14 03:45:49 by jwe]
jwe
parents: 1882
diff changeset
978 wsave.resize (nn);
d7dec93d4b87 [project @ 1996-02-14 03:45:49 by jwe]
jwe
parents: 1882
diff changeset
979 pwsave = wsave.fortran_vec ();
d7dec93d4b87 [project @ 1996-02-14 03:45:49 by jwe]
jwe
parents: 1882
diff changeset
980
4773
ccfbd6047a54 [project @ 2004-02-16 19:02:32 by jwe]
jwe
parents: 4669
diff changeset
981 Array<Complex> tmp (npts);
ccfbd6047a54 [project @ 2004-02-16 19:02:32 by jwe]
jwe
parents: 4669
diff changeset
982 Complex *prow = tmp.fortran_vec ();
1948
d7dec93d4b87 [project @ 1996-02-14 03:45:49 by jwe]
jwe
parents: 1882
diff changeset
983
3887
7da18459c08b [project @ 2002-04-04 00:44:21 by jwe]
jwe
parents: 3864
diff changeset
984 F77_FUNC (cffti, CFFTI) (npts, pwsave);
677
01da6806197b [project @ 1994-09-08 04:43:13 by jwe]
jwe
parents: 533
diff changeset
985
5275
23b37da9fd5b [project @ 2005-04-08 16:07:35 by jwe]
jwe
parents: 5105
diff changeset
986 for (octave_idx_type j = 0; j < nsamples; j++)
677
01da6806197b [project @ 1994-09-08 04:43:13 by jwe]
jwe
parents: 533
diff changeset
987 {
4153
6b96ce9f5743 [project @ 2002-11-06 20:38:49 by jwe]
jwe
parents: 4130
diff changeset
988 OCTAVE_QUIT;
6b96ce9f5743 [project @ 2002-11-06 20:38:49 by jwe]
jwe
parents: 4130
diff changeset
989
5275
23b37da9fd5b [project @ 2005-04-08 16:07:35 by jwe]
jwe
parents: 5105
diff changeset
990 for (octave_idx_type i = 0; i < npts; i++)
1948
d7dec93d4b87 [project @ 1996-02-14 03:45:49 by jwe]
jwe
parents: 1882
diff changeset
991 prow[i] = tmp_data[i*nr + j];
d7dec93d4b87 [project @ 1996-02-14 03:45:49 by jwe]
jwe
parents: 1882
diff changeset
992
3887
7da18459c08b [project @ 2002-04-04 00:44:21 by jwe]
jwe
parents: 3864
diff changeset
993 F77_FUNC (cfftf, CFFTF) (npts, prow, pwsave);
677
01da6806197b [project @ 1994-09-08 04:43:13 by jwe]
jwe
parents: 533
diff changeset
994
5275
23b37da9fd5b [project @ 2005-04-08 16:07:35 by jwe]
jwe
parents: 5105
diff changeset
995 for (octave_idx_type i = 0; i < npts; i++)
1948
d7dec93d4b87 [project @ 1996-02-14 03:45:49 by jwe]
jwe
parents: 1882
diff changeset
996 tmp_data[i*nr + j] = prow[i];
677
01da6806197b [project @ 1994-09-08 04:43:13 by jwe]
jwe
parents: 533
diff changeset
997 }
01da6806197b [project @ 1994-09-08 04:43:13 by jwe]
jwe
parents: 533
diff changeset
998
1948
d7dec93d4b87 [project @ 1996-02-14 03:45:49 by jwe]
jwe
parents: 1882
diff changeset
999 return retval;
677
01da6806197b [project @ 1994-09-08 04:43:13 by jwe]
jwe
parents: 533
diff changeset
1000 }
01da6806197b [project @ 1994-09-08 04:43:13 by jwe]
jwe
parents: 533
diff changeset
1001
01da6806197b [project @ 1994-09-08 04:43:13 by jwe]
jwe
parents: 533
diff changeset
1002 ComplexMatrix
01da6806197b [project @ 1994-09-08 04:43:13 by jwe]
jwe
parents: 533
diff changeset
1003 Matrix::ifourier2d (void) const
01da6806197b [project @ 1994-09-08 04:43:13 by jwe]
jwe
parents: 533
diff changeset
1004 {
1948
d7dec93d4b87 [project @ 1996-02-14 03:45:49 by jwe]
jwe
parents: 1882
diff changeset
1005 ComplexMatrix retval;
d7dec93d4b87 [project @ 1996-02-14 03:45:49 by jwe]
jwe
parents: 1882
diff changeset
1006
5275
23b37da9fd5b [project @ 2005-04-08 16:07:35 by jwe]
jwe
parents: 5105
diff changeset
1007 octave_idx_type nr = rows ();
23b37da9fd5b [project @ 2005-04-08 16:07:35 by jwe]
jwe
parents: 5105
diff changeset
1008 octave_idx_type nc = cols ();
23b37da9fd5b [project @ 2005-04-08 16:07:35 by jwe]
jwe
parents: 5105
diff changeset
1009
23b37da9fd5b [project @ 2005-04-08 16:07:35 by jwe]
jwe
parents: 5105
diff changeset
1010 octave_idx_type npts, nsamples;
1948
d7dec93d4b87 [project @ 1996-02-14 03:45:49 by jwe]
jwe
parents: 1882
diff changeset
1011
677
01da6806197b [project @ 1994-09-08 04:43:13 by jwe]
jwe
parents: 533
diff changeset
1012 if (nr == 1 || nc == 1)
01da6806197b [project @ 1994-09-08 04:43:13 by jwe]
jwe
parents: 533
diff changeset
1013 {
01da6806197b [project @ 1994-09-08 04:43:13 by jwe]
jwe
parents: 533
diff changeset
1014 npts = nr > nc ? nr : nc;
01da6806197b [project @ 1994-09-08 04:43:13 by jwe]
jwe
parents: 533
diff changeset
1015 nsamples = 1;
01da6806197b [project @ 1994-09-08 04:43:13 by jwe]
jwe
parents: 533
diff changeset
1016 }
01da6806197b [project @ 1994-09-08 04:43:13 by jwe]
jwe
parents: 533
diff changeset
1017 else
01da6806197b [project @ 1994-09-08 04:43:13 by jwe]
jwe
parents: 533
diff changeset
1018 {
01da6806197b [project @ 1994-09-08 04:43:13 by jwe]
jwe
parents: 533
diff changeset
1019 npts = nr;
01da6806197b [project @ 1994-09-08 04:43:13 by jwe]
jwe
parents: 533
diff changeset
1020 nsamples = nc;
01da6806197b [project @ 1994-09-08 04:43:13 by jwe]
jwe
parents: 533
diff changeset
1021 }
01da6806197b [project @ 1994-09-08 04:43:13 by jwe]
jwe
parents: 533
diff changeset
1022
5275
23b37da9fd5b [project @ 2005-04-08 16:07:35 by jwe]
jwe
parents: 5105
diff changeset
1023 octave_idx_type nn = 4*npts+15;
1948
d7dec93d4b87 [project @ 1996-02-14 03:45:49 by jwe]
jwe
parents: 1882
diff changeset
1024
d7dec93d4b87 [project @ 1996-02-14 03:45:49 by jwe]
jwe
parents: 1882
diff changeset
1025 Array<Complex> wsave (nn);
d7dec93d4b87 [project @ 1996-02-14 03:45:49 by jwe]
jwe
parents: 1882
diff changeset
1026 Complex *pwsave = wsave.fortran_vec ();
d7dec93d4b87 [project @ 1996-02-14 03:45:49 by jwe]
jwe
parents: 1882
diff changeset
1027
3585
d9803711e047 [project @ 2000-02-08 04:35:39 by jwe]
jwe
parents: 3580
diff changeset
1028 retval = ComplexMatrix (*this);
1948
d7dec93d4b87 [project @ 1996-02-14 03:45:49 by jwe]
jwe
parents: 1882
diff changeset
1029 Complex *tmp_data = retval.fortran_vec ();
d7dec93d4b87 [project @ 1996-02-14 03:45:49 by jwe]
jwe
parents: 1882
diff changeset
1030
3887
7da18459c08b [project @ 2002-04-04 00:44:21 by jwe]
jwe
parents: 3864
diff changeset
1031 F77_FUNC (cffti, CFFTI) (npts, pwsave);
677
01da6806197b [project @ 1994-09-08 04:43:13 by jwe]
jwe
parents: 533
diff changeset
1032
5275
23b37da9fd5b [project @ 2005-04-08 16:07:35 by jwe]
jwe
parents: 5105
diff changeset
1033 for (octave_idx_type j = 0; j < nsamples; j++)
4153
6b96ce9f5743 [project @ 2002-11-06 20:38:49 by jwe]
jwe
parents: 4130
diff changeset
1034 {
6b96ce9f5743 [project @ 2002-11-06 20:38:49 by jwe]
jwe
parents: 4130
diff changeset
1035 OCTAVE_QUIT;
6b96ce9f5743 [project @ 2002-11-06 20:38:49 by jwe]
jwe
parents: 4130
diff changeset
1036
6b96ce9f5743 [project @ 2002-11-06 20:38:49 by jwe]
jwe
parents: 4130
diff changeset
1037 F77_FUNC (cfftb, CFFTB) (npts, &tmp_data[npts*j], pwsave);
6b96ce9f5743 [project @ 2002-11-06 20:38:49 by jwe]
jwe
parents: 4130
diff changeset
1038 }
677
01da6806197b [project @ 1994-09-08 04:43:13 by jwe]
jwe
parents: 533
diff changeset
1039
5275
23b37da9fd5b [project @ 2005-04-08 16:07:35 by jwe]
jwe
parents: 5105
diff changeset
1040 for (octave_idx_type j = 0; j < npts*nsamples; j++)
3572
8d641545e006 [project @ 2000-02-03 21:39:48 by jwe]
jwe
parents: 3504
diff changeset
1041 tmp_data[j] = tmp_data[j] / static_cast<double> (npts);
677
01da6806197b [project @ 1994-09-08 04:43:13 by jwe]
jwe
parents: 533
diff changeset
1042
01da6806197b [project @ 1994-09-08 04:43:13 by jwe]
jwe
parents: 533
diff changeset
1043 npts = nc;
01da6806197b [project @ 1994-09-08 04:43:13 by jwe]
jwe
parents: 533
diff changeset
1044 nsamples = nr;
01da6806197b [project @ 1994-09-08 04:43:13 by jwe]
jwe
parents: 533
diff changeset
1045 nn = 4*npts+15;
1948
d7dec93d4b87 [project @ 1996-02-14 03:45:49 by jwe]
jwe
parents: 1882
diff changeset
1046
d7dec93d4b87 [project @ 1996-02-14 03:45:49 by jwe]
jwe
parents: 1882
diff changeset
1047 wsave.resize (nn);
d7dec93d4b87 [project @ 1996-02-14 03:45:49 by jwe]
jwe
parents: 1882
diff changeset
1048 pwsave = wsave.fortran_vec ();
d7dec93d4b87 [project @ 1996-02-14 03:45:49 by jwe]
jwe
parents: 1882
diff changeset
1049
4773
ccfbd6047a54 [project @ 2004-02-16 19:02:32 by jwe]
jwe
parents: 4669
diff changeset
1050 Array<Complex> tmp (npts);
ccfbd6047a54 [project @ 2004-02-16 19:02:32 by jwe]
jwe
parents: 4669
diff changeset
1051 Complex *prow = tmp.fortran_vec ();
1948
d7dec93d4b87 [project @ 1996-02-14 03:45:49 by jwe]
jwe
parents: 1882
diff changeset
1052
3887
7da18459c08b [project @ 2002-04-04 00:44:21 by jwe]
jwe
parents: 3864
diff changeset
1053 F77_FUNC (cffti, CFFTI) (npts, pwsave);
677
01da6806197b [project @ 1994-09-08 04:43:13 by jwe]
jwe
parents: 533
diff changeset
1054
5275
23b37da9fd5b [project @ 2005-04-08 16:07:35 by jwe]
jwe
parents: 5105
diff changeset
1055 for (octave_idx_type j = 0; j < nsamples; j++)
677
01da6806197b [project @ 1994-09-08 04:43:13 by jwe]
jwe
parents: 533
diff changeset
1056 {
4153
6b96ce9f5743 [project @ 2002-11-06 20:38:49 by jwe]
jwe
parents: 4130
diff changeset
1057 OCTAVE_QUIT;
6b96ce9f5743 [project @ 2002-11-06 20:38:49 by jwe]
jwe
parents: 4130
diff changeset
1058
5275
23b37da9fd5b [project @ 2005-04-08 16:07:35 by jwe]
jwe
parents: 5105
diff changeset
1059 for (octave_idx_type i = 0; i < npts; i++)
1948
d7dec93d4b87 [project @ 1996-02-14 03:45:49 by jwe]
jwe
parents: 1882
diff changeset
1060 prow[i] = tmp_data[i*nr + j];
d7dec93d4b87 [project @ 1996-02-14 03:45:49 by jwe]
jwe
parents: 1882
diff changeset
1061
3887
7da18459c08b [project @ 2002-04-04 00:44:21 by jwe]
jwe
parents: 3864
diff changeset
1062 F77_FUNC (cfftb, CFFTB) (npts, prow, pwsave);
677
01da6806197b [project @ 1994-09-08 04:43:13 by jwe]
jwe
parents: 533
diff changeset
1063
5275
23b37da9fd5b [project @ 2005-04-08 16:07:35 by jwe]
jwe
parents: 5105
diff changeset
1064 for (octave_idx_type i = 0; i < npts; i++)
3572
8d641545e006 [project @ 2000-02-03 21:39:48 by jwe]
jwe
parents: 3504
diff changeset
1065 tmp_data[i*nr + j] = prow[i] / static_cast<double> (npts);
677
01da6806197b [project @ 1994-09-08 04:43:13 by jwe]
jwe
parents: 533
diff changeset
1066 }
01da6806197b [project @ 1994-09-08 04:43:13 by jwe]
jwe
parents: 533
diff changeset
1067
1948
d7dec93d4b87 [project @ 1996-02-14 03:45:49 by jwe]
jwe
parents: 1882
diff changeset
1068 return retval;
677
01da6806197b [project @ 1994-09-08 04:43:13 by jwe]
jwe
parents: 533
diff changeset
1069 }
01da6806197b [project @ 1994-09-08 04:43:13 by jwe]
jwe
parents: 533
diff changeset
1070
3827
ba548facf43b [project @ 2001-05-02 06:15:06 by jwe]
jwe
parents: 3769
diff changeset
1071 #endif
ba548facf43b [project @ 2001-05-02 06:15:06 by jwe]
jwe
parents: 3769
diff changeset
1072
458
38cb88095913 [project @ 1994-06-06 00:41:10 by jwe]
jwe
parents:
diff changeset
1073 DET
38cb88095913 [project @ 1994-06-06 00:41:10 by jwe]
jwe
parents:
diff changeset
1074 Matrix::determinant (void) const
38cb88095913 [project @ 1994-06-06 00:41:10 by jwe]
jwe
parents:
diff changeset
1075 {
5275
23b37da9fd5b [project @ 2005-04-08 16:07:35 by jwe]
jwe
parents: 5105
diff changeset
1076 octave_idx_type info;
458
38cb88095913 [project @ 1994-06-06 00:41:10 by jwe]
jwe
parents:
diff changeset
1077 double rcond;
4329
d53c33d93440 [project @ 2003-02-18 20:00:48 by jwe]
jwe
parents: 4316
diff changeset
1078 return determinant (info, rcond, 0);
458
38cb88095913 [project @ 1994-06-06 00:41:10 by jwe]
jwe
parents:
diff changeset
1079 }
38cb88095913 [project @ 1994-06-06 00:41:10 by jwe]
jwe
parents:
diff changeset
1080
38cb88095913 [project @ 1994-06-06 00:41:10 by jwe]
jwe
parents:
diff changeset
1081 DET
5275
23b37da9fd5b [project @ 2005-04-08 16:07:35 by jwe]
jwe
parents: 5105
diff changeset
1082 Matrix::determinant (octave_idx_type& info) const
458
38cb88095913 [project @ 1994-06-06 00:41:10 by jwe]
jwe
parents:
diff changeset
1083 {
38cb88095913 [project @ 1994-06-06 00:41:10 by jwe]
jwe
parents:
diff changeset
1084 double rcond;
4329
d53c33d93440 [project @ 2003-02-18 20:00:48 by jwe]
jwe
parents: 4316
diff changeset
1085 return determinant (info, rcond, 0);
458
38cb88095913 [project @ 1994-06-06 00:41:10 by jwe]
jwe
parents:
diff changeset
1086 }
38cb88095913 [project @ 1994-06-06 00:41:10 by jwe]
jwe
parents:
diff changeset
1087
38cb88095913 [project @ 1994-06-06 00:41:10 by jwe]
jwe
parents:
diff changeset
1088 DET
5275
23b37da9fd5b [project @ 2005-04-08 16:07:35 by jwe]
jwe
parents: 5105
diff changeset
1089 Matrix::determinant (octave_idx_type& info, double& rcond, int calc_cond) const
458
38cb88095913 [project @ 1994-06-06 00:41:10 by jwe]
jwe
parents:
diff changeset
1090 {
38cb88095913 [project @ 1994-06-06 00:41:10 by jwe]
jwe
parents:
diff changeset
1091 DET retval;
38cb88095913 [project @ 1994-06-06 00:41:10 by jwe]
jwe
parents:
diff changeset
1092
5275
23b37da9fd5b [project @ 2005-04-08 16:07:35 by jwe]
jwe
parents: 5105
diff changeset
1093 octave_idx_type nr = rows ();
23b37da9fd5b [project @ 2005-04-08 16:07:35 by jwe]
jwe
parents: 5105
diff changeset
1094 octave_idx_type nc = cols ();
458
38cb88095913 [project @ 1994-06-06 00:41:10 by jwe]
jwe
parents:
diff changeset
1095
38cb88095913 [project @ 1994-06-06 00:41:10 by jwe]
jwe
parents:
diff changeset
1096 if (nr == 0 || nc == 0)
38cb88095913 [project @ 1994-06-06 00:41:10 by jwe]
jwe
parents:
diff changeset
1097 {
5634
4b45b2bcda89 [project @ 2006-03-02 03:40:00 by jwe]
jwe
parents: 5389
diff changeset
1098 retval = DET (1.0, 0);
458
38cb88095913 [project @ 1994-06-06 00:41:10 by jwe]
jwe
parents:
diff changeset
1099 }
38cb88095913 [project @ 1994-06-06 00:41:10 by jwe]
jwe
parents:
diff changeset
1100 else
38cb88095913 [project @ 1994-06-06 00:41:10 by jwe]
jwe
parents:
diff changeset
1101 {
5275
23b37da9fd5b [project @ 2005-04-08 16:07:35 by jwe]
jwe
parents: 5105
diff changeset
1102 Array<octave_idx_type> ipvt (nr);
23b37da9fd5b [project @ 2005-04-08 16:07:35 by jwe]
jwe
parents: 5105
diff changeset
1103 octave_idx_type *pipvt = ipvt.fortran_vec ();
1948
d7dec93d4b87 [project @ 1996-02-14 03:45:49 by jwe]
jwe
parents: 1882
diff changeset
1104
d7dec93d4b87 [project @ 1996-02-14 03:45:49 by jwe]
jwe
parents: 1882
diff changeset
1105 Matrix atmp = *this;
d7dec93d4b87 [project @ 1996-02-14 03:45:49 by jwe]
jwe
parents: 1882
diff changeset
1106 double *tmp_data = atmp.fortran_vec ();
d7dec93d4b87 [project @ 1996-02-14 03:45:49 by jwe]
jwe
parents: 1882
diff changeset
1107
4329
d53c33d93440 [project @ 2003-02-18 20:00:48 by jwe]
jwe
parents: 4316
diff changeset
1108 info = 0;
d53c33d93440 [project @ 2003-02-18 20:00:48 by jwe]
jwe
parents: 4316
diff changeset
1109
4330
9f86c2055b58 [project @ 2003-02-18 22:31:55 by jwe]
jwe
parents: 4329
diff changeset
1110 // Calculate the norm of the matrix, for later use.
4329
d53c33d93440 [project @ 2003-02-18 20:00:48 by jwe]
jwe
parents: 4316
diff changeset
1111 double anorm = 0;
d53c33d93440 [project @ 2003-02-18 20:00:48 by jwe]
jwe
parents: 4316
diff changeset
1112 if (calc_cond)
5275
23b37da9fd5b [project @ 2005-04-08 16:07:35 by jwe]
jwe
parents: 5105
diff changeset
1113 anorm = atmp.abs().sum().row(static_cast<octave_idx_type>(0)).max();
4329
d53c33d93440 [project @ 2003-02-18 20:00:48 by jwe]
jwe
parents: 4316
diff changeset
1114
d53c33d93440 [project @ 2003-02-18 20:00:48 by jwe]
jwe
parents: 4316
diff changeset
1115 F77_XFCN (dgetrf, DGETRF, (nr, nr, tmp_data, nr, pipvt, info));
1948
d7dec93d4b87 [project @ 1996-02-14 03:45:49 by jwe]
jwe
parents: 1882
diff changeset
1116
d7dec93d4b87 [project @ 1996-02-14 03:45:49 by jwe]
jwe
parents: 1882
diff changeset
1117 if (f77_exception_encountered)
4329
d53c33d93440 [project @ 2003-02-18 20:00:48 by jwe]
jwe
parents: 4316
diff changeset
1118 (*current_liboctave_error_handler) ("unrecoverable error in dgetrf");
458
38cb88095913 [project @ 1994-06-06 00:41:10 by jwe]
jwe
parents:
diff changeset
1119 else
38cb88095913 [project @ 1994-06-06 00:41:10 by jwe]
jwe
parents:
diff changeset
1120 {
4330
9f86c2055b58 [project @ 2003-02-18 22:31:55 by jwe]
jwe
parents: 4329
diff changeset
1121 // Throw-away extra info LAPACK gives so as to not change output.
4509
9ec494b3eb5f [project @ 2003-09-11 19:08:25 by jwe]
jwe
parents: 4469
diff changeset
1122 rcond = 0.0;
9ec494b3eb5f [project @ 2003-09-11 19:08:25 by jwe]
jwe
parents: 4469
diff changeset
1123 if (info != 0)
1948
d7dec93d4b87 [project @ 1996-02-14 03:45:49 by jwe]
jwe
parents: 1882
diff changeset
1124 {
4509
9ec494b3eb5f [project @ 2003-09-11 19:08:25 by jwe]
jwe
parents: 4469
diff changeset
1125 info = -1;
9ec494b3eb5f [project @ 2003-09-11 19:08:25 by jwe]
jwe
parents: 4469
diff changeset
1126 retval = DET ();
4329
d53c33d93440 [project @ 2003-02-18 20:00:48 by jwe]
jwe
parents: 4316
diff changeset
1127 }
d53c33d93440 [project @ 2003-02-18 20:00:48 by jwe]
jwe
parents: 4316
diff changeset
1128 else
1948
d7dec93d4b87 [project @ 1996-02-14 03:45:49 by jwe]
jwe
parents: 1882
diff changeset
1129 {
4329
d53c33d93440 [project @ 2003-02-18 20:00:48 by jwe]
jwe
parents: 4316
diff changeset
1130 if (calc_cond)
d53c33d93440 [project @ 2003-02-18 20:00:48 by jwe]
jwe
parents: 4316
diff changeset
1131 {
4330
9f86c2055b58 [project @ 2003-02-18 22:31:55 by jwe]
jwe
parents: 4329
diff changeset
1132 // Now calc the condition number for non-singular matrix.
4329
d53c33d93440 [project @ 2003-02-18 20:00:48 by jwe]
jwe
parents: 4316
diff changeset
1133 char job = '1';
d53c33d93440 [project @ 2003-02-18 20:00:48 by jwe]
jwe
parents: 4316
diff changeset
1134 Array<double> z (4 * nc);
d53c33d93440 [project @ 2003-02-18 20:00:48 by jwe]
jwe
parents: 4316
diff changeset
1135 double *pz = z.fortran_vec ();
5275
23b37da9fd5b [project @ 2005-04-08 16:07:35 by jwe]
jwe
parents: 5105
diff changeset
1136 Array<octave_idx_type> iz (nc);
23b37da9fd5b [project @ 2005-04-08 16:07:35 by jwe]
jwe
parents: 5105
diff changeset
1137 octave_idx_type *piz = iz.fortran_vec ();
4329
d53c33d93440 [project @ 2003-02-18 20:00:48 by jwe]
jwe
parents: 4316
diff changeset
1138
4552
6f3382e08a52 [project @ 2003-10-27 20:38:02 by jwe]
jwe
parents: 4513
diff changeset
1139 F77_XFCN (dgecon, DGECON, (F77_CONST_CHAR_ARG2 (&job, 1),
6f3382e08a52 [project @ 2003-10-27 20:38:02 by jwe]
jwe
parents: 4513
diff changeset
1140 nc, tmp_data, nr, anorm,
6f3382e08a52 [project @ 2003-10-27 20:38:02 by jwe]
jwe
parents: 4513
diff changeset
1141 rcond, pz, piz, info
6f3382e08a52 [project @ 2003-10-27 20:38:02 by jwe]
jwe
parents: 4513
diff changeset
1142 F77_CHAR_ARG_LEN (1)));
4329
d53c33d93440 [project @ 2003-02-18 20:00:48 by jwe]
jwe
parents: 4316
diff changeset
1143
d53c33d93440 [project @ 2003-02-18 20:00:48 by jwe]
jwe
parents: 4316
diff changeset
1144 if (f77_exception_encountered)
d53c33d93440 [project @ 2003-02-18 20:00:48 by jwe]
jwe
parents: 4316
diff changeset
1145 (*current_liboctave_error_handler)
d53c33d93440 [project @ 2003-02-18 20:00:48 by jwe]
jwe
parents: 4316
diff changeset
1146 ("unrecoverable error in dgecon");
d53c33d93440 [project @ 2003-02-18 20:00:48 by jwe]
jwe
parents: 4316
diff changeset
1147 }
d53c33d93440 [project @ 2003-02-18 20:00:48 by jwe]
jwe
parents: 4316
diff changeset
1148
4509
9ec494b3eb5f [project @ 2003-09-11 19:08:25 by jwe]
jwe
parents: 4469
diff changeset
1149 if (info != 0)
4329
d53c33d93440 [project @ 2003-02-18 20:00:48 by jwe]
jwe
parents: 4316
diff changeset
1150 {
d53c33d93440 [project @ 2003-02-18 20:00:48 by jwe]
jwe
parents: 4316
diff changeset
1151 info = -1;
d53c33d93440 [project @ 2003-02-18 20:00:48 by jwe]
jwe
parents: 4316
diff changeset
1152 retval = DET ();
d53c33d93440 [project @ 2003-02-18 20:00:48 by jwe]
jwe
parents: 4316
diff changeset
1153 }
d53c33d93440 [project @ 2003-02-18 20:00:48 by jwe]
jwe
parents: 4316
diff changeset
1154 else
d53c33d93440 [project @ 2003-02-18 20:00:48 by jwe]
jwe
parents: 4316
diff changeset
1155 {
5634
4b45b2bcda89 [project @ 2006-03-02 03:40:00 by jwe]
jwe
parents: 5389
diff changeset
1156 double c = 1.0;
4b45b2bcda89 [project @ 2006-03-02 03:40:00 by jwe]
jwe
parents: 5389
diff changeset
1157 int e = 0;
4b45b2bcda89 [project @ 2006-03-02 03:40:00 by jwe]
jwe
parents: 5389
diff changeset
1158
4b45b2bcda89 [project @ 2006-03-02 03:40:00 by jwe]
jwe
parents: 5389
diff changeset
1159 for (octave_idx_type i = 0; i < nc; i++)
4329
d53c33d93440 [project @ 2003-02-18 20:00:48 by jwe]
jwe
parents: 4316
diff changeset
1160 {
5634
4b45b2bcda89 [project @ 2006-03-02 03:40:00 by jwe]
jwe
parents: 5389
diff changeset
1161 if (ipvt(i) != (i+1))
4b45b2bcda89 [project @ 2006-03-02 03:40:00 by jwe]
jwe
parents: 5389
diff changeset
1162 c = -c;
4b45b2bcda89 [project @ 2006-03-02 03:40:00 by jwe]
jwe
parents: 5389
diff changeset
1163
4b45b2bcda89 [project @ 2006-03-02 03:40:00 by jwe]
jwe
parents: 5389
diff changeset
1164 c *= atmp(i,i);
4b45b2bcda89 [project @ 2006-03-02 03:40:00 by jwe]
jwe
parents: 5389
diff changeset
1165
4b45b2bcda89 [project @ 2006-03-02 03:40:00 by jwe]
jwe
parents: 5389
diff changeset
1166 if (c == 0.0)
4b45b2bcda89 [project @ 2006-03-02 03:40:00 by jwe]
jwe
parents: 5389
diff changeset
1167 break;
4b45b2bcda89 [project @ 2006-03-02 03:40:00 by jwe]
jwe
parents: 5389
diff changeset
1168
4b45b2bcda89 [project @ 2006-03-02 03:40:00 by jwe]
jwe
parents: 5389
diff changeset
1169 while (fabs (c) < 0.5)
4329
d53c33d93440 [project @ 2003-02-18 20:00:48 by jwe]
jwe
parents: 4316
diff changeset
1170 {
5634
4b45b2bcda89 [project @ 2006-03-02 03:40:00 by jwe]
jwe
parents: 5389
diff changeset
1171 c *= 2.0;
4b45b2bcda89 [project @ 2006-03-02 03:40:00 by jwe]
jwe
parents: 5389
diff changeset
1172 e--;
4329
d53c33d93440 [project @ 2003-02-18 20:00:48 by jwe]
jwe
parents: 4316
diff changeset
1173 }
5634
4b45b2bcda89 [project @ 2006-03-02 03:40:00 by jwe]
jwe
parents: 5389
diff changeset
1174
4b45b2bcda89 [project @ 2006-03-02 03:40:00 by jwe]
jwe
parents: 5389
diff changeset
1175 while (fabs (c) >= 2.0)
4329
d53c33d93440 [project @ 2003-02-18 20:00:48 by jwe]
jwe
parents: 4316
diff changeset
1176 {
5634
4b45b2bcda89 [project @ 2006-03-02 03:40:00 by jwe]
jwe
parents: 5389
diff changeset
1177 c /= 2.0;
4b45b2bcda89 [project @ 2006-03-02 03:40:00 by jwe]
jwe
parents: 5389
diff changeset
1178 e++;
4329
d53c33d93440 [project @ 2003-02-18 20:00:48 by jwe]
jwe
parents: 4316
diff changeset
1179 }
d53c33d93440 [project @ 2003-02-18 20:00:48 by jwe]
jwe
parents: 4316
diff changeset
1180 }
5634
4b45b2bcda89 [project @ 2006-03-02 03:40:00 by jwe]
jwe
parents: 5389
diff changeset
1181
4b45b2bcda89 [project @ 2006-03-02 03:40:00 by jwe]
jwe
parents: 5389
diff changeset
1182 retval = DET (c, e);
4329
d53c33d93440 [project @ 2003-02-18 20:00:48 by jwe]
jwe
parents: 4316
diff changeset
1183 }
1948
d7dec93d4b87 [project @ 1996-02-14 03:45:49 by jwe]
jwe
parents: 1882
diff changeset
1184 }
458
38cb88095913 [project @ 1994-06-06 00:41:10 by jwe]
jwe
parents:
diff changeset
1185 }
38cb88095913 [project @ 1994-06-06 00:41:10 by jwe]
jwe
parents:
diff changeset
1186 }
38cb88095913 [project @ 1994-06-06 00:41:10 by jwe]
jwe
parents:
diff changeset
1187
38cb88095913 [project @ 1994-06-06 00:41:10 by jwe]
jwe
parents:
diff changeset
1188 return retval;
38cb88095913 [project @ 1994-06-06 00:41:10 by jwe]
jwe
parents:
diff changeset
1189 }
38cb88095913 [project @ 1994-06-06 00:41:10 by jwe]
jwe
parents:
diff changeset
1190
38cb88095913 [project @ 1994-06-06 00:41:10 by jwe]
jwe
parents:
diff changeset
1191 Matrix
5785
6b9cec830d72 [project @ 2006-05-03 19:32:46 by dbateman]
dbateman
parents: 5775
diff changeset
1192 Matrix::utsolve (MatrixType &mattype, const Matrix& b, octave_idx_type& info,
6b9cec830d72 [project @ 2006-05-03 19:32:46 by dbateman]
dbateman
parents: 5775
diff changeset
1193 double& rcond, solve_singularity_handler sing_handler,
6b9cec830d72 [project @ 2006-05-03 19:32:46 by dbateman]
dbateman
parents: 5775
diff changeset
1194 bool calc_cond) const
6b9cec830d72 [project @ 2006-05-03 19:32:46 by dbateman]
dbateman
parents: 5775
diff changeset
1195 {
6b9cec830d72 [project @ 2006-05-03 19:32:46 by dbateman]
dbateman
parents: 5775
diff changeset
1196 Matrix retval;
6b9cec830d72 [project @ 2006-05-03 19:32:46 by dbateman]
dbateman
parents: 5775
diff changeset
1197
6b9cec830d72 [project @ 2006-05-03 19:32:46 by dbateman]
dbateman
parents: 5775
diff changeset
1198 octave_idx_type nr = rows ();
6b9cec830d72 [project @ 2006-05-03 19:32:46 by dbateman]
dbateman
parents: 5775
diff changeset
1199 octave_idx_type nc = cols ();
6b9cec830d72 [project @ 2006-05-03 19:32:46 by dbateman]
dbateman
parents: 5775
diff changeset
1200
6b9cec830d72 [project @ 2006-05-03 19:32:46 by dbateman]
dbateman
parents: 5775
diff changeset
1201 if (nr == 0 || nc == 0 || nr != b.rows ())
6b9cec830d72 [project @ 2006-05-03 19:32:46 by dbateman]
dbateman
parents: 5775
diff changeset
1202 (*current_liboctave_error_handler)
6b9cec830d72 [project @ 2006-05-03 19:32:46 by dbateman]
dbateman
parents: 5775
diff changeset
1203 ("matrix dimension mismatch solution of linear equations");
6b9cec830d72 [project @ 2006-05-03 19:32:46 by dbateman]
dbateman
parents: 5775
diff changeset
1204 else
6b9cec830d72 [project @ 2006-05-03 19:32:46 by dbateman]
dbateman
parents: 5775
diff changeset
1205 {
6b9cec830d72 [project @ 2006-05-03 19:32:46 by dbateman]
dbateman
parents: 5775
diff changeset
1206 volatile int typ = mattype.type ();
6b9cec830d72 [project @ 2006-05-03 19:32:46 by dbateman]
dbateman
parents: 5775
diff changeset
1207
6b9cec830d72 [project @ 2006-05-03 19:32:46 by dbateman]
dbateman
parents: 5775
diff changeset
1208 if (typ == MatrixType::Permuted_Upper ||
6b9cec830d72 [project @ 2006-05-03 19:32:46 by dbateman]
dbateman
parents: 5775
diff changeset
1209 typ == MatrixType::Upper)
6b9cec830d72 [project @ 2006-05-03 19:32:46 by dbateman]
dbateman
parents: 5775
diff changeset
1210 {
6b9cec830d72 [project @ 2006-05-03 19:32:46 by dbateman]
dbateman
parents: 5775
diff changeset
1211 octave_idx_type b_nc = b.cols ();
6b9cec830d72 [project @ 2006-05-03 19:32:46 by dbateman]
dbateman
parents: 5775
diff changeset
1212 rcond = 1.;
6b9cec830d72 [project @ 2006-05-03 19:32:46 by dbateman]
dbateman
parents: 5775
diff changeset
1213 info = 0;
6b9cec830d72 [project @ 2006-05-03 19:32:46 by dbateman]
dbateman
parents: 5775
diff changeset
1214
6b9cec830d72 [project @ 2006-05-03 19:32:46 by dbateman]
dbateman
parents: 5775
diff changeset
1215 if (typ == MatrixType::Permuted_Upper)
6b9cec830d72 [project @ 2006-05-03 19:32:46 by dbateman]
dbateman
parents: 5775
diff changeset
1216 {
6b9cec830d72 [project @ 2006-05-03 19:32:46 by dbateman]
dbateman
parents: 5775
diff changeset
1217 (*current_liboctave_error_handler)
6b9cec830d72 [project @ 2006-05-03 19:32:46 by dbateman]
dbateman
parents: 5775
diff changeset
1218 ("Permuted triangular matrix not implemented");
6b9cec830d72 [project @ 2006-05-03 19:32:46 by dbateman]
dbateman
parents: 5775
diff changeset
1219 }
6b9cec830d72 [project @ 2006-05-03 19:32:46 by dbateman]
dbateman
parents: 5775
diff changeset
1220 else
6b9cec830d72 [project @ 2006-05-03 19:32:46 by dbateman]
dbateman
parents: 5775
diff changeset
1221 {
6b9cec830d72 [project @ 2006-05-03 19:32:46 by dbateman]
dbateman
parents: 5775
diff changeset
1222 const double *tmp_data = fortran_vec ();
6b9cec830d72 [project @ 2006-05-03 19:32:46 by dbateman]
dbateman
parents: 5775
diff changeset
1223
6b9cec830d72 [project @ 2006-05-03 19:32:46 by dbateman]
dbateman
parents: 5775
diff changeset
1224 if (calc_cond)
6b9cec830d72 [project @ 2006-05-03 19:32:46 by dbateman]
dbateman
parents: 5775
diff changeset
1225 {
6b9cec830d72 [project @ 2006-05-03 19:32:46 by dbateman]
dbateman
parents: 5775
diff changeset
1226 char norm = '1';
6b9cec830d72 [project @ 2006-05-03 19:32:46 by dbateman]
dbateman
parents: 5775
diff changeset
1227 char uplo = 'U';
6b9cec830d72 [project @ 2006-05-03 19:32:46 by dbateman]
dbateman
parents: 5775
diff changeset
1228 char dia = 'N';
6b9cec830d72 [project @ 2006-05-03 19:32:46 by dbateman]
dbateman
parents: 5775
diff changeset
1229
6b9cec830d72 [project @ 2006-05-03 19:32:46 by dbateman]
dbateman
parents: 5775
diff changeset
1230 Array<double> z (3 * nc);
6b9cec830d72 [project @ 2006-05-03 19:32:46 by dbateman]
dbateman
parents: 5775
diff changeset
1231 double *pz = z.fortran_vec ();
6b9cec830d72 [project @ 2006-05-03 19:32:46 by dbateman]
dbateman
parents: 5775
diff changeset
1232 Array<octave_idx_type> iz (nc);
6b9cec830d72 [project @ 2006-05-03 19:32:46 by dbateman]
dbateman
parents: 5775
diff changeset
1233 octave_idx_type *piz = iz.fortran_vec ();
6b9cec830d72 [project @ 2006-05-03 19:32:46 by dbateman]
dbateman
parents: 5775
diff changeset
1234
6b9cec830d72 [project @ 2006-05-03 19:32:46 by dbateman]
dbateman
parents: 5775
diff changeset
1235 F77_XFCN (dtrcon, DTRCON, (F77_CONST_CHAR_ARG2 (&norm, 1),
6b9cec830d72 [project @ 2006-05-03 19:32:46 by dbateman]
dbateman
parents: 5775
diff changeset
1236 F77_CONST_CHAR_ARG2 (&uplo, 1),
6b9cec830d72 [project @ 2006-05-03 19:32:46 by dbateman]
dbateman
parents: 5775
diff changeset
1237 F77_CONST_CHAR_ARG2 (&dia, 1),
6b9cec830d72 [project @ 2006-05-03 19:32:46 by dbateman]
dbateman
parents: 5775
diff changeset
1238 nr, tmp_data, nr, rcond,
6b9cec830d72 [project @ 2006-05-03 19:32:46 by dbateman]
dbateman
parents: 5775
diff changeset
1239 pz, piz, info
6b9cec830d72 [project @ 2006-05-03 19:32:46 by dbateman]
dbateman
parents: 5775
diff changeset
1240 F77_CHAR_ARG_LEN (1)
6b9cec830d72 [project @ 2006-05-03 19:32:46 by dbateman]
dbateman
parents: 5775
diff changeset
1241 F77_CHAR_ARG_LEN (1)
6b9cec830d72 [project @ 2006-05-03 19:32:46 by dbateman]
dbateman
parents: 5775
diff changeset
1242 F77_CHAR_ARG_LEN (1)));
6b9cec830d72 [project @ 2006-05-03 19:32:46 by dbateman]
dbateman
parents: 5775
diff changeset
1243
6b9cec830d72 [project @ 2006-05-03 19:32:46 by dbateman]
dbateman
parents: 5775
diff changeset
1244 if (f77_exception_encountered)
6b9cec830d72 [project @ 2006-05-03 19:32:46 by dbateman]
dbateman
parents: 5775
diff changeset
1245 (*current_liboctave_error_handler)
6b9cec830d72 [project @ 2006-05-03 19:32:46 by dbateman]
dbateman
parents: 5775
diff changeset
1246 ("unrecoverable error in dtrcon");
6b9cec830d72 [project @ 2006-05-03 19:32:46 by dbateman]
dbateman
parents: 5775
diff changeset
1247
6b9cec830d72 [project @ 2006-05-03 19:32:46 by dbateman]
dbateman
parents: 5775
diff changeset
1248 if (info != 0)
6b9cec830d72 [project @ 2006-05-03 19:32:46 by dbateman]
dbateman
parents: 5775
diff changeset
1249 info = -2;
6b9cec830d72 [project @ 2006-05-03 19:32:46 by dbateman]
dbateman
parents: 5775
diff changeset
1250
6b9cec830d72 [project @ 2006-05-03 19:32:46 by dbateman]
dbateman
parents: 5775
diff changeset
1251 volatile double rcond_plus_one = rcond + 1.0;
6b9cec830d72 [project @ 2006-05-03 19:32:46 by dbateman]
dbateman
parents: 5775
diff changeset
1252
6b9cec830d72 [project @ 2006-05-03 19:32:46 by dbateman]
dbateman
parents: 5775
diff changeset
1253 if (rcond_plus_one == 1.0 || xisnan (rcond))
6b9cec830d72 [project @ 2006-05-03 19:32:46 by dbateman]
dbateman
parents: 5775
diff changeset
1254 {
6b9cec830d72 [project @ 2006-05-03 19:32:46 by dbateman]
dbateman
parents: 5775
diff changeset
1255 info = -2;
6b9cec830d72 [project @ 2006-05-03 19:32:46 by dbateman]
dbateman
parents: 5775
diff changeset
1256
6b9cec830d72 [project @ 2006-05-03 19:32:46 by dbateman]
dbateman
parents: 5775
diff changeset
1257 if (sing_handler)
6b9cec830d72 [project @ 2006-05-03 19:32:46 by dbateman]
dbateman
parents: 5775
diff changeset
1258 sing_handler (rcond);
6b9cec830d72 [project @ 2006-05-03 19:32:46 by dbateman]
dbateman
parents: 5775
diff changeset
1259 else
6b9cec830d72 [project @ 2006-05-03 19:32:46 by dbateman]
dbateman
parents: 5775
diff changeset
1260 (*current_liboctave_error_handler)
6b9cec830d72 [project @ 2006-05-03 19:32:46 by dbateman]
dbateman
parents: 5775
diff changeset
1261 ("matrix singular to machine precision, rcond = %g",
6b9cec830d72 [project @ 2006-05-03 19:32:46 by dbateman]
dbateman
parents: 5775
diff changeset
1262 rcond);
6b9cec830d72 [project @ 2006-05-03 19:32:46 by dbateman]
dbateman
parents: 5775
diff changeset
1263 }
6b9cec830d72 [project @ 2006-05-03 19:32:46 by dbateman]
dbateman
parents: 5775
diff changeset
1264 }
6b9cec830d72 [project @ 2006-05-03 19:32:46 by dbateman]
dbateman
parents: 5775
diff changeset
1265
6b9cec830d72 [project @ 2006-05-03 19:32:46 by dbateman]
dbateman
parents: 5775
diff changeset
1266 if (info == 0)
6b9cec830d72 [project @ 2006-05-03 19:32:46 by dbateman]
dbateman
parents: 5775
diff changeset
1267 {
6b9cec830d72 [project @ 2006-05-03 19:32:46 by dbateman]
dbateman
parents: 5775
diff changeset
1268 retval = b;
6b9cec830d72 [project @ 2006-05-03 19:32:46 by dbateman]
dbateman
parents: 5775
diff changeset
1269 double *result = retval.fortran_vec ();
6b9cec830d72 [project @ 2006-05-03 19:32:46 by dbateman]
dbateman
parents: 5775
diff changeset
1270
6b9cec830d72 [project @ 2006-05-03 19:32:46 by dbateman]
dbateman
parents: 5775
diff changeset
1271 char uplo = 'U';
6b9cec830d72 [project @ 2006-05-03 19:32:46 by dbateman]
dbateman
parents: 5775
diff changeset
1272 char trans = 'N';
6b9cec830d72 [project @ 2006-05-03 19:32:46 by dbateman]
dbateman
parents: 5775
diff changeset
1273 char dia = 'N';
6b9cec830d72 [project @ 2006-05-03 19:32:46 by dbateman]
dbateman
parents: 5775
diff changeset
1274
6b9cec830d72 [project @ 2006-05-03 19:32:46 by dbateman]
dbateman
parents: 5775
diff changeset
1275 F77_XFCN (dtrtrs, DTRTRS, (F77_CONST_CHAR_ARG2 (&uplo, 1),
6b9cec830d72 [project @ 2006-05-03 19:32:46 by dbateman]
dbateman
parents: 5775
diff changeset
1276 F77_CONST_CHAR_ARG2 (&trans, 1),
6b9cec830d72 [project @ 2006-05-03 19:32:46 by dbateman]
dbateman
parents: 5775
diff changeset
1277 F77_CONST_CHAR_ARG2 (&dia, 1),
6b9cec830d72 [project @ 2006-05-03 19:32:46 by dbateman]
dbateman
parents: 5775
diff changeset
1278 nr, b_nc, tmp_data, nr,
6b9cec830d72 [project @ 2006-05-03 19:32:46 by dbateman]
dbateman
parents: 5775
diff changeset
1279 result, nr, info
6b9cec830d72 [project @ 2006-05-03 19:32:46 by dbateman]
dbateman
parents: 5775
diff changeset
1280 F77_CHAR_ARG_LEN (1)
6b9cec830d72 [project @ 2006-05-03 19:32:46 by dbateman]
dbateman
parents: 5775
diff changeset
1281 F77_CHAR_ARG_LEN (1)
6b9cec830d72 [project @ 2006-05-03 19:32:46 by dbateman]
dbateman
parents: 5775
diff changeset
1282 F77_CHAR_ARG_LEN (1)));
6b9cec830d72 [project @ 2006-05-03 19:32:46 by dbateman]
dbateman
parents: 5775
diff changeset
1283
6b9cec830d72 [project @ 2006-05-03 19:32:46 by dbateman]
dbateman
parents: 5775
diff changeset
1284 if (f77_exception_encountered)
6b9cec830d72 [project @ 2006-05-03 19:32:46 by dbateman]
dbateman
parents: 5775
diff changeset
1285 (*current_liboctave_error_handler)
6b9cec830d72 [project @ 2006-05-03 19:32:46 by dbateman]
dbateman
parents: 5775
diff changeset
1286 ("unrecoverable error in dtrtrs");
6b9cec830d72 [project @ 2006-05-03 19:32:46 by dbateman]
dbateman
parents: 5775
diff changeset
1287 }
6b9cec830d72 [project @ 2006-05-03 19:32:46 by dbateman]
dbateman
parents: 5775
diff changeset
1288 }
6b9cec830d72 [project @ 2006-05-03 19:32:46 by dbateman]
dbateman
parents: 5775
diff changeset
1289 }
6b9cec830d72 [project @ 2006-05-03 19:32:46 by dbateman]
dbateman
parents: 5775
diff changeset
1290 else
6b9cec830d72 [project @ 2006-05-03 19:32:46 by dbateman]
dbateman
parents: 5775
diff changeset
1291 (*current_liboctave_error_handler) ("incorrect matrix type");
6b9cec830d72 [project @ 2006-05-03 19:32:46 by dbateman]
dbateman
parents: 5775
diff changeset
1292 }
6b9cec830d72 [project @ 2006-05-03 19:32:46 by dbateman]
dbateman
parents: 5775
diff changeset
1293
6b9cec830d72 [project @ 2006-05-03 19:32:46 by dbateman]
dbateman
parents: 5775
diff changeset
1294 return retval;
6b9cec830d72 [project @ 2006-05-03 19:32:46 by dbateman]
dbateman
parents: 5775
diff changeset
1295 }
6b9cec830d72 [project @ 2006-05-03 19:32:46 by dbateman]
dbateman
parents: 5775
diff changeset
1296
6b9cec830d72 [project @ 2006-05-03 19:32:46 by dbateman]
dbateman
parents: 5775
diff changeset
1297 Matrix
6b9cec830d72 [project @ 2006-05-03 19:32:46 by dbateman]
dbateman
parents: 5775
diff changeset
1298 Matrix::ltsolve (MatrixType &mattype, const Matrix& b, octave_idx_type& info,
6b9cec830d72 [project @ 2006-05-03 19:32:46 by dbateman]
dbateman
parents: 5775
diff changeset
1299 double& rcond, solve_singularity_handler sing_handler,
6b9cec830d72 [project @ 2006-05-03 19:32:46 by dbateman]
dbateman
parents: 5775
diff changeset
1300 bool calc_cond) const
6b9cec830d72 [project @ 2006-05-03 19:32:46 by dbateman]
dbateman
parents: 5775
diff changeset
1301 {
6b9cec830d72 [project @ 2006-05-03 19:32:46 by dbateman]
dbateman
parents: 5775
diff changeset
1302 Matrix retval;
6b9cec830d72 [project @ 2006-05-03 19:32:46 by dbateman]
dbateman
parents: 5775
diff changeset
1303
6b9cec830d72 [project @ 2006-05-03 19:32:46 by dbateman]
dbateman
parents: 5775
diff changeset
1304 octave_idx_type nr = rows ();
6b9cec830d72 [project @ 2006-05-03 19:32:46 by dbateman]
dbateman
parents: 5775
diff changeset
1305 octave_idx_type nc = cols ();
6b9cec830d72 [project @ 2006-05-03 19:32:46 by dbateman]
dbateman
parents: 5775
diff changeset
1306
6b9cec830d72 [project @ 2006-05-03 19:32:46 by dbateman]
dbateman
parents: 5775
diff changeset
1307 if (nr == 0 || nc == 0 || nr != b.rows ())
6b9cec830d72 [project @ 2006-05-03 19:32:46 by dbateman]
dbateman
parents: 5775
diff changeset
1308 (*current_liboctave_error_handler)
6b9cec830d72 [project @ 2006-05-03 19:32:46 by dbateman]
dbateman
parents: 5775
diff changeset
1309 ("matrix dimension mismatch solution of linear equations");
6b9cec830d72 [project @ 2006-05-03 19:32:46 by dbateman]
dbateman
parents: 5775
diff changeset
1310 else
6b9cec830d72 [project @ 2006-05-03 19:32:46 by dbateman]
dbateman
parents: 5775
diff changeset
1311 {
6b9cec830d72 [project @ 2006-05-03 19:32:46 by dbateman]
dbateman
parents: 5775
diff changeset
1312 volatile int typ = mattype.type ();
6b9cec830d72 [project @ 2006-05-03 19:32:46 by dbateman]
dbateman
parents: 5775
diff changeset
1313
6b9cec830d72 [project @ 2006-05-03 19:32:46 by dbateman]
dbateman
parents: 5775
diff changeset
1314 if (typ == MatrixType::Permuted_Lower ||
6b9cec830d72 [project @ 2006-05-03 19:32:46 by dbateman]
dbateman
parents: 5775
diff changeset
1315 typ == MatrixType::Lower)
6b9cec830d72 [project @ 2006-05-03 19:32:46 by dbateman]
dbateman
parents: 5775
diff changeset
1316 {
6b9cec830d72 [project @ 2006-05-03 19:32:46 by dbateman]
dbateman
parents: 5775
diff changeset
1317 octave_idx_type b_nc = b.cols ();
6b9cec830d72 [project @ 2006-05-03 19:32:46 by dbateman]
dbateman
parents: 5775
diff changeset
1318 rcond = 1.;
6b9cec830d72 [project @ 2006-05-03 19:32:46 by dbateman]
dbateman
parents: 5775
diff changeset
1319 info = 0;
6b9cec830d72 [project @ 2006-05-03 19:32:46 by dbateman]
dbateman
parents: 5775
diff changeset
1320
6b9cec830d72 [project @ 2006-05-03 19:32:46 by dbateman]
dbateman
parents: 5775
diff changeset
1321 if (typ == MatrixType::Permuted_Lower)
6b9cec830d72 [project @ 2006-05-03 19:32:46 by dbateman]
dbateman
parents: 5775
diff changeset
1322 {
6b9cec830d72 [project @ 2006-05-03 19:32:46 by dbateman]
dbateman
parents: 5775
diff changeset
1323 (*current_liboctave_error_handler)
6b9cec830d72 [project @ 2006-05-03 19:32:46 by dbateman]
dbateman
parents: 5775
diff changeset
1324 ("Permuted triangular matrix not implemented");
6b9cec830d72 [project @ 2006-05-03 19:32:46 by dbateman]
dbateman
parents: 5775
diff changeset
1325 }
6b9cec830d72 [project @ 2006-05-03 19:32:46 by dbateman]
dbateman
parents: 5775
diff changeset
1326 else
6b9cec830d72 [project @ 2006-05-03 19:32:46 by dbateman]
dbateman
parents: 5775
diff changeset
1327 {
6b9cec830d72 [project @ 2006-05-03 19:32:46 by dbateman]
dbateman
parents: 5775
diff changeset
1328 const double *tmp_data = fortran_vec ();
6b9cec830d72 [project @ 2006-05-03 19:32:46 by dbateman]
dbateman
parents: 5775
diff changeset
1329
6b9cec830d72 [project @ 2006-05-03 19:32:46 by dbateman]
dbateman
parents: 5775
diff changeset
1330 if (calc_cond)
6b9cec830d72 [project @ 2006-05-03 19:32:46 by dbateman]
dbateman
parents: 5775
diff changeset
1331 {
6b9cec830d72 [project @ 2006-05-03 19:32:46 by dbateman]
dbateman
parents: 5775
diff changeset
1332 char norm = '1';
6b9cec830d72 [project @ 2006-05-03 19:32:46 by dbateman]
dbateman
parents: 5775
diff changeset
1333 char uplo = 'L';
6b9cec830d72 [project @ 2006-05-03 19:32:46 by dbateman]
dbateman
parents: 5775
diff changeset
1334 char dia = 'N';
6b9cec830d72 [project @ 2006-05-03 19:32:46 by dbateman]
dbateman
parents: 5775
diff changeset
1335
6b9cec830d72 [project @ 2006-05-03 19:32:46 by dbateman]
dbateman
parents: 5775
diff changeset
1336 Array<double> z (3 * nc);
6b9cec830d72 [project @ 2006-05-03 19:32:46 by dbateman]
dbateman
parents: 5775
diff changeset
1337 double *pz = z.fortran_vec ();
6b9cec830d72 [project @ 2006-05-03 19:32:46 by dbateman]
dbateman
parents: 5775
diff changeset
1338 Array<octave_idx_type> iz (nc);
6b9cec830d72 [project @ 2006-05-03 19:32:46 by dbateman]
dbateman
parents: 5775
diff changeset
1339 octave_idx_type *piz = iz.fortran_vec ();
6b9cec830d72 [project @ 2006-05-03 19:32:46 by dbateman]
dbateman
parents: 5775
diff changeset
1340
6b9cec830d72 [project @ 2006-05-03 19:32:46 by dbateman]
dbateman
parents: 5775
diff changeset
1341 F77_XFCN (dtrcon, DTRCON, (F77_CONST_CHAR_ARG2 (&norm, 1),
6b9cec830d72 [project @ 2006-05-03 19:32:46 by dbateman]
dbateman
parents: 5775
diff changeset
1342 F77_CONST_CHAR_ARG2 (&uplo, 1),
6b9cec830d72 [project @ 2006-05-03 19:32:46 by dbateman]
dbateman
parents: 5775
diff changeset
1343 F77_CONST_CHAR_ARG2 (&dia, 1),
6b9cec830d72 [project @ 2006-05-03 19:32:46 by dbateman]
dbateman
parents: 5775
diff changeset
1344 nr, tmp_data, nr, rcond,
6b9cec830d72 [project @ 2006-05-03 19:32:46 by dbateman]
dbateman
parents: 5775
diff changeset
1345 pz, piz, info
6b9cec830d72 [project @ 2006-05-03 19:32:46 by dbateman]
dbateman
parents: 5775
diff changeset
1346 F77_CHAR_ARG_LEN (1)
6b9cec830d72 [project @ 2006-05-03 19:32:46 by dbateman]
dbateman
parents: 5775
diff changeset
1347 F77_CHAR_ARG_LEN (1)
6b9cec830d72 [project @ 2006-05-03 19:32:46 by dbateman]
dbateman
parents: 5775
diff changeset
1348 F77_CHAR_ARG_LEN (1)));
6b9cec830d72 [project @ 2006-05-03 19:32:46 by dbateman]
dbateman
parents: 5775
diff changeset
1349
6b9cec830d72 [project @ 2006-05-03 19:32:46 by dbateman]
dbateman
parents: 5775
diff changeset
1350 if (f77_exception_encountered)
6b9cec830d72 [project @ 2006-05-03 19:32:46 by dbateman]
dbateman
parents: 5775
diff changeset
1351 (*current_liboctave_error_handler)
6b9cec830d72 [project @ 2006-05-03 19:32:46 by dbateman]
dbateman
parents: 5775
diff changeset
1352 ("unrecoverable error in dtrcon");
6b9cec830d72 [project @ 2006-05-03 19:32:46 by dbateman]
dbateman
parents: 5775
diff changeset
1353
6b9cec830d72 [project @ 2006-05-03 19:32:46 by dbateman]
dbateman
parents: 5775
diff changeset
1354 if (info != 0)
6b9cec830d72 [project @ 2006-05-03 19:32:46 by dbateman]
dbateman
parents: 5775
diff changeset
1355 info = -2;
6b9cec830d72 [project @ 2006-05-03 19:32:46 by dbateman]
dbateman
parents: 5775
diff changeset
1356
6b9cec830d72 [project @ 2006-05-03 19:32:46 by dbateman]
dbateman
parents: 5775
diff changeset
1357 volatile double rcond_plus_one = rcond + 1.0;
6b9cec830d72 [project @ 2006-05-03 19:32:46 by dbateman]
dbateman
parents: 5775
diff changeset
1358
6b9cec830d72 [project @ 2006-05-03 19:32:46 by dbateman]
dbateman
parents: 5775
diff changeset
1359 if (rcond_plus_one == 1.0 || xisnan (rcond))
6b9cec830d72 [project @ 2006-05-03 19:32:46 by dbateman]
dbateman
parents: 5775
diff changeset
1360 {
6b9cec830d72 [project @ 2006-05-03 19:32:46 by dbateman]
dbateman
parents: 5775
diff changeset
1361 info = -2;
6b9cec830d72 [project @ 2006-05-03 19:32:46 by dbateman]
dbateman
parents: 5775
diff changeset
1362
6b9cec830d72 [project @ 2006-05-03 19:32:46 by dbateman]
dbateman
parents: 5775
diff changeset
1363 if (sing_handler)
6b9cec830d72 [project @ 2006-05-03 19:32:46 by dbateman]
dbateman
parents: 5775
diff changeset
1364 sing_handler (rcond);
6b9cec830d72 [project @ 2006-05-03 19:32:46 by dbateman]
dbateman
parents: 5775
diff changeset
1365 else
6b9cec830d72 [project @ 2006-05-03 19:32:46 by dbateman]
dbateman
parents: 5775
diff changeset
1366 (*current_liboctave_error_handler)
6b9cec830d72 [project @ 2006-05-03 19:32:46 by dbateman]
dbateman
parents: 5775
diff changeset
1367 ("matrix singular to machine precision, rcond = %g",
6b9cec830d72 [project @ 2006-05-03 19:32:46 by dbateman]
dbateman
parents: 5775
diff changeset
1368 rcond);
6b9cec830d72 [project @ 2006-05-03 19:32:46 by dbateman]
dbateman
parents: 5775
diff changeset
1369 }
6b9cec830d72 [project @ 2006-05-03 19:32:46 by dbateman]
dbateman
parents: 5775
diff changeset
1370 }
6b9cec830d72 [project @ 2006-05-03 19:32:46 by dbateman]
dbateman
parents: 5775
diff changeset
1371
6b9cec830d72 [project @ 2006-05-03 19:32:46 by dbateman]
dbateman
parents: 5775
diff changeset
1372 if (info == 0)
6b9cec830d72 [project @ 2006-05-03 19:32:46 by dbateman]
dbateman
parents: 5775
diff changeset
1373 {
6b9cec830d72 [project @ 2006-05-03 19:32:46 by dbateman]
dbateman
parents: 5775
diff changeset
1374 retval = b;
6b9cec830d72 [project @ 2006-05-03 19:32:46 by dbateman]
dbateman
parents: 5775
diff changeset
1375 double *result = retval.fortran_vec ();
6b9cec830d72 [project @ 2006-05-03 19:32:46 by dbateman]
dbateman
parents: 5775
diff changeset
1376
6b9cec830d72 [project @ 2006-05-03 19:32:46 by dbateman]
dbateman
parents: 5775
diff changeset
1377 char uplo = 'L';
6b9cec830d72 [project @ 2006-05-03 19:32:46 by dbateman]
dbateman
parents: 5775
diff changeset
1378 char trans = 'N';
6b9cec830d72 [project @ 2006-05-03 19:32:46 by dbateman]
dbateman
parents: 5775
diff changeset
1379 char dia = 'N';
6b9cec830d72 [project @ 2006-05-03 19:32:46 by dbateman]
dbateman
parents: 5775
diff changeset
1380
6b9cec830d72 [project @ 2006-05-03 19:32:46 by dbateman]
dbateman
parents: 5775
diff changeset
1381 F77_XFCN (dtrtrs, DTRTRS, (F77_CONST_CHAR_ARG2 (&uplo, 1),
6b9cec830d72 [project @ 2006-05-03 19:32:46 by dbateman]
dbateman
parents: 5775
diff changeset
1382 F77_CONST_CHAR_ARG2 (&trans, 1),
6b9cec830d72 [project @ 2006-05-03 19:32:46 by dbateman]
dbateman
parents: 5775
diff changeset
1383 F77_CONST_CHAR_ARG2 (&dia, 1),
6b9cec830d72 [project @ 2006-05-03 19:32:46 by dbateman]
dbateman
parents: 5775
diff changeset
1384 nr, b_nc, tmp_data, nr,
6b9cec830d72 [project @ 2006-05-03 19:32:46 by dbateman]
dbateman
parents: 5775
diff changeset
1385 result, nr, info
6b9cec830d72 [project @ 2006-05-03 19:32:46 by dbateman]
dbateman
parents: 5775
diff changeset
1386 F77_CHAR_ARG_LEN (1)
6b9cec830d72 [project @ 2006-05-03 19:32:46 by dbateman]
dbateman
parents: 5775
diff changeset
1387 F77_CHAR_ARG_LEN (1)
6b9cec830d72 [project @ 2006-05-03 19:32:46 by dbateman]
dbateman
parents: 5775
diff changeset
1388 F77_CHAR_ARG_LEN (1)));
6b9cec830d72 [project @ 2006-05-03 19:32:46 by dbateman]
dbateman
parents: 5775
diff changeset
1389
6b9cec830d72 [project @ 2006-05-03 19:32:46 by dbateman]
dbateman
parents: 5775
diff changeset
1390 if (f77_exception_encountered)
6b9cec830d72 [project @ 2006-05-03 19:32:46 by dbateman]
dbateman
parents: 5775
diff changeset
1391 (*current_liboctave_error_handler)
6b9cec830d72 [project @ 2006-05-03 19:32:46 by dbateman]
dbateman
parents: 5775
diff changeset
1392 ("unrecoverable error in dtrtrs");
6b9cec830d72 [project @ 2006-05-03 19:32:46 by dbateman]
dbateman
parents: 5775
diff changeset
1393 }
6b9cec830d72 [project @ 2006-05-03 19:32:46 by dbateman]
dbateman
parents: 5775
diff changeset
1394 }
6b9cec830d72 [project @ 2006-05-03 19:32:46 by dbateman]
dbateman
parents: 5775
diff changeset
1395 }
6b9cec830d72 [project @ 2006-05-03 19:32:46 by dbateman]
dbateman
parents: 5775
diff changeset
1396 else
6b9cec830d72 [project @ 2006-05-03 19:32:46 by dbateman]
dbateman
parents: 5775
diff changeset
1397 (*current_liboctave_error_handler) ("incorrect matrix type");
6b9cec830d72 [project @ 2006-05-03 19:32:46 by dbateman]
dbateman
parents: 5775
diff changeset
1398 }
6b9cec830d72 [project @ 2006-05-03 19:32:46 by dbateman]
dbateman
parents: 5775
diff changeset
1399
6b9cec830d72 [project @ 2006-05-03 19:32:46 by dbateman]
dbateman
parents: 5775
diff changeset
1400 return retval;
6b9cec830d72 [project @ 2006-05-03 19:32:46 by dbateman]
dbateman
parents: 5775
diff changeset
1401 }
6b9cec830d72 [project @ 2006-05-03 19:32:46 by dbateman]
dbateman
parents: 5775
diff changeset
1402
6b9cec830d72 [project @ 2006-05-03 19:32:46 by dbateman]
dbateman
parents: 5775
diff changeset
1403 Matrix
6b9cec830d72 [project @ 2006-05-03 19:32:46 by dbateman]
dbateman
parents: 5775
diff changeset
1404 Matrix::fsolve (MatrixType &mattype, const Matrix& b, octave_idx_type& info,
6b9cec830d72 [project @ 2006-05-03 19:32:46 by dbateman]
dbateman
parents: 5775
diff changeset
1405 double& rcond, solve_singularity_handler sing_handler,
6b9cec830d72 [project @ 2006-05-03 19:32:46 by dbateman]
dbateman
parents: 5775
diff changeset
1406 bool calc_cond) const
6b9cec830d72 [project @ 2006-05-03 19:32:46 by dbateman]
dbateman
parents: 5775
diff changeset
1407 {
6b9cec830d72 [project @ 2006-05-03 19:32:46 by dbateman]
dbateman
parents: 5775
diff changeset
1408 Matrix retval;
6b9cec830d72 [project @ 2006-05-03 19:32:46 by dbateman]
dbateman
parents: 5775
diff changeset
1409
6b9cec830d72 [project @ 2006-05-03 19:32:46 by dbateman]
dbateman
parents: 5775
diff changeset
1410 octave_idx_type nr = rows ();
6b9cec830d72 [project @ 2006-05-03 19:32:46 by dbateman]
dbateman
parents: 5775
diff changeset
1411 octave_idx_type nc = cols ();
6b9cec830d72 [project @ 2006-05-03 19:32:46 by dbateman]
dbateman
parents: 5775
diff changeset
1412
6b9cec830d72 [project @ 2006-05-03 19:32:46 by dbateman]
dbateman
parents: 5775
diff changeset
1413 if (nr == 0 || nc == 0 || nr != nc || nr != b.rows ())
6b9cec830d72 [project @ 2006-05-03 19:32:46 by dbateman]
dbateman
parents: 5775
diff changeset
1414 (*current_liboctave_error_handler)
6b9cec830d72 [project @ 2006-05-03 19:32:46 by dbateman]
dbateman
parents: 5775
diff changeset
1415 ("matrix dimension mismatch solution of linear equations");
6b9cec830d72 [project @ 2006-05-03 19:32:46 by dbateman]
dbateman
parents: 5775
diff changeset
1416 else
6b9cec830d72 [project @ 2006-05-03 19:32:46 by dbateman]
dbateman
parents: 5775
diff changeset
1417 {
6b9cec830d72 [project @ 2006-05-03 19:32:46 by dbateman]
dbateman
parents: 5775
diff changeset
1418 volatile int typ = mattype.type ();
6b9cec830d72 [project @ 2006-05-03 19:32:46 by dbateman]
dbateman
parents: 5775
diff changeset
1419
6b9cec830d72 [project @ 2006-05-03 19:32:46 by dbateman]
dbateman
parents: 5775
diff changeset
1420 // Calculate the norm of the matrix, for later use.
6b9cec830d72 [project @ 2006-05-03 19:32:46 by dbateman]
dbateman
parents: 5775
diff changeset
1421 double anorm = -1.;
6b9cec830d72 [project @ 2006-05-03 19:32:46 by dbateman]
dbateman
parents: 5775
diff changeset
1422
6b9cec830d72 [project @ 2006-05-03 19:32:46 by dbateman]
dbateman
parents: 5775
diff changeset
1423 if (typ == MatrixType::Hermitian)
6b9cec830d72 [project @ 2006-05-03 19:32:46 by dbateman]
dbateman
parents: 5775
diff changeset
1424 {
6b9cec830d72 [project @ 2006-05-03 19:32:46 by dbateman]
dbateman
parents: 5775
diff changeset
1425 info = 0;
6b9cec830d72 [project @ 2006-05-03 19:32:46 by dbateman]
dbateman
parents: 5775
diff changeset
1426 char job = 'L';
6b9cec830d72 [project @ 2006-05-03 19:32:46 by dbateman]
dbateman
parents: 5775
diff changeset
1427 Matrix atmp = *this;
6b9cec830d72 [project @ 2006-05-03 19:32:46 by dbateman]
dbateman
parents: 5775
diff changeset
1428 double *tmp_data = atmp.fortran_vec ();
6b9cec830d72 [project @ 2006-05-03 19:32:46 by dbateman]
dbateman
parents: 5775
diff changeset
1429 anorm = atmp.abs().sum().row(static_cast<octave_idx_type>(0)).max();
6b9cec830d72 [project @ 2006-05-03 19:32:46 by dbateman]
dbateman
parents: 5775
diff changeset
1430
6b9cec830d72 [project @ 2006-05-03 19:32:46 by dbateman]
dbateman
parents: 5775
diff changeset
1431 F77_XFCN (dpotrf, DPOTRF, (F77_CONST_CHAR_ARG2 (&job, 1), nr,
6b9cec830d72 [project @ 2006-05-03 19:32:46 by dbateman]
dbateman
parents: 5775
diff changeset
1432 tmp_data, nr, info
6b9cec830d72 [project @ 2006-05-03 19:32:46 by dbateman]
dbateman
parents: 5775
diff changeset
1433 F77_CHAR_ARG_LEN (1)));
6b9cec830d72 [project @ 2006-05-03 19:32:46 by dbateman]
dbateman
parents: 5775
diff changeset
1434
6b9cec830d72 [project @ 2006-05-03 19:32:46 by dbateman]
dbateman
parents: 5775
diff changeset
1435 if (f77_exception_encountered)
6b9cec830d72 [project @ 2006-05-03 19:32:46 by dbateman]
dbateman
parents: 5775
diff changeset
1436 (*current_liboctave_error_handler)
6b9cec830d72 [project @ 2006-05-03 19:32:46 by dbateman]
dbateman
parents: 5775
diff changeset
1437 ("unrecoverable error in dpotrf");
6b9cec830d72 [project @ 2006-05-03 19:32:46 by dbateman]
dbateman
parents: 5775
diff changeset
1438 else
6b9cec830d72 [project @ 2006-05-03 19:32:46 by dbateman]
dbateman
parents: 5775
diff changeset
1439 {
6b9cec830d72 [project @ 2006-05-03 19:32:46 by dbateman]
dbateman
parents: 5775
diff changeset
1440 // Throw-away extra info LAPACK gives so as to not change output.
6b9cec830d72 [project @ 2006-05-03 19:32:46 by dbateman]
dbateman
parents: 5775
diff changeset
1441 rcond = 0.0;
6b9cec830d72 [project @ 2006-05-03 19:32:46 by dbateman]
dbateman
parents: 5775
diff changeset
1442 if (info != 0)
6b9cec830d72 [project @ 2006-05-03 19:32:46 by dbateman]
dbateman
parents: 5775
diff changeset
1443 {
6b9cec830d72 [project @ 2006-05-03 19:32:46 by dbateman]
dbateman
parents: 5775
diff changeset
1444 info = -2;
6b9cec830d72 [project @ 2006-05-03 19:32:46 by dbateman]
dbateman
parents: 5775
diff changeset
1445
6b9cec830d72 [project @ 2006-05-03 19:32:46 by dbateman]
dbateman
parents: 5775
diff changeset
1446 mattype.mark_as_unsymmetric ();
6b9cec830d72 [project @ 2006-05-03 19:32:46 by dbateman]
dbateman
parents: 5775
diff changeset
1447 typ = MatrixType::Full;
6b9cec830d72 [project @ 2006-05-03 19:32:46 by dbateman]
dbateman
parents: 5775
diff changeset
1448 }
6b9cec830d72 [project @ 2006-05-03 19:32:46 by dbateman]
dbateman
parents: 5775
diff changeset
1449 else
6b9cec830d72 [project @ 2006-05-03 19:32:46 by dbateman]
dbateman
parents: 5775
diff changeset
1450 {
6b9cec830d72 [project @ 2006-05-03 19:32:46 by dbateman]
dbateman
parents: 5775
diff changeset
1451 if (calc_cond)
6b9cec830d72 [project @ 2006-05-03 19:32:46 by dbateman]
dbateman
parents: 5775
diff changeset
1452 {
6b9cec830d72 [project @ 2006-05-03 19:32:46 by dbateman]
dbateman
parents: 5775
diff changeset
1453 Array<double> z (3 * nc);
6b9cec830d72 [project @ 2006-05-03 19:32:46 by dbateman]
dbateman
parents: 5775
diff changeset
1454 double *pz = z.fortran_vec ();
6b9cec830d72 [project @ 2006-05-03 19:32:46 by dbateman]
dbateman
parents: 5775
diff changeset
1455 Array<octave_idx_type> iz (nc);
6b9cec830d72 [project @ 2006-05-03 19:32:46 by dbateman]
dbateman
parents: 5775
diff changeset
1456 octave_idx_type *piz = iz.fortran_vec ();
6b9cec830d72 [project @ 2006-05-03 19:32:46 by dbateman]
dbateman
parents: 5775
diff changeset
1457
6b9cec830d72 [project @ 2006-05-03 19:32:46 by dbateman]
dbateman
parents: 5775
diff changeset
1458 F77_XFCN (dpocon, DPOCON, (F77_CONST_CHAR_ARG2 (&job, 1),
6b9cec830d72 [project @ 2006-05-03 19:32:46 by dbateman]
dbateman
parents: 5775
diff changeset
1459 nr, tmp_data, nr, anorm,
6b9cec830d72 [project @ 2006-05-03 19:32:46 by dbateman]
dbateman
parents: 5775
diff changeset
1460 rcond, pz, piz, info
6b9cec830d72 [project @ 2006-05-03 19:32:46 by dbateman]
dbateman
parents: 5775
diff changeset
1461 F77_CHAR_ARG_LEN (1)));
6b9cec830d72 [project @ 2006-05-03 19:32:46 by dbateman]
dbateman
parents: 5775
diff changeset
1462
6b9cec830d72 [project @ 2006-05-03 19:32:46 by dbateman]
dbateman
parents: 5775
diff changeset
1463 if (f77_exception_encountered)
6b9cec830d72 [project @ 2006-05-03 19:32:46 by dbateman]
dbateman
parents: 5775
diff changeset
1464 (*current_liboctave_error_handler)
6b9cec830d72 [project @ 2006-05-03 19:32:46 by dbateman]
dbateman
parents: 5775
diff changeset
1465 ("unrecoverable error in dpocon");
6b9cec830d72 [project @ 2006-05-03 19:32:46 by dbateman]
dbateman
parents: 5775
diff changeset
1466
6b9cec830d72 [project @ 2006-05-03 19:32:46 by dbateman]
dbateman
parents: 5775
diff changeset
1467 if (info != 0)
6b9cec830d72 [project @ 2006-05-03 19:32:46 by dbateman]
dbateman
parents: 5775
diff changeset
1468 info = -2;
6b9cec830d72 [project @ 2006-05-03 19:32:46 by dbateman]
dbateman
parents: 5775
diff changeset
1469
6b9cec830d72 [project @ 2006-05-03 19:32:46 by dbateman]
dbateman
parents: 5775
diff changeset
1470 volatile double rcond_plus_one = rcond + 1.0;
6b9cec830d72 [project @ 2006-05-03 19:32:46 by dbateman]
dbateman
parents: 5775
diff changeset
1471
6b9cec830d72 [project @ 2006-05-03 19:32:46 by dbateman]
dbateman
parents: 5775
diff changeset
1472 if (rcond_plus_one == 1.0 || xisnan (rcond))
6b9cec830d72 [project @ 2006-05-03 19:32:46 by dbateman]
dbateman
parents: 5775
diff changeset
1473 {
6b9cec830d72 [project @ 2006-05-03 19:32:46 by dbateman]
dbateman
parents: 5775
diff changeset
1474 info = -2;
6b9cec830d72 [project @ 2006-05-03 19:32:46 by dbateman]
dbateman
parents: 5775
diff changeset
1475
6b9cec830d72 [project @ 2006-05-03 19:32:46 by dbateman]
dbateman
parents: 5775
diff changeset
1476 if (sing_handler)
6b9cec830d72 [project @ 2006-05-03 19:32:46 by dbateman]
dbateman
parents: 5775
diff changeset
1477 sing_handler (rcond);
6b9cec830d72 [project @ 2006-05-03 19:32:46 by dbateman]
dbateman
parents: 5775
diff changeset
1478 else
6b9cec830d72 [project @ 2006-05-03 19:32:46 by dbateman]
dbateman
parents: 5775
diff changeset
1479 (*current_liboctave_error_handler)
6b9cec830d72 [project @ 2006-05-03 19:32:46 by dbateman]
dbateman
parents: 5775
diff changeset
1480 ("matrix singular to machine precision, rcond = %g",
6b9cec830d72 [project @ 2006-05-03 19:32:46 by dbateman]
dbateman
parents: 5775
diff changeset
1481 rcond);
6b9cec830d72 [project @ 2006-05-03 19:32:46 by dbateman]
dbateman
parents: 5775
diff changeset
1482 }
6b9cec830d72 [project @ 2006-05-03 19:32:46 by dbateman]
dbateman
parents: 5775
diff changeset
1483 }
6b9cec830d72 [project @ 2006-05-03 19:32:46 by dbateman]
dbateman
parents: 5775
diff changeset
1484
6b9cec830d72 [project @ 2006-05-03 19:32:46 by dbateman]
dbateman
parents: 5775
diff changeset
1485 if (info == 0)
6b9cec830d72 [project @ 2006-05-03 19:32:46 by dbateman]
dbateman
parents: 5775
diff changeset
1486 {
6b9cec830d72 [project @ 2006-05-03 19:32:46 by dbateman]
dbateman
parents: 5775
diff changeset
1487 retval = b;
6b9cec830d72 [project @ 2006-05-03 19:32:46 by dbateman]
dbateman
parents: 5775
diff changeset
1488 double *result = retval.fortran_vec ();
6b9cec830d72 [project @ 2006-05-03 19:32:46 by dbateman]
dbateman
parents: 5775
diff changeset
1489
6b9cec830d72 [project @ 2006-05-03 19:32:46 by dbateman]
dbateman
parents: 5775
diff changeset
1490 octave_idx_type b_nc = b.cols ();
6b9cec830d72 [project @ 2006-05-03 19:32:46 by dbateman]
dbateman
parents: 5775
diff changeset
1491
6b9cec830d72 [project @ 2006-05-03 19:32:46 by dbateman]
dbateman
parents: 5775
diff changeset
1492 F77_XFCN (dpotrs, DPOTRS, (F77_CONST_CHAR_ARG2 (&job, 1),
6b9cec830d72 [project @ 2006-05-03 19:32:46 by dbateman]
dbateman
parents: 5775
diff changeset
1493 nr, b_nc, tmp_data, nr,
6b9cec830d72 [project @ 2006-05-03 19:32:46 by dbateman]
dbateman
parents: 5775
diff changeset
1494 result, b.rows(), info
6b9cec830d72 [project @ 2006-05-03 19:32:46 by dbateman]
dbateman
parents: 5775
diff changeset
1495 F77_CHAR_ARG_LEN (1)));
6b9cec830d72 [project @ 2006-05-03 19:32:46 by dbateman]
dbateman
parents: 5775
diff changeset
1496
6b9cec830d72 [project @ 2006-05-03 19:32:46 by dbateman]
dbateman
parents: 5775
diff changeset
1497 if (f77_exception_encountered)
6b9cec830d72 [project @ 2006-05-03 19:32:46 by dbateman]
dbateman
parents: 5775
diff changeset
1498 (*current_liboctave_error_handler)
6b9cec830d72 [project @ 2006-05-03 19:32:46 by dbateman]
dbateman
parents: 5775
diff changeset
1499 ("unrecoverable error in dpotrs");
6b9cec830d72 [project @ 2006-05-03 19:32:46 by dbateman]
dbateman
parents: 5775
diff changeset
1500 }
6b9cec830d72 [project @ 2006-05-03 19:32:46 by dbateman]
dbateman
parents: 5775
diff changeset
1501 else
6b9cec830d72 [project @ 2006-05-03 19:32:46 by dbateman]
dbateman
parents: 5775
diff changeset
1502 {
6b9cec830d72 [project @ 2006-05-03 19:32:46 by dbateman]
dbateman
parents: 5775
diff changeset
1503 mattype.mark_as_unsymmetric ();
6b9cec830d72 [project @ 2006-05-03 19:32:46 by dbateman]
dbateman
parents: 5775
diff changeset
1504 typ = MatrixType::Full;
6b9cec830d72 [project @ 2006-05-03 19:32:46 by dbateman]
dbateman
parents: 5775
diff changeset
1505 }
6b9cec830d72 [project @ 2006-05-03 19:32:46 by dbateman]
dbateman
parents: 5775
diff changeset
1506 }
6b9cec830d72 [project @ 2006-05-03 19:32:46 by dbateman]
dbateman
parents: 5775
diff changeset
1507 }
6b9cec830d72 [project @ 2006-05-03 19:32:46 by dbateman]
dbateman
parents: 5775
diff changeset
1508 }
6b9cec830d72 [project @ 2006-05-03 19:32:46 by dbateman]
dbateman
parents: 5775
diff changeset
1509
6b9cec830d72 [project @ 2006-05-03 19:32:46 by dbateman]
dbateman
parents: 5775
diff changeset
1510 if (typ == MatrixType::Full)
6b9cec830d72 [project @ 2006-05-03 19:32:46 by dbateman]
dbateman
parents: 5775
diff changeset
1511 {
6b9cec830d72 [project @ 2006-05-03 19:32:46 by dbateman]
dbateman
parents: 5775
diff changeset
1512 info = 0;
6b9cec830d72 [project @ 2006-05-03 19:32:46 by dbateman]
dbateman
parents: 5775
diff changeset
1513
6b9cec830d72 [project @ 2006-05-03 19:32:46 by dbateman]
dbateman
parents: 5775
diff changeset
1514 Array<octave_idx_type> ipvt (nr);
6b9cec830d72 [project @ 2006-05-03 19:32:46 by dbateman]
dbateman
parents: 5775
diff changeset
1515 octave_idx_type *pipvt = ipvt.fortran_vec ();
6b9cec830d72 [project @ 2006-05-03 19:32:46 by dbateman]
dbateman
parents: 5775
diff changeset
1516
6b9cec830d72 [project @ 2006-05-03 19:32:46 by dbateman]
dbateman
parents: 5775
diff changeset
1517 Matrix atmp = *this;
6b9cec830d72 [project @ 2006-05-03 19:32:46 by dbateman]
dbateman
parents: 5775
diff changeset
1518 double *tmp_data = atmp.fortran_vec ();
6b9cec830d72 [project @ 2006-05-03 19:32:46 by dbateman]
dbateman
parents: 5775
diff changeset
1519 if(anorm < 0.)
6b9cec830d72 [project @ 2006-05-03 19:32:46 by dbateman]
dbateman
parents: 5775
diff changeset
1520 anorm = atmp.abs().sum().row(static_cast<octave_idx_type>(0)).max();
6b9cec830d72 [project @ 2006-05-03 19:32:46 by dbateman]
dbateman
parents: 5775
diff changeset
1521
6b9cec830d72 [project @ 2006-05-03 19:32:46 by dbateman]
dbateman
parents: 5775
diff changeset
1522 Array<double> z (4 * nc);
6b9cec830d72 [project @ 2006-05-03 19:32:46 by dbateman]
dbateman
parents: 5775
diff changeset
1523 double *pz = z.fortran_vec ();
6b9cec830d72 [project @ 2006-05-03 19:32:46 by dbateman]
dbateman
parents: 5775
diff changeset
1524 Array<octave_idx_type> iz (nc);
6b9cec830d72 [project @ 2006-05-03 19:32:46 by dbateman]
dbateman
parents: 5775
diff changeset
1525 octave_idx_type *piz = iz.fortran_vec ();
6b9cec830d72 [project @ 2006-05-03 19:32:46 by dbateman]
dbateman
parents: 5775
diff changeset
1526
6b9cec830d72 [project @ 2006-05-03 19:32:46 by dbateman]
dbateman
parents: 5775
diff changeset
1527 F77_XFCN (dgetrf, DGETRF, (nr, nr, tmp_data, nr, pipvt, info));
6b9cec830d72 [project @ 2006-05-03 19:32:46 by dbateman]
dbateman
parents: 5775
diff changeset
1528
6b9cec830d72 [project @ 2006-05-03 19:32:46 by dbateman]
dbateman
parents: 5775
diff changeset
1529 if (f77_exception_encountered)
6b9cec830d72 [project @ 2006-05-03 19:32:46 by dbateman]
dbateman
parents: 5775
diff changeset
1530 (*current_liboctave_error_handler)
6b9cec830d72 [project @ 2006-05-03 19:32:46 by dbateman]
dbateman
parents: 5775
diff changeset
1531 ("unrecoverable error in dgetrf");
6b9cec830d72 [project @ 2006-05-03 19:32:46 by dbateman]
dbateman
parents: 5775
diff changeset
1532 else
6b9cec830d72 [project @ 2006-05-03 19:32:46 by dbateman]
dbateman
parents: 5775
diff changeset
1533 {
6b9cec830d72 [project @ 2006-05-03 19:32:46 by dbateman]
dbateman
parents: 5775
diff changeset
1534 // Throw-away extra info LAPACK gives so as to not change output.
6b9cec830d72 [project @ 2006-05-03 19:32:46 by dbateman]
dbateman
parents: 5775
diff changeset
1535 rcond = 0.0;
6b9cec830d72 [project @ 2006-05-03 19:32:46 by dbateman]
dbateman
parents: 5775
diff changeset
1536 if (info != 0)
6b9cec830d72 [project @ 2006-05-03 19:32:46 by dbateman]
dbateman
parents: 5775
diff changeset
1537 {
6b9cec830d72 [project @ 2006-05-03 19:32:46 by dbateman]
dbateman
parents: 5775
diff changeset
1538 info = -2;
6b9cec830d72 [project @ 2006-05-03 19:32:46 by dbateman]
dbateman
parents: 5775
diff changeset
1539
6b9cec830d72 [project @ 2006-05-03 19:32:46 by dbateman]
dbateman
parents: 5775
diff changeset
1540 if (sing_handler)
6b9cec830d72 [project @ 2006-05-03 19:32:46 by dbateman]
dbateman
parents: 5775
diff changeset
1541 sing_handler (rcond);
6b9cec830d72 [project @ 2006-05-03 19:32:46 by dbateman]
dbateman
parents: 5775
diff changeset
1542 else
6b9cec830d72 [project @ 2006-05-03 19:32:46 by dbateman]
dbateman
parents: 5775
diff changeset
1543 (*current_liboctave_error_handler)
6b9cec830d72 [project @ 2006-05-03 19:32:46 by dbateman]
dbateman
parents: 5775
diff changeset
1544 ("matrix singular to machine precision");
6b9cec830d72 [project @ 2006-05-03 19:32:46 by dbateman]
dbateman
parents: 5775
diff changeset
1545
6b9cec830d72 [project @ 2006-05-03 19:32:46 by dbateman]
dbateman
parents: 5775
diff changeset
1546 mattype.mark_as_rectangular ();
6b9cec830d72 [project @ 2006-05-03 19:32:46 by dbateman]
dbateman
parents: 5775
diff changeset
1547 }
6b9cec830d72 [project @ 2006-05-03 19:32:46 by dbateman]
dbateman
parents: 5775
diff changeset
1548 else
6b9cec830d72 [project @ 2006-05-03 19:32:46 by dbateman]
dbateman
parents: 5775
diff changeset
1549 {
6b9cec830d72 [project @ 2006-05-03 19:32:46 by dbateman]
dbateman
parents: 5775
diff changeset
1550 if (calc_cond)
6b9cec830d72 [project @ 2006-05-03 19:32:46 by dbateman]
dbateman
parents: 5775
diff changeset
1551 {
6b9cec830d72 [project @ 2006-05-03 19:32:46 by dbateman]
dbateman
parents: 5775
diff changeset
1552 // Now calculate the condition number for
6b9cec830d72 [project @ 2006-05-03 19:32:46 by dbateman]
dbateman
parents: 5775
diff changeset
1553 // non-singular matrix.
6b9cec830d72 [project @ 2006-05-03 19:32:46 by dbateman]
dbateman
parents: 5775
diff changeset
1554 char job = '1';
6b9cec830d72 [project @ 2006-05-03 19:32:46 by dbateman]
dbateman
parents: 5775
diff changeset
1555 F77_XFCN (dgecon, DGECON, (F77_CONST_CHAR_ARG2 (&job, 1),
6b9cec830d72 [project @ 2006-05-03 19:32:46 by dbateman]
dbateman
parents: 5775
diff changeset
1556 nc, tmp_data, nr, anorm,
6b9cec830d72 [project @ 2006-05-03 19:32:46 by dbateman]
dbateman
parents: 5775
diff changeset
1557 rcond, pz, piz, info
6b9cec830d72 [project @ 2006-05-03 19:32:46 by dbateman]
dbateman
parents: 5775
diff changeset
1558 F77_CHAR_ARG_LEN (1)));
6b9cec830d72 [project @ 2006-05-03 19:32:46 by dbateman]
dbateman
parents: 5775
diff changeset
1559
6b9cec830d72 [project @ 2006-05-03 19:32:46 by dbateman]
dbateman
parents: 5775
diff changeset
1560 if (f77_exception_encountered)
6b9cec830d72 [project @ 2006-05-03 19:32:46 by dbateman]
dbateman
parents: 5775
diff changeset
1561 (*current_liboctave_error_handler)
6b9cec830d72 [project @ 2006-05-03 19:32:46 by dbateman]
dbateman
parents: 5775
diff changeset
1562 ("unrecoverable error in dgecon");
6b9cec830d72 [project @ 2006-05-03 19:32:46 by dbateman]
dbateman
parents: 5775
diff changeset
1563
6b9cec830d72 [project @ 2006-05-03 19:32:46 by dbateman]
dbateman
parents: 5775
diff changeset
1564 if (info != 0)
6b9cec830d72 [project @ 2006-05-03 19:32:46 by dbateman]
dbateman
parents: 5775
diff changeset
1565 info = -2;
6b9cec830d72 [project @ 2006-05-03 19:32:46 by dbateman]
dbateman
parents: 5775
diff changeset
1566
6b9cec830d72 [project @ 2006-05-03 19:32:46 by dbateman]
dbateman
parents: 5775
diff changeset
1567 volatile double rcond_plus_one = rcond + 1.0;
6b9cec830d72 [project @ 2006-05-03 19:32:46 by dbateman]
dbateman
parents: 5775
diff changeset
1568
6b9cec830d72 [project @ 2006-05-03 19:32:46 by dbateman]
dbateman
parents: 5775
diff changeset
1569 if (rcond_plus_one == 1.0 || xisnan (rcond))
6b9cec830d72 [project @ 2006-05-03 19:32:46 by dbateman]
dbateman
parents: 5775
diff changeset
1570 {
6b9cec830d72 [project @ 2006-05-03 19:32:46 by dbateman]
dbateman
parents: 5775
diff changeset
1571 info = -2;
6b9cec830d72 [project @ 2006-05-03 19:32:46 by dbateman]
dbateman
parents: 5775
diff changeset
1572
6b9cec830d72 [project @ 2006-05-03 19:32:46 by dbateman]
dbateman
parents: 5775
diff changeset
1573 if (sing_handler)
6b9cec830d72 [project @ 2006-05-03 19:32:46 by dbateman]
dbateman
parents: 5775
diff changeset
1574 sing_handler (rcond);
6b9cec830d72 [project @ 2006-05-03 19:32:46 by dbateman]
dbateman
parents: 5775
diff changeset
1575 else
6b9cec830d72 [project @ 2006-05-03 19:32:46 by dbateman]
dbateman
parents: 5775
diff changeset
1576 (*current_liboctave_error_handler)
6b9cec830d72 [project @ 2006-05-03 19:32:46 by dbateman]
dbateman
parents: 5775
diff changeset
1577 ("matrix singular to machine precision, rcond = %g",
6b9cec830d72 [project @ 2006-05-03 19:32:46 by dbateman]
dbateman
parents: 5775
diff changeset
1578 rcond);
6b9cec830d72 [project @ 2006-05-03 19:32:46 by dbateman]
dbateman
parents: 5775
diff changeset
1579 }
6b9cec830d72 [project @ 2006-05-03 19:32:46 by dbateman]
dbateman
parents: 5775
diff changeset
1580 }
6b9cec830d72 [project @ 2006-05-03 19:32:46 by dbateman]
dbateman
parents: 5775
diff changeset
1581
6b9cec830d72 [project @ 2006-05-03 19:32:46 by dbateman]
dbateman
parents: 5775
diff changeset
1582 if (info == 0)
6b9cec830d72 [project @ 2006-05-03 19:32:46 by dbateman]
dbateman
parents: 5775
diff changeset
1583 {
6b9cec830d72 [project @ 2006-05-03 19:32:46 by dbateman]
dbateman
parents: 5775
diff changeset
1584 retval = b;
6b9cec830d72 [project @ 2006-05-03 19:32:46 by dbateman]
dbateman
parents: 5775
diff changeset
1585 double *result = retval.fortran_vec ();
6b9cec830d72 [project @ 2006-05-03 19:32:46 by dbateman]
dbateman
parents: 5775
diff changeset
1586
6b9cec830d72 [project @ 2006-05-03 19:32:46 by dbateman]
dbateman
parents: 5775
diff changeset
1587 octave_idx_type b_nc = b.cols ();
6b9cec830d72 [project @ 2006-05-03 19:32:46 by dbateman]
dbateman
parents: 5775
diff changeset
1588
6b9cec830d72 [project @ 2006-05-03 19:32:46 by dbateman]
dbateman
parents: 5775
diff changeset
1589 char job = 'N';
6b9cec830d72 [project @ 2006-05-03 19:32:46 by dbateman]
dbateman
parents: 5775
diff changeset
1590 F77_XFCN (dgetrs, DGETRS, (F77_CONST_CHAR_ARG2 (&job, 1),
6b9cec830d72 [project @ 2006-05-03 19:32:46 by dbateman]
dbateman
parents: 5775
diff changeset
1591 nr, b_nc, tmp_data, nr,
6b9cec830d72 [project @ 2006-05-03 19:32:46 by dbateman]
dbateman
parents: 5775
diff changeset
1592 pipvt, result, b.rows(), info
6b9cec830d72 [project @ 2006-05-03 19:32:46 by dbateman]
dbateman
parents: 5775
diff changeset
1593 F77_CHAR_ARG_LEN (1)));
6b9cec830d72 [project @ 2006-05-03 19:32:46 by dbateman]
dbateman
parents: 5775
diff changeset
1594
6b9cec830d72 [project @ 2006-05-03 19:32:46 by dbateman]
dbateman
parents: 5775
diff changeset
1595 if (f77_exception_encountered)
6b9cec830d72 [project @ 2006-05-03 19:32:46 by dbateman]
dbateman
parents: 5775
diff changeset
1596 (*current_liboctave_error_handler)
6b9cec830d72 [project @ 2006-05-03 19:32:46 by dbateman]
dbateman
parents: 5775
diff changeset
1597 ("unrecoverable error in dgetrs");
6b9cec830d72 [project @ 2006-05-03 19:32:46 by dbateman]
dbateman
parents: 5775
diff changeset
1598 }
6b9cec830d72 [project @ 2006-05-03 19:32:46 by dbateman]
dbateman
parents: 5775
diff changeset
1599 else
6b9cec830d72 [project @ 2006-05-03 19:32:46 by dbateman]
dbateman
parents: 5775
diff changeset
1600 mattype.mark_as_rectangular ();
6b9cec830d72 [project @ 2006-05-03 19:32:46 by dbateman]
dbateman
parents: 5775
diff changeset
1601 }
6b9cec830d72 [project @ 2006-05-03 19:32:46 by dbateman]
dbateman
parents: 5775
diff changeset
1602 }
6b9cec830d72 [project @ 2006-05-03 19:32:46 by dbateman]
dbateman
parents: 5775
diff changeset
1603 }
6b9cec830d72 [project @ 2006-05-03 19:32:46 by dbateman]
dbateman
parents: 5775
diff changeset
1604 else if (typ != MatrixType::Hermitian)
6b9cec830d72 [project @ 2006-05-03 19:32:46 by dbateman]
dbateman
parents: 5775
diff changeset
1605 (*current_liboctave_error_handler) ("incorrect matrix type");
6b9cec830d72 [project @ 2006-05-03 19:32:46 by dbateman]
dbateman
parents: 5775
diff changeset
1606 }
6b9cec830d72 [project @ 2006-05-03 19:32:46 by dbateman]
dbateman
parents: 5775
diff changeset
1607
6b9cec830d72 [project @ 2006-05-03 19:32:46 by dbateman]
dbateman
parents: 5775
diff changeset
1608 return retval;
6b9cec830d72 [project @ 2006-05-03 19:32:46 by dbateman]
dbateman
parents: 5775
diff changeset
1609 }
6b9cec830d72 [project @ 2006-05-03 19:32:46 by dbateman]
dbateman
parents: 5775
diff changeset
1610
6b9cec830d72 [project @ 2006-05-03 19:32:46 by dbateman]
dbateman
parents: 5775
diff changeset
1611 Matrix
6b9cec830d72 [project @ 2006-05-03 19:32:46 by dbateman]
dbateman
parents: 5775
diff changeset
1612 Matrix::solve (MatrixType &typ, const Matrix& b) const
6b9cec830d72 [project @ 2006-05-03 19:32:46 by dbateman]
dbateman
parents: 5775
diff changeset
1613 {
6b9cec830d72 [project @ 2006-05-03 19:32:46 by dbateman]
dbateman
parents: 5775
diff changeset
1614 octave_idx_type info;
6b9cec830d72 [project @ 2006-05-03 19:32:46 by dbateman]
dbateman
parents: 5775
diff changeset
1615 double rcond;
6b9cec830d72 [project @ 2006-05-03 19:32:46 by dbateman]
dbateman
parents: 5775
diff changeset
1616 return solve (typ, b, info, rcond, 0);
6b9cec830d72 [project @ 2006-05-03 19:32:46 by dbateman]
dbateman
parents: 5775
diff changeset
1617 }
6b9cec830d72 [project @ 2006-05-03 19:32:46 by dbateman]
dbateman
parents: 5775
diff changeset
1618
6b9cec830d72 [project @ 2006-05-03 19:32:46 by dbateman]
dbateman
parents: 5775
diff changeset
1619 Matrix
6b9cec830d72 [project @ 2006-05-03 19:32:46 by dbateman]
dbateman
parents: 5775
diff changeset
1620 Matrix::solve (MatrixType &typ, const Matrix& b, octave_idx_type& info,
6b9cec830d72 [project @ 2006-05-03 19:32:46 by dbateman]
dbateman
parents: 5775
diff changeset
1621 double& rcond) const
6b9cec830d72 [project @ 2006-05-03 19:32:46 by dbateman]
dbateman
parents: 5775
diff changeset
1622 {
6b9cec830d72 [project @ 2006-05-03 19:32:46 by dbateman]
dbateman
parents: 5775
diff changeset
1623 return solve (typ, b, info, rcond, 0);
6b9cec830d72 [project @ 2006-05-03 19:32:46 by dbateman]
dbateman
parents: 5775
diff changeset
1624 }
6b9cec830d72 [project @ 2006-05-03 19:32:46 by dbateman]
dbateman
parents: 5775
diff changeset
1625
6b9cec830d72 [project @ 2006-05-03 19:32:46 by dbateman]
dbateman
parents: 5775
diff changeset
1626 Matrix
6b9cec830d72 [project @ 2006-05-03 19:32:46 by dbateman]
dbateman
parents: 5775
diff changeset
1627 Matrix::solve (MatrixType &mattype, const Matrix& b, octave_idx_type& info,
6b9cec830d72 [project @ 2006-05-03 19:32:46 by dbateman]
dbateman
parents: 5775
diff changeset
1628 double& rcond, solve_singularity_handler sing_handler,
6b9cec830d72 [project @ 2006-05-03 19:32:46 by dbateman]
dbateman
parents: 5775
diff changeset
1629 bool singular_fallback) const
6b9cec830d72 [project @ 2006-05-03 19:32:46 by dbateman]
dbateman
parents: 5775
diff changeset
1630 {
6b9cec830d72 [project @ 2006-05-03 19:32:46 by dbateman]
dbateman
parents: 5775
diff changeset
1631 Matrix retval;
6b9cec830d72 [project @ 2006-05-03 19:32:46 by dbateman]
dbateman
parents: 5775
diff changeset
1632 int typ = mattype.type ();
6b9cec830d72 [project @ 2006-05-03 19:32:46 by dbateman]
dbateman
parents: 5775
diff changeset
1633
6b9cec830d72 [project @ 2006-05-03 19:32:46 by dbateman]
dbateman
parents: 5775
diff changeset
1634 if (typ == MatrixType::Unknown)
6b9cec830d72 [project @ 2006-05-03 19:32:46 by dbateman]
dbateman
parents: 5775
diff changeset
1635 typ = mattype.type (*this);
6b9cec830d72 [project @ 2006-05-03 19:32:46 by dbateman]
dbateman
parents: 5775
diff changeset
1636
6b9cec830d72 [project @ 2006-05-03 19:32:46 by dbateman]
dbateman
parents: 5775
diff changeset
1637 // Only calculate the condition number for LU/Cholesky
6b9cec830d72 [project @ 2006-05-03 19:32:46 by dbateman]
dbateman
parents: 5775
diff changeset
1638 if (typ == MatrixType::Upper || typ == MatrixType::Permuted_Upper)
6b9cec830d72 [project @ 2006-05-03 19:32:46 by dbateman]
dbateman
parents: 5775
diff changeset
1639 retval = utsolve (mattype, b, info, rcond, sing_handler, false);
6b9cec830d72 [project @ 2006-05-03 19:32:46 by dbateman]
dbateman
parents: 5775
diff changeset
1640 else if (typ == MatrixType::Lower || typ == MatrixType::Permuted_Lower)
6b9cec830d72 [project @ 2006-05-03 19:32:46 by dbateman]
dbateman
parents: 5775
diff changeset
1641 retval = ltsolve (mattype, b, info, rcond, sing_handler, false);
6b9cec830d72 [project @ 2006-05-03 19:32:46 by dbateman]
dbateman
parents: 5775
diff changeset
1642 else if (typ == MatrixType::Full || typ == MatrixType::Hermitian)
6b9cec830d72 [project @ 2006-05-03 19:32:46 by dbateman]
dbateman
parents: 5775
diff changeset
1643 retval = fsolve (mattype, b, info, rcond, sing_handler, true);
6b9cec830d72 [project @ 2006-05-03 19:32:46 by dbateman]
dbateman
parents: 5775
diff changeset
1644 else if (typ != MatrixType::Rectangular)
6b9cec830d72 [project @ 2006-05-03 19:32:46 by dbateman]
dbateman
parents: 5775
diff changeset
1645 {
6b9cec830d72 [project @ 2006-05-03 19:32:46 by dbateman]
dbateman
parents: 5775
diff changeset
1646 (*current_liboctave_error_handler) ("unknown matrix type");
6b9cec830d72 [project @ 2006-05-03 19:32:46 by dbateman]
dbateman
parents: 5775
diff changeset
1647 return Matrix ();
6b9cec830d72 [project @ 2006-05-03 19:32:46 by dbateman]
dbateman
parents: 5775
diff changeset
1648 }
6b9cec830d72 [project @ 2006-05-03 19:32:46 by dbateman]
dbateman
parents: 5775
diff changeset
1649
6b9cec830d72 [project @ 2006-05-03 19:32:46 by dbateman]
dbateman
parents: 5775
diff changeset
1650 // Rectangular or one of the above solvers flags a singular matrix
6b9cec830d72 [project @ 2006-05-03 19:32:46 by dbateman]
dbateman
parents: 5775
diff changeset
1651 if (singular_fallback && mattype.type () == MatrixType::Rectangular)
6b9cec830d72 [project @ 2006-05-03 19:32:46 by dbateman]
dbateman
parents: 5775
diff changeset
1652 {
6b9cec830d72 [project @ 2006-05-03 19:32:46 by dbateman]
dbateman
parents: 5775
diff changeset
1653 octave_idx_type rank;
6b9cec830d72 [project @ 2006-05-03 19:32:46 by dbateman]
dbateman
parents: 5775
diff changeset
1654 retval = lssolve (b, info, rank);
6b9cec830d72 [project @ 2006-05-03 19:32:46 by dbateman]
dbateman
parents: 5775
diff changeset
1655 }
6b9cec830d72 [project @ 2006-05-03 19:32:46 by dbateman]
dbateman
parents: 5775
diff changeset
1656
6b9cec830d72 [project @ 2006-05-03 19:32:46 by dbateman]
dbateman
parents: 5775
diff changeset
1657 return retval;
6b9cec830d72 [project @ 2006-05-03 19:32:46 by dbateman]
dbateman
parents: 5775
diff changeset
1658 }
6b9cec830d72 [project @ 2006-05-03 19:32:46 by dbateman]
dbateman
parents: 5775
diff changeset
1659
6b9cec830d72 [project @ 2006-05-03 19:32:46 by dbateman]
dbateman
parents: 5775
diff changeset
1660 ComplexMatrix
6b9cec830d72 [project @ 2006-05-03 19:32:46 by dbateman]
dbateman
parents: 5775
diff changeset
1661 Matrix::solve (MatrixType &typ, const ComplexMatrix& b) const
6b9cec830d72 [project @ 2006-05-03 19:32:46 by dbateman]
dbateman
parents: 5775
diff changeset
1662 {
6b9cec830d72 [project @ 2006-05-03 19:32:46 by dbateman]
dbateman
parents: 5775
diff changeset
1663 ComplexMatrix tmp (*this);
6b9cec830d72 [project @ 2006-05-03 19:32:46 by dbateman]
dbateman
parents: 5775
diff changeset
1664 return tmp.solve (typ, b);
6b9cec830d72 [project @ 2006-05-03 19:32:46 by dbateman]
dbateman
parents: 5775
diff changeset
1665 }
6b9cec830d72 [project @ 2006-05-03 19:32:46 by dbateman]
dbateman
parents: 5775
diff changeset
1666
6b9cec830d72 [project @ 2006-05-03 19:32:46 by dbateman]
dbateman
parents: 5775
diff changeset
1667 ComplexMatrix
6b9cec830d72 [project @ 2006-05-03 19:32:46 by dbateman]
dbateman
parents: 5775
diff changeset
1668 Matrix::solve (MatrixType &typ, const ComplexMatrix& b,
6b9cec830d72 [project @ 2006-05-03 19:32:46 by dbateman]
dbateman
parents: 5775
diff changeset
1669 octave_idx_type& info) const
6b9cec830d72 [project @ 2006-05-03 19:32:46 by dbateman]
dbateman
parents: 5775
diff changeset
1670 {
6b9cec830d72 [project @ 2006-05-03 19:32:46 by dbateman]
dbateman
parents: 5775
diff changeset
1671 ComplexMatrix tmp (*this);
6b9cec830d72 [project @ 2006-05-03 19:32:46 by dbateman]
dbateman
parents: 5775
diff changeset
1672 return tmp.solve (typ, b, info);
6b9cec830d72 [project @ 2006-05-03 19:32:46 by dbateman]
dbateman
parents: 5775
diff changeset
1673 }
6b9cec830d72 [project @ 2006-05-03 19:32:46 by dbateman]
dbateman
parents: 5775
diff changeset
1674
6b9cec830d72 [project @ 2006-05-03 19:32:46 by dbateman]
dbateman
parents: 5775
diff changeset
1675 ComplexMatrix
6b9cec830d72 [project @ 2006-05-03 19:32:46 by dbateman]
dbateman
parents: 5775
diff changeset
1676 Matrix::solve (MatrixType &typ, const ComplexMatrix& b, octave_idx_type& info,
6b9cec830d72 [project @ 2006-05-03 19:32:46 by dbateman]
dbateman
parents: 5775
diff changeset
1677 double& rcond) const
6b9cec830d72 [project @ 2006-05-03 19:32:46 by dbateman]
dbateman
parents: 5775
diff changeset
1678 {
6b9cec830d72 [project @ 2006-05-03 19:32:46 by dbateman]
dbateman
parents: 5775
diff changeset
1679 ComplexMatrix tmp (*this);
6b9cec830d72 [project @ 2006-05-03 19:32:46 by dbateman]
dbateman
parents: 5775
diff changeset
1680 return tmp.solve (typ, b, info, rcond);
6b9cec830d72 [project @ 2006-05-03 19:32:46 by dbateman]
dbateman
parents: 5775
diff changeset
1681 }
6b9cec830d72 [project @ 2006-05-03 19:32:46 by dbateman]
dbateman
parents: 5775
diff changeset
1682
6b9cec830d72 [project @ 2006-05-03 19:32:46 by dbateman]
dbateman
parents: 5775
diff changeset
1683 ComplexMatrix
6b9cec830d72 [project @ 2006-05-03 19:32:46 by dbateman]
dbateman
parents: 5775
diff changeset
1684 Matrix::solve (MatrixType &typ, const ComplexMatrix& b, octave_idx_type& info,
6b9cec830d72 [project @ 2006-05-03 19:32:46 by dbateman]
dbateman
parents: 5775
diff changeset
1685 double& rcond, solve_singularity_handler sing_handler,
6b9cec830d72 [project @ 2006-05-03 19:32:46 by dbateman]
dbateman
parents: 5775
diff changeset
1686 bool singular_fallback) const
6b9cec830d72 [project @ 2006-05-03 19:32:46 by dbateman]
dbateman
parents: 5775
diff changeset
1687 {
6b9cec830d72 [project @ 2006-05-03 19:32:46 by dbateman]
dbateman
parents: 5775
diff changeset
1688 ComplexMatrix tmp (*this);
6b9cec830d72 [project @ 2006-05-03 19:32:46 by dbateman]
dbateman
parents: 5775
diff changeset
1689 return tmp.solve (typ, b, info, rcond, sing_handler, singular_fallback);
6b9cec830d72 [project @ 2006-05-03 19:32:46 by dbateman]
dbateman
parents: 5775
diff changeset
1690 }
6b9cec830d72 [project @ 2006-05-03 19:32:46 by dbateman]
dbateman
parents: 5775
diff changeset
1691
6b9cec830d72 [project @ 2006-05-03 19:32:46 by dbateman]
dbateman
parents: 5775
diff changeset
1692 ColumnVector
6b9cec830d72 [project @ 2006-05-03 19:32:46 by dbateman]
dbateman
parents: 5775
diff changeset
1693 Matrix::solve (MatrixType &typ, const ColumnVector& b) const
6b9cec830d72 [project @ 2006-05-03 19:32:46 by dbateman]
dbateman
parents: 5775
diff changeset
1694 {
6b9cec830d72 [project @ 2006-05-03 19:32:46 by dbateman]
dbateman
parents: 5775
diff changeset
1695 octave_idx_type info; double rcond;
6b9cec830d72 [project @ 2006-05-03 19:32:46 by dbateman]
dbateman
parents: 5775
diff changeset
1696 return solve (typ, b, info, rcond);
6b9cec830d72 [project @ 2006-05-03 19:32:46 by dbateman]
dbateman
parents: 5775
diff changeset
1697 }
6b9cec830d72 [project @ 2006-05-03 19:32:46 by dbateman]
dbateman
parents: 5775
diff changeset
1698
6b9cec830d72 [project @ 2006-05-03 19:32:46 by dbateman]
dbateman
parents: 5775
diff changeset
1699 ColumnVector
6b9cec830d72 [project @ 2006-05-03 19:32:46 by dbateman]
dbateman
parents: 5775
diff changeset
1700 Matrix::solve (MatrixType &typ, const ColumnVector& b,
6b9cec830d72 [project @ 2006-05-03 19:32:46 by dbateman]
dbateman
parents: 5775
diff changeset
1701 octave_idx_type& info) const
6b9cec830d72 [project @ 2006-05-03 19:32:46 by dbateman]
dbateman
parents: 5775
diff changeset
1702 {
6b9cec830d72 [project @ 2006-05-03 19:32:46 by dbateman]
dbateman
parents: 5775
diff changeset
1703 double rcond;
6b9cec830d72 [project @ 2006-05-03 19:32:46 by dbateman]
dbateman
parents: 5775
diff changeset
1704 return solve (typ, b, info, rcond);
6b9cec830d72 [project @ 2006-05-03 19:32:46 by dbateman]
dbateman
parents: 5775
diff changeset
1705 }
6b9cec830d72 [project @ 2006-05-03 19:32:46 by dbateman]
dbateman
parents: 5775
diff changeset
1706
6b9cec830d72 [project @ 2006-05-03 19:32:46 by dbateman]
dbateman
parents: 5775
diff changeset
1707 ColumnVector
6b9cec830d72 [project @ 2006-05-03 19:32:46 by dbateman]
dbateman
parents: 5775
diff changeset
1708 Matrix::solve (MatrixType &typ, const ColumnVector& b, octave_idx_type& info,
6b9cec830d72 [project @ 2006-05-03 19:32:46 by dbateman]
dbateman
parents: 5775
diff changeset
1709 double& rcond) const
6b9cec830d72 [project @ 2006-05-03 19:32:46 by dbateman]
dbateman
parents: 5775
diff changeset
1710 {
6b9cec830d72 [project @ 2006-05-03 19:32:46 by dbateman]
dbateman
parents: 5775
diff changeset
1711 return solve (typ, b, info, rcond, 0);
6b9cec830d72 [project @ 2006-05-03 19:32:46 by dbateman]
dbateman
parents: 5775
diff changeset
1712 }
6b9cec830d72 [project @ 2006-05-03 19:32:46 by dbateman]
dbateman
parents: 5775
diff changeset
1713
6b9cec830d72 [project @ 2006-05-03 19:32:46 by dbateman]
dbateman
parents: 5775
diff changeset
1714 ColumnVector
6b9cec830d72 [project @ 2006-05-03 19:32:46 by dbateman]
dbateman
parents: 5775
diff changeset
1715 Matrix::solve (MatrixType &typ, const ColumnVector& b, octave_idx_type& info,
6b9cec830d72 [project @ 2006-05-03 19:32:46 by dbateman]
dbateman
parents: 5775
diff changeset
1716 double& rcond, solve_singularity_handler sing_handler) const
6b9cec830d72 [project @ 2006-05-03 19:32:46 by dbateman]
dbateman
parents: 5775
diff changeset
1717 {
6b9cec830d72 [project @ 2006-05-03 19:32:46 by dbateman]
dbateman
parents: 5775
diff changeset
1718 Matrix tmp (b);
6b9cec830d72 [project @ 2006-05-03 19:32:46 by dbateman]
dbateman
parents: 5775
diff changeset
1719 return solve (typ, tmp, info, rcond, sing_handler).column(static_cast<octave_idx_type> (0));
6b9cec830d72 [project @ 2006-05-03 19:32:46 by dbateman]
dbateman
parents: 5775
diff changeset
1720 }
6b9cec830d72 [project @ 2006-05-03 19:32:46 by dbateman]
dbateman
parents: 5775
diff changeset
1721
6b9cec830d72 [project @ 2006-05-03 19:32:46 by dbateman]
dbateman
parents: 5775
diff changeset
1722 ComplexColumnVector
6b9cec830d72 [project @ 2006-05-03 19:32:46 by dbateman]
dbateman
parents: 5775
diff changeset
1723 Matrix::solve (MatrixType &typ, const ComplexColumnVector& b) const
6b9cec830d72 [project @ 2006-05-03 19:32:46 by dbateman]
dbateman
parents: 5775
diff changeset
1724 {
6b9cec830d72 [project @ 2006-05-03 19:32:46 by dbateman]
dbateman
parents: 5775
diff changeset
1725 ComplexMatrix tmp (*this);
6b9cec830d72 [project @ 2006-05-03 19:32:46 by dbateman]
dbateman
parents: 5775
diff changeset
1726 return tmp.solve (typ, b);
6b9cec830d72 [project @ 2006-05-03 19:32:46 by dbateman]
dbateman
parents: 5775
diff changeset
1727 }
6b9cec830d72 [project @ 2006-05-03 19:32:46 by dbateman]
dbateman
parents: 5775
diff changeset
1728
6b9cec830d72 [project @ 2006-05-03 19:32:46 by dbateman]
dbateman
parents: 5775
diff changeset
1729 ComplexColumnVector
6b9cec830d72 [project @ 2006-05-03 19:32:46 by dbateman]
dbateman
parents: 5775
diff changeset
1730 Matrix::solve (MatrixType &typ, const ComplexColumnVector& b,
6b9cec830d72 [project @ 2006-05-03 19:32:46 by dbateman]
dbateman
parents: 5775
diff changeset
1731 octave_idx_type& info) const
6b9cec830d72 [project @ 2006-05-03 19:32:46 by dbateman]
dbateman
parents: 5775
diff changeset
1732 {
6b9cec830d72 [project @ 2006-05-03 19:32:46 by dbateman]
dbateman
parents: 5775
diff changeset
1733 ComplexMatrix tmp (*this);
6b9cec830d72 [project @ 2006-05-03 19:32:46 by dbateman]
dbateman
parents: 5775
diff changeset
1734 return tmp.solve (typ, b, info);
6b9cec830d72 [project @ 2006-05-03 19:32:46 by dbateman]
dbateman
parents: 5775
diff changeset
1735 }
6b9cec830d72 [project @ 2006-05-03 19:32:46 by dbateman]
dbateman
parents: 5775
diff changeset
1736
6b9cec830d72 [project @ 2006-05-03 19:32:46 by dbateman]
dbateman
parents: 5775
diff changeset
1737 ComplexColumnVector
6b9cec830d72 [project @ 2006-05-03 19:32:46 by dbateman]
dbateman
parents: 5775
diff changeset
1738 Matrix::solve (MatrixType &typ, const ComplexColumnVector& b,
6b9cec830d72 [project @ 2006-05-03 19:32:46 by dbateman]
dbateman
parents: 5775
diff changeset
1739 octave_idx_type& info, double& rcond) const
6b9cec830d72 [project @ 2006-05-03 19:32:46 by dbateman]
dbateman
parents: 5775
diff changeset
1740 {
6b9cec830d72 [project @ 2006-05-03 19:32:46 by dbateman]
dbateman
parents: 5775
diff changeset
1741 ComplexMatrix tmp (*this);
6b9cec830d72 [project @ 2006-05-03 19:32:46 by dbateman]
dbateman
parents: 5775
diff changeset
1742 return tmp.solve (typ, b, info, rcond);
6b9cec830d72 [project @ 2006-05-03 19:32:46 by dbateman]
dbateman
parents: 5775
diff changeset
1743 }
6b9cec830d72 [project @ 2006-05-03 19:32:46 by dbateman]
dbateman
parents: 5775
diff changeset
1744
6b9cec830d72 [project @ 2006-05-03 19:32:46 by dbateman]
dbateman
parents: 5775
diff changeset
1745 ComplexColumnVector
6b9cec830d72 [project @ 2006-05-03 19:32:46 by dbateman]
dbateman
parents: 5775
diff changeset
1746 Matrix::solve (MatrixType &typ, const ComplexColumnVector& b,
6b9cec830d72 [project @ 2006-05-03 19:32:46 by dbateman]
dbateman
parents: 5775
diff changeset
1747 octave_idx_type& info, double& rcond,
6b9cec830d72 [project @ 2006-05-03 19:32:46 by dbateman]
dbateman
parents: 5775
diff changeset
1748 solve_singularity_handler sing_handler) const
6b9cec830d72 [project @ 2006-05-03 19:32:46 by dbateman]
dbateman
parents: 5775
diff changeset
1749 {
6b9cec830d72 [project @ 2006-05-03 19:32:46 by dbateman]
dbateman
parents: 5775
diff changeset
1750 ComplexMatrix tmp (*this);
6b9cec830d72 [project @ 2006-05-03 19:32:46 by dbateman]
dbateman
parents: 5775
diff changeset
1751 return tmp.solve(typ, b, info, rcond, sing_handler);
6b9cec830d72 [project @ 2006-05-03 19:32:46 by dbateman]
dbateman
parents: 5775
diff changeset
1752 }
6b9cec830d72 [project @ 2006-05-03 19:32:46 by dbateman]
dbateman
parents: 5775
diff changeset
1753
6b9cec830d72 [project @ 2006-05-03 19:32:46 by dbateman]
dbateman
parents: 5775
diff changeset
1754 Matrix
458
38cb88095913 [project @ 1994-06-06 00:41:10 by jwe]
jwe
parents:
diff changeset
1755 Matrix::solve (const Matrix& b) const
38cb88095913 [project @ 1994-06-06 00:41:10 by jwe]
jwe
parents:
diff changeset
1756 {
5275
23b37da9fd5b [project @ 2005-04-08 16:07:35 by jwe]
jwe
parents: 5105
diff changeset
1757 octave_idx_type info;
458
38cb88095913 [project @ 1994-06-06 00:41:10 by jwe]
jwe
parents:
diff changeset
1758 double rcond;
4329
d53c33d93440 [project @ 2003-02-18 20:00:48 by jwe]
jwe
parents: 4316
diff changeset
1759 return solve (b, info, rcond, 0);
458
38cb88095913 [project @ 1994-06-06 00:41:10 by jwe]
jwe
parents:
diff changeset
1760 }
38cb88095913 [project @ 1994-06-06 00:41:10 by jwe]
jwe
parents:
diff changeset
1761
38cb88095913 [project @ 1994-06-06 00:41:10 by jwe]
jwe
parents:
diff changeset
1762 Matrix
5275
23b37da9fd5b [project @ 2005-04-08 16:07:35 by jwe]
jwe
parents: 5105
diff changeset
1763 Matrix::solve (const Matrix& b, octave_idx_type& info) const
458
38cb88095913 [project @ 1994-06-06 00:41:10 by jwe]
jwe
parents:
diff changeset
1764 {
38cb88095913 [project @ 1994-06-06 00:41:10 by jwe]
jwe
parents:
diff changeset
1765 double rcond;
4329
d53c33d93440 [project @ 2003-02-18 20:00:48 by jwe]
jwe
parents: 4316
diff changeset
1766 return solve (b, info, rcond, 0);
458
38cb88095913 [project @ 1994-06-06 00:41:10 by jwe]
jwe
parents:
diff changeset
1767 }
38cb88095913 [project @ 1994-06-06 00:41:10 by jwe]
jwe
parents:
diff changeset
1768
38cb88095913 [project @ 1994-06-06 00:41:10 by jwe]
jwe
parents:
diff changeset
1769 Matrix
5275
23b37da9fd5b [project @ 2005-04-08 16:07:35 by jwe]
jwe
parents: 5105
diff changeset
1770 Matrix::solve (const Matrix& b, octave_idx_type& info, double& rcond) const
458
38cb88095913 [project @ 1994-06-06 00:41:10 by jwe]
jwe
parents:
diff changeset
1771 {
3480
45742a3b1f7c [project @ 2000-01-26 06:16:41 by jwe]
jwe
parents: 3469
diff changeset
1772 return solve (b, info, rcond, 0);
45742a3b1f7c [project @ 2000-01-26 06:16:41 by jwe]
jwe
parents: 3469
diff changeset
1773 }
45742a3b1f7c [project @ 2000-01-26 06:16:41 by jwe]
jwe
parents: 3469
diff changeset
1774
45742a3b1f7c [project @ 2000-01-26 06:16:41 by jwe]
jwe
parents: 3469
diff changeset
1775 Matrix
5785
6b9cec830d72 [project @ 2006-05-03 19:32:46 by dbateman]
dbateman
parents: 5775
diff changeset
1776 Matrix::solve (const Matrix& b, octave_idx_type& info,
6b9cec830d72 [project @ 2006-05-03 19:32:46 by dbateman]
dbateman
parents: 5775
diff changeset
1777 double& rcond, solve_singularity_handler sing_handler) const
3480
45742a3b1f7c [project @ 2000-01-26 06:16:41 by jwe]
jwe
parents: 3469
diff changeset
1778 {
5785
6b9cec830d72 [project @ 2006-05-03 19:32:46 by dbateman]
dbateman
parents: 5775
diff changeset
1779 MatrixType mattype (*this);
6b9cec830d72 [project @ 2006-05-03 19:32:46 by dbateman]
dbateman
parents: 5775
diff changeset
1780 return solve (mattype, b, info, rcond, sing_handler);
458
38cb88095913 [project @ 1994-06-06 00:41:10 by jwe]
jwe
parents:
diff changeset
1781 }
38cb88095913 [project @ 1994-06-06 00:41:10 by jwe]
jwe
parents:
diff changeset
1782
38cb88095913 [project @ 1994-06-06 00:41:10 by jwe]
jwe
parents:
diff changeset
1783 ComplexMatrix
38cb88095913 [project @ 1994-06-06 00:41:10 by jwe]
jwe
parents:
diff changeset
1784 Matrix::solve (const ComplexMatrix& b) const
38cb88095913 [project @ 1994-06-06 00:41:10 by jwe]
jwe
parents:
diff changeset
1785 {
38cb88095913 [project @ 1994-06-06 00:41:10 by jwe]
jwe
parents:
diff changeset
1786 ComplexMatrix tmp (*this);
38cb88095913 [project @ 1994-06-06 00:41:10 by jwe]
jwe
parents:
diff changeset
1787 return tmp.solve (b);
38cb88095913 [project @ 1994-06-06 00:41:10 by jwe]
jwe
parents:
diff changeset
1788 }
38cb88095913 [project @ 1994-06-06 00:41:10 by jwe]
jwe
parents:
diff changeset
1789
38cb88095913 [project @ 1994-06-06 00:41:10 by jwe]
jwe
parents:
diff changeset
1790 ComplexMatrix
5275
23b37da9fd5b [project @ 2005-04-08 16:07:35 by jwe]
jwe
parents: 5105
diff changeset
1791 Matrix::solve (const ComplexMatrix& b, octave_idx_type& info) const
458
38cb88095913 [project @ 1994-06-06 00:41:10 by jwe]
jwe
parents:
diff changeset
1792 {
38cb88095913 [project @ 1994-06-06 00:41:10 by jwe]
jwe
parents:
diff changeset
1793 ComplexMatrix tmp (*this);
38cb88095913 [project @ 1994-06-06 00:41:10 by jwe]
jwe
parents:
diff changeset
1794 return tmp.solve (b, info);
38cb88095913 [project @ 1994-06-06 00:41:10 by jwe]
jwe
parents:
diff changeset
1795 }
38cb88095913 [project @ 1994-06-06 00:41:10 by jwe]
jwe
parents:
diff changeset
1796
38cb88095913 [project @ 1994-06-06 00:41:10 by jwe]
jwe
parents:
diff changeset
1797 ComplexMatrix
5275
23b37da9fd5b [project @ 2005-04-08 16:07:35 by jwe]
jwe
parents: 5105
diff changeset
1798 Matrix::solve (const ComplexMatrix& b, octave_idx_type& info, double& rcond) const
458
38cb88095913 [project @ 1994-06-06 00:41:10 by jwe]
jwe
parents:
diff changeset
1799 {
38cb88095913 [project @ 1994-06-06 00:41:10 by jwe]
jwe
parents:
diff changeset
1800 ComplexMatrix tmp (*this);
38cb88095913 [project @ 1994-06-06 00:41:10 by jwe]
jwe
parents:
diff changeset
1801 return tmp.solve (b, info, rcond);
38cb88095913 [project @ 1994-06-06 00:41:10 by jwe]
jwe
parents:
diff changeset
1802 }
38cb88095913 [project @ 1994-06-06 00:41:10 by jwe]
jwe
parents:
diff changeset
1803
3480
45742a3b1f7c [project @ 2000-01-26 06:16:41 by jwe]
jwe
parents: 3469
diff changeset
1804 ComplexMatrix
5275
23b37da9fd5b [project @ 2005-04-08 16:07:35 by jwe]
jwe
parents: 5105
diff changeset
1805 Matrix::solve (const ComplexMatrix& b, octave_idx_type& info, double& rcond,
3480
45742a3b1f7c [project @ 2000-01-26 06:16:41 by jwe]
jwe
parents: 3469
diff changeset
1806 solve_singularity_handler sing_handler) const
45742a3b1f7c [project @ 2000-01-26 06:16:41 by jwe]
jwe
parents: 3469
diff changeset
1807 {
45742a3b1f7c [project @ 2000-01-26 06:16:41 by jwe]
jwe
parents: 3469
diff changeset
1808 ComplexMatrix tmp (*this);
45742a3b1f7c [project @ 2000-01-26 06:16:41 by jwe]
jwe
parents: 3469
diff changeset
1809 return tmp.solve (b, info, rcond, sing_handler);
45742a3b1f7c [project @ 2000-01-26 06:16:41 by jwe]
jwe
parents: 3469
diff changeset
1810 }
45742a3b1f7c [project @ 2000-01-26 06:16:41 by jwe]
jwe
parents: 3469
diff changeset
1811
458
38cb88095913 [project @ 1994-06-06 00:41:10 by jwe]
jwe
parents:
diff changeset
1812 ColumnVector
38cb88095913 [project @ 1994-06-06 00:41:10 by jwe]
jwe
parents:
diff changeset
1813 Matrix::solve (const ColumnVector& b) const
38cb88095913 [project @ 1994-06-06 00:41:10 by jwe]
jwe
parents:
diff changeset
1814 {
5275
23b37da9fd5b [project @ 2005-04-08 16:07:35 by jwe]
jwe
parents: 5105
diff changeset
1815 octave_idx_type info; double rcond;
458
38cb88095913 [project @ 1994-06-06 00:41:10 by jwe]
jwe
parents:
diff changeset
1816 return solve (b, info, rcond);
38cb88095913 [project @ 1994-06-06 00:41:10 by jwe]
jwe
parents:
diff changeset
1817 }
38cb88095913 [project @ 1994-06-06 00:41:10 by jwe]
jwe
parents:
diff changeset
1818
38cb88095913 [project @ 1994-06-06 00:41:10 by jwe]
jwe
parents:
diff changeset
1819 ColumnVector
5275
23b37da9fd5b [project @ 2005-04-08 16:07:35 by jwe]
jwe
parents: 5105
diff changeset
1820 Matrix::solve (const ColumnVector& b, octave_idx_type& info) const
458
38cb88095913 [project @ 1994-06-06 00:41:10 by jwe]
jwe
parents:
diff changeset
1821 {
38cb88095913 [project @ 1994-06-06 00:41:10 by jwe]
jwe
parents:
diff changeset
1822 double rcond;
38cb88095913 [project @ 1994-06-06 00:41:10 by jwe]
jwe
parents:
diff changeset
1823 return solve (b, info, rcond);
38cb88095913 [project @ 1994-06-06 00:41:10 by jwe]
jwe
parents:
diff changeset
1824 }
38cb88095913 [project @ 1994-06-06 00:41:10 by jwe]
jwe
parents:
diff changeset
1825
38cb88095913 [project @ 1994-06-06 00:41:10 by jwe]
jwe
parents:
diff changeset
1826 ColumnVector
5275
23b37da9fd5b [project @ 2005-04-08 16:07:35 by jwe]
jwe
parents: 5105
diff changeset
1827 Matrix::solve (const ColumnVector& b, octave_idx_type& info, double& rcond) const
458
38cb88095913 [project @ 1994-06-06 00:41:10 by jwe]
jwe
parents:
diff changeset
1828 {
3480
45742a3b1f7c [project @ 2000-01-26 06:16:41 by jwe]
jwe
parents: 3469
diff changeset
1829 return solve (b, info, rcond, 0);
45742a3b1f7c [project @ 2000-01-26 06:16:41 by jwe]
jwe
parents: 3469
diff changeset
1830 }
45742a3b1f7c [project @ 2000-01-26 06:16:41 by jwe]
jwe
parents: 3469
diff changeset
1831
45742a3b1f7c [project @ 2000-01-26 06:16:41 by jwe]
jwe
parents: 3469
diff changeset
1832 ColumnVector
5275
23b37da9fd5b [project @ 2005-04-08 16:07:35 by jwe]
jwe
parents: 5105
diff changeset
1833 Matrix::solve (const ColumnVector& b, octave_idx_type& info, double& rcond,
3480
45742a3b1f7c [project @ 2000-01-26 06:16:41 by jwe]
jwe
parents: 3469
diff changeset
1834 solve_singularity_handler sing_handler) const
45742a3b1f7c [project @ 2000-01-26 06:16:41 by jwe]
jwe
parents: 3469
diff changeset
1835 {
5785
6b9cec830d72 [project @ 2006-05-03 19:32:46 by dbateman]
dbateman
parents: 5775
diff changeset
1836 MatrixType mattype (*this);
6b9cec830d72 [project @ 2006-05-03 19:32:46 by dbateman]
dbateman
parents: 5775
diff changeset
1837 return solve (mattype, b, info, rcond, sing_handler);
458
38cb88095913 [project @ 1994-06-06 00:41:10 by jwe]
jwe
parents:
diff changeset
1838 }
38cb88095913 [project @ 1994-06-06 00:41:10 by jwe]
jwe
parents:
diff changeset
1839
38cb88095913 [project @ 1994-06-06 00:41:10 by jwe]
jwe
parents:
diff changeset
1840 ComplexColumnVector
38cb88095913 [project @ 1994-06-06 00:41:10 by jwe]
jwe
parents:
diff changeset
1841 Matrix::solve (const ComplexColumnVector& b) const
38cb88095913 [project @ 1994-06-06 00:41:10 by jwe]
jwe
parents:
diff changeset
1842 {
38cb88095913 [project @ 1994-06-06 00:41:10 by jwe]
jwe
parents:
diff changeset
1843 ComplexMatrix tmp (*this);
38cb88095913 [project @ 1994-06-06 00:41:10 by jwe]
jwe
parents:
diff changeset
1844 return tmp.solve (b);
38cb88095913 [project @ 1994-06-06 00:41:10 by jwe]
jwe
parents:
diff changeset
1845 }
38cb88095913 [project @ 1994-06-06 00:41:10 by jwe]
jwe
parents:
diff changeset
1846
38cb88095913 [project @ 1994-06-06 00:41:10 by jwe]
jwe
parents:
diff changeset
1847 ComplexColumnVector
5275
23b37da9fd5b [project @ 2005-04-08 16:07:35 by jwe]
jwe
parents: 5105
diff changeset
1848 Matrix::solve (const ComplexColumnVector& b, octave_idx_type& info) const
458
38cb88095913 [project @ 1994-06-06 00:41:10 by jwe]
jwe
parents:
diff changeset
1849 {
38cb88095913 [project @ 1994-06-06 00:41:10 by jwe]
jwe
parents:
diff changeset
1850 ComplexMatrix tmp (*this);
38cb88095913 [project @ 1994-06-06 00:41:10 by jwe]
jwe
parents:
diff changeset
1851 return tmp.solve (b, info);
38cb88095913 [project @ 1994-06-06 00:41:10 by jwe]
jwe
parents:
diff changeset
1852 }
38cb88095913 [project @ 1994-06-06 00:41:10 by jwe]
jwe
parents:
diff changeset
1853
38cb88095913 [project @ 1994-06-06 00:41:10 by jwe]
jwe
parents:
diff changeset
1854 ComplexColumnVector
5275
23b37da9fd5b [project @ 2005-04-08 16:07:35 by jwe]
jwe
parents: 5105
diff changeset
1855 Matrix::solve (const ComplexColumnVector& b, octave_idx_type& info, double& rcond) const
458
38cb88095913 [project @ 1994-06-06 00:41:10 by jwe]
jwe
parents:
diff changeset
1856 {
38cb88095913 [project @ 1994-06-06 00:41:10 by jwe]
jwe
parents:
diff changeset
1857 ComplexMatrix tmp (*this);
38cb88095913 [project @ 1994-06-06 00:41:10 by jwe]
jwe
parents:
diff changeset
1858 return tmp.solve (b, info, rcond);
38cb88095913 [project @ 1994-06-06 00:41:10 by jwe]
jwe
parents:
diff changeset
1859 }
38cb88095913 [project @ 1994-06-06 00:41:10 by jwe]
jwe
parents:
diff changeset
1860
3480
45742a3b1f7c [project @ 2000-01-26 06:16:41 by jwe]
jwe
parents: 3469
diff changeset
1861 ComplexColumnVector
5275
23b37da9fd5b [project @ 2005-04-08 16:07:35 by jwe]
jwe
parents: 5105
diff changeset
1862 Matrix::solve (const ComplexColumnVector& b, octave_idx_type& info, double& rcond,
3480
45742a3b1f7c [project @ 2000-01-26 06:16:41 by jwe]
jwe
parents: 3469
diff changeset
1863 solve_singularity_handler sing_handler) const
45742a3b1f7c [project @ 2000-01-26 06:16:41 by jwe]
jwe
parents: 3469
diff changeset
1864 {
45742a3b1f7c [project @ 2000-01-26 06:16:41 by jwe]
jwe
parents: 3469
diff changeset
1865 ComplexMatrix tmp (*this);
45742a3b1f7c [project @ 2000-01-26 06:16:41 by jwe]
jwe
parents: 3469
diff changeset
1866 return tmp.solve (b, info, rcond, sing_handler);
45742a3b1f7c [project @ 2000-01-26 06:16:41 by jwe]
jwe
parents: 3469
diff changeset
1867 }
45742a3b1f7c [project @ 2000-01-26 06:16:41 by jwe]
jwe
parents: 3469
diff changeset
1868
458
38cb88095913 [project @ 1994-06-06 00:41:10 by jwe]
jwe
parents:
diff changeset
1869 Matrix
38cb88095913 [project @ 1994-06-06 00:41:10 by jwe]
jwe
parents:
diff changeset
1870 Matrix::lssolve (const Matrix& b) const
38cb88095913 [project @ 1994-06-06 00:41:10 by jwe]
jwe
parents:
diff changeset
1871 {
5275
23b37da9fd5b [project @ 2005-04-08 16:07:35 by jwe]
jwe
parents: 5105
diff changeset
1872 octave_idx_type info;
23b37da9fd5b [project @ 2005-04-08 16:07:35 by jwe]
jwe
parents: 5105
diff changeset
1873 octave_idx_type rank;
458
38cb88095913 [project @ 1994-06-06 00:41:10 by jwe]
jwe
parents:
diff changeset
1874 return lssolve (b, info, rank);
38cb88095913 [project @ 1994-06-06 00:41:10 by jwe]
jwe
parents:
diff changeset
1875 }
38cb88095913 [project @ 1994-06-06 00:41:10 by jwe]
jwe
parents:
diff changeset
1876
38cb88095913 [project @ 1994-06-06 00:41:10 by jwe]
jwe
parents:
diff changeset
1877 Matrix
5275
23b37da9fd5b [project @ 2005-04-08 16:07:35 by jwe]
jwe
parents: 5105
diff changeset
1878 Matrix::lssolve (const Matrix& b, octave_idx_type& info) const
458
38cb88095913 [project @ 1994-06-06 00:41:10 by jwe]
jwe
parents:
diff changeset
1879 {
5275
23b37da9fd5b [project @ 2005-04-08 16:07:35 by jwe]
jwe
parents: 5105
diff changeset
1880 octave_idx_type rank;
458
38cb88095913 [project @ 1994-06-06 00:41:10 by jwe]
jwe
parents:
diff changeset
1881 return lssolve (b, info, rank);
38cb88095913 [project @ 1994-06-06 00:41:10 by jwe]
jwe
parents:
diff changeset
1882 }
38cb88095913 [project @ 1994-06-06 00:41:10 by jwe]
jwe
parents:
diff changeset
1883
38cb88095913 [project @ 1994-06-06 00:41:10 by jwe]
jwe
parents:
diff changeset
1884 Matrix
5275
23b37da9fd5b [project @ 2005-04-08 16:07:35 by jwe]
jwe
parents: 5105
diff changeset
1885 Matrix::lssolve (const Matrix& b, octave_idx_type& info, octave_idx_type& rank) const
458
38cb88095913 [project @ 1994-06-06 00:41:10 by jwe]
jwe
parents:
diff changeset
1886 {
1948
d7dec93d4b87 [project @ 1996-02-14 03:45:49 by jwe]
jwe
parents: 1882
diff changeset
1887 Matrix retval;
d7dec93d4b87 [project @ 1996-02-14 03:45:49 by jwe]
jwe
parents: 1882
diff changeset
1888
5275
23b37da9fd5b [project @ 2005-04-08 16:07:35 by jwe]
jwe
parents: 5105
diff changeset
1889 octave_idx_type nrhs = b.cols ();
23b37da9fd5b [project @ 2005-04-08 16:07:35 by jwe]
jwe
parents: 5105
diff changeset
1890
23b37da9fd5b [project @ 2005-04-08 16:07:35 by jwe]
jwe
parents: 5105
diff changeset
1891 octave_idx_type m = rows ();
23b37da9fd5b [project @ 2005-04-08 16:07:35 by jwe]
jwe
parents: 5105
diff changeset
1892 octave_idx_type n = cols ();
458
38cb88095913 [project @ 1994-06-06 00:41:10 by jwe]
jwe
parents:
diff changeset
1893
38cb88095913 [project @ 1994-06-06 00:41:10 by jwe]
jwe
parents:
diff changeset
1894 if (m == 0 || n == 0 || m != b.rows ())
1948
d7dec93d4b87 [project @ 1996-02-14 03:45:49 by jwe]
jwe
parents: 1882
diff changeset
1895 (*current_liboctave_error_handler)
d7dec93d4b87 [project @ 1996-02-14 03:45:49 by jwe]
jwe
parents: 1882
diff changeset
1896 ("matrix dimension mismatch in solution of least squares problem");
d7dec93d4b87 [project @ 1996-02-14 03:45:49 by jwe]
jwe
parents: 1882
diff changeset
1897 else
458
38cb88095913 [project @ 1994-06-06 00:41:10 by jwe]
jwe
parents:
diff changeset
1898 {
1948
d7dec93d4b87 [project @ 1996-02-14 03:45:49 by jwe]
jwe
parents: 1882
diff changeset
1899 Matrix atmp = *this;
d7dec93d4b87 [project @ 1996-02-14 03:45:49 by jwe]
jwe
parents: 1882
diff changeset
1900 double *tmp_data = atmp.fortran_vec ();
d7dec93d4b87 [project @ 1996-02-14 03:45:49 by jwe]
jwe
parents: 1882
diff changeset
1901
5275
23b37da9fd5b [project @ 2005-04-08 16:07:35 by jwe]
jwe
parents: 5105
diff changeset
1902 octave_idx_type nrr = m > n ? m : n;
3754
e63a3a6d7797 [project @ 2000-12-14 21:57:14 by jwe]
jwe
parents: 3752
diff changeset
1903 Matrix result (nrr, nrhs, 0.0);
1948
d7dec93d4b87 [project @ 1996-02-14 03:45:49 by jwe]
jwe
parents: 1882
diff changeset
1904
5275
23b37da9fd5b [project @ 2005-04-08 16:07:35 by jwe]
jwe
parents: 5105
diff changeset
1905 for (octave_idx_type j = 0; j < nrhs; j++)
23b37da9fd5b [project @ 2005-04-08 16:07:35 by jwe]
jwe
parents: 5105
diff changeset
1906 for (octave_idx_type i = 0; i < m; i++)
1948
d7dec93d4b87 [project @ 1996-02-14 03:45:49 by jwe]
jwe
parents: 1882
diff changeset
1907 result.elem (i, j) = b.elem (i, j);
d7dec93d4b87 [project @ 1996-02-14 03:45:49 by jwe]
jwe
parents: 1882
diff changeset
1908
d7dec93d4b87 [project @ 1996-02-14 03:45:49 by jwe]
jwe
parents: 1882
diff changeset
1909 double *presult = result.fortran_vec ();
d7dec93d4b87 [project @ 1996-02-14 03:45:49 by jwe]
jwe
parents: 1882
diff changeset
1910
5275
23b37da9fd5b [project @ 2005-04-08 16:07:35 by jwe]
jwe
parents: 5105
diff changeset
1911 octave_idx_type len_s = m < n ? m : n;
1948
d7dec93d4b87 [project @ 1996-02-14 03:45:49 by jwe]
jwe
parents: 1882
diff changeset
1912 Array<double> s (len_s);
d7dec93d4b87 [project @ 1996-02-14 03:45:49 by jwe]
jwe
parents: 1882
diff changeset
1913 double *ps = s.fortran_vec ();
d7dec93d4b87 [project @ 1996-02-14 03:45:49 by jwe]
jwe
parents: 1882
diff changeset
1914
d7dec93d4b87 [project @ 1996-02-14 03:45:49 by jwe]
jwe
parents: 1882
diff changeset
1915 double rcond = -1.0;
d7dec93d4b87 [project @ 1996-02-14 03:45:49 by jwe]
jwe
parents: 1882
diff changeset
1916
3752
719a44ff67c9 [project @ 2000-12-13 19:02:42 by jwe]
jwe
parents: 3726
diff changeset
1917 // Ask DGELSS what the dimension of WORK should be.
719a44ff67c9 [project @ 2000-12-13 19:02:42 by jwe]
jwe
parents: 3726
diff changeset
1918
5275
23b37da9fd5b [project @ 2005-04-08 16:07:35 by jwe]
jwe
parents: 5105
diff changeset
1919 octave_idx_type lwork = -1;
3752
719a44ff67c9 [project @ 2000-12-13 19:02:42 by jwe]
jwe
parents: 3726
diff changeset
1920
719a44ff67c9 [project @ 2000-12-13 19:02:42 by jwe]
jwe
parents: 3726
diff changeset
1921 Array<double> work (1);
1948
d7dec93d4b87 [project @ 1996-02-14 03:45:49 by jwe]
jwe
parents: 1882
diff changeset
1922
d7dec93d4b87 [project @ 1996-02-14 03:45:49 by jwe]
jwe
parents: 1882
diff changeset
1923 F77_XFCN (dgelss, DGELSS, (m, n, nrhs, tmp_data, m, presult, nrr, ps,
3752
719a44ff67c9 [project @ 2000-12-13 19:02:42 by jwe]
jwe
parents: 3726
diff changeset
1924 rcond, rank, work.fortran_vec (),
719a44ff67c9 [project @ 2000-12-13 19:02:42 by jwe]
jwe
parents: 3726
diff changeset
1925 lwork, info));
1948
d7dec93d4b87 [project @ 1996-02-14 03:45:49 by jwe]
jwe
parents: 1882
diff changeset
1926
d7dec93d4b87 [project @ 1996-02-14 03:45:49 by jwe]
jwe
parents: 1882
diff changeset
1927 if (f77_exception_encountered)
d7dec93d4b87 [project @ 1996-02-14 03:45:49 by jwe]
jwe
parents: 1882
diff changeset
1928 (*current_liboctave_error_handler) ("unrecoverable error in dgelss");
d7dec93d4b87 [project @ 1996-02-14 03:45:49 by jwe]
jwe
parents: 1882
diff changeset
1929 else
d7dec93d4b87 [project @ 1996-02-14 03:45:49 by jwe]
jwe
parents: 1882
diff changeset
1930 {
5275
23b37da9fd5b [project @ 2005-04-08 16:07:35 by jwe]
jwe
parents: 5105
diff changeset
1931 lwork = static_cast<octave_idx_type> (work(0));
3752
719a44ff67c9 [project @ 2000-12-13 19:02:42 by jwe]
jwe
parents: 3726
diff changeset
1932 work.resize (lwork);
719a44ff67c9 [project @ 2000-12-13 19:02:42 by jwe]
jwe
parents: 3726
diff changeset
1933
719a44ff67c9 [project @ 2000-12-13 19:02:42 by jwe]
jwe
parents: 3726
diff changeset
1934 F77_XFCN (dgelss, DGELSS, (m, n, nrhs, tmp_data, m, presult,
719a44ff67c9 [project @ 2000-12-13 19:02:42 by jwe]
jwe
parents: 3726
diff changeset
1935 nrr, ps, rcond, rank,
719a44ff67c9 [project @ 2000-12-13 19:02:42 by jwe]
jwe
parents: 3726
diff changeset
1936 work.fortran_vec (), lwork, info));
719a44ff67c9 [project @ 2000-12-13 19:02:42 by jwe]
jwe
parents: 3726
diff changeset
1937
719a44ff67c9 [project @ 2000-12-13 19:02:42 by jwe]
jwe
parents: 3726
diff changeset
1938 if (f77_exception_encountered)
719a44ff67c9 [project @ 2000-12-13 19:02:42 by jwe]
jwe
parents: 3726
diff changeset
1939 (*current_liboctave_error_handler)
719a44ff67c9 [project @ 2000-12-13 19:02:42 by jwe]
jwe
parents: 3726
diff changeset
1940 ("unrecoverable error in dgelss");
719a44ff67c9 [project @ 2000-12-13 19:02:42 by jwe]
jwe
parents: 3726
diff changeset
1941 else
719a44ff67c9 [project @ 2000-12-13 19:02:42 by jwe]
jwe
parents: 3726
diff changeset
1942 {
719a44ff67c9 [project @ 2000-12-13 19:02:42 by jwe]
jwe
parents: 3726
diff changeset
1943 retval.resize (n, nrhs);
5275
23b37da9fd5b [project @ 2005-04-08 16:07:35 by jwe]
jwe
parents: 5105
diff changeset
1944 for (octave_idx_type j = 0; j < nrhs; j++)
23b37da9fd5b [project @ 2005-04-08 16:07:35 by jwe]
jwe
parents: 5105
diff changeset
1945 for (octave_idx_type i = 0; i < n; i++)
3752
719a44ff67c9 [project @ 2000-12-13 19:02:42 by jwe]
jwe
parents: 3726
diff changeset
1946 retval.elem (i, j) = result.elem (i, j);
719a44ff67c9 [project @ 2000-12-13 19:02:42 by jwe]
jwe
parents: 3726
diff changeset
1947 }
1948
d7dec93d4b87 [project @ 1996-02-14 03:45:49 by jwe]
jwe
parents: 1882
diff changeset
1948 }
458
38cb88095913 [project @ 1994-06-06 00:41:10 by jwe]
jwe
parents:
diff changeset
1949 }
38cb88095913 [project @ 1994-06-06 00:41:10 by jwe]
jwe
parents:
diff changeset
1950
38cb88095913 [project @ 1994-06-06 00:41:10 by jwe]
jwe
parents:
diff changeset
1951 return retval;
38cb88095913 [project @ 1994-06-06 00:41:10 by jwe]
jwe
parents:
diff changeset
1952 }
38cb88095913 [project @ 1994-06-06 00:41:10 by jwe]
jwe
parents:
diff changeset
1953
38cb88095913 [project @ 1994-06-06 00:41:10 by jwe]
jwe
parents:
diff changeset
1954 ComplexMatrix
38cb88095913 [project @ 1994-06-06 00:41:10 by jwe]
jwe
parents:
diff changeset
1955 Matrix::lssolve (const ComplexMatrix& b) const
38cb88095913 [project @ 1994-06-06 00:41:10 by jwe]
jwe
parents:
diff changeset
1956 {
38cb88095913 [project @ 1994-06-06 00:41:10 by jwe]
jwe
parents:
diff changeset
1957 ComplexMatrix tmp (*this);
5275
23b37da9fd5b [project @ 2005-04-08 16:07:35 by jwe]
jwe
parents: 5105
diff changeset
1958 octave_idx_type info;
23b37da9fd5b [project @ 2005-04-08 16:07:35 by jwe]
jwe
parents: 5105
diff changeset
1959 octave_idx_type rank;
1484
84796decb9af [project @ 1995-09-26 09:30:32 by jwe]
jwe
parents: 1472
diff changeset
1960 return tmp.lssolve (b, info, rank);
458
38cb88095913 [project @ 1994-06-06 00:41:10 by jwe]
jwe
parents:
diff changeset
1961 }
38cb88095913 [project @ 1994-06-06 00:41:10 by jwe]
jwe
parents:
diff changeset
1962
38cb88095913 [project @ 1994-06-06 00:41:10 by jwe]
jwe
parents:
diff changeset
1963 ComplexMatrix
5275
23b37da9fd5b [project @ 2005-04-08 16:07:35 by jwe]
jwe
parents: 5105
diff changeset
1964 Matrix::lssolve (const ComplexMatrix& b, octave_idx_type& info) const
458
38cb88095913 [project @ 1994-06-06 00:41:10 by jwe]
jwe
parents:
diff changeset
1965 {
38cb88095913 [project @ 1994-06-06 00:41:10 by jwe]
jwe
parents:
diff changeset
1966 ComplexMatrix tmp (*this);
5275
23b37da9fd5b [project @ 2005-04-08 16:07:35 by jwe]
jwe
parents: 5105
diff changeset
1967 octave_idx_type rank;
1484
84796decb9af [project @ 1995-09-26 09:30:32 by jwe]
jwe
parents: 1472
diff changeset
1968 return tmp.lssolve (b, info, rank);
458
38cb88095913 [project @ 1994-06-06 00:41:10 by jwe]
jwe
parents:
diff changeset
1969 }
38cb88095913 [project @ 1994-06-06 00:41:10 by jwe]
jwe
parents:
diff changeset
1970
38cb88095913 [project @ 1994-06-06 00:41:10 by jwe]
jwe
parents:
diff changeset
1971 ComplexMatrix
5275
23b37da9fd5b [project @ 2005-04-08 16:07:35 by jwe]
jwe
parents: 5105
diff changeset
1972 Matrix::lssolve (const ComplexMatrix& b, octave_idx_type& info, octave_idx_type& rank) const
458
38cb88095913 [project @ 1994-06-06 00:41:10 by jwe]
jwe
parents:
diff changeset
1973 {
38cb88095913 [project @ 1994-06-06 00:41:10 by jwe]
jwe
parents:
diff changeset
1974 ComplexMatrix tmp (*this);
1484
84796decb9af [project @ 1995-09-26 09:30:32 by jwe]
jwe
parents: 1472
diff changeset
1975 return tmp.lssolve (b, info, rank);
458
38cb88095913 [project @ 1994-06-06 00:41:10 by jwe]
jwe
parents:
diff changeset
1976 }
38cb88095913 [project @ 1994-06-06 00:41:10 by jwe]
jwe
parents:
diff changeset
1977
38cb88095913 [project @ 1994-06-06 00:41:10 by jwe]
jwe
parents:
diff changeset
1978 ColumnVector
38cb88095913 [project @ 1994-06-06 00:41:10 by jwe]
jwe
parents:
diff changeset
1979 Matrix::lssolve (const ColumnVector& b) const
38cb88095913 [project @ 1994-06-06 00:41:10 by jwe]
jwe
parents:
diff changeset
1980 {
5275
23b37da9fd5b [project @ 2005-04-08 16:07:35 by jwe]
jwe
parents: 5105
diff changeset
1981 octave_idx_type info;
23b37da9fd5b [project @ 2005-04-08 16:07:35 by jwe]
jwe
parents: 5105
diff changeset
1982 octave_idx_type rank;
1484
84796decb9af [project @ 1995-09-26 09:30:32 by jwe]
jwe
parents: 1472
diff changeset
1983 return lssolve (b, info, rank);
458
38cb88095913 [project @ 1994-06-06 00:41:10 by jwe]
jwe
parents:
diff changeset
1984 }
38cb88095913 [project @ 1994-06-06 00:41:10 by jwe]
jwe
parents:
diff changeset
1985
38cb88095913 [project @ 1994-06-06 00:41:10 by jwe]
jwe
parents:
diff changeset
1986 ColumnVector
5275
23b37da9fd5b [project @ 2005-04-08 16:07:35 by jwe]
jwe
parents: 5105
diff changeset
1987 Matrix::lssolve (const ColumnVector& b, octave_idx_type& info) const
458
38cb88095913 [project @ 1994-06-06 00:41:10 by jwe]
jwe
parents:
diff changeset
1988 {
5275
23b37da9fd5b [project @ 2005-04-08 16:07:35 by jwe]
jwe
parents: 5105
diff changeset
1989 octave_idx_type rank;
458
38cb88095913 [project @ 1994-06-06 00:41:10 by jwe]
jwe
parents:
diff changeset
1990 return lssolve (b, info, rank);
38cb88095913 [project @ 1994-06-06 00:41:10 by jwe]
jwe
parents:
diff changeset
1991 }
38cb88095913 [project @ 1994-06-06 00:41:10 by jwe]
jwe
parents:
diff changeset
1992
38cb88095913 [project @ 1994-06-06 00:41:10 by jwe]
jwe
parents:
diff changeset
1993 ColumnVector
5275
23b37da9fd5b [project @ 2005-04-08 16:07:35 by jwe]
jwe
parents: 5105
diff changeset
1994 Matrix::lssolve (const ColumnVector& b, octave_idx_type& info, octave_idx_type& rank) const
458
38cb88095913 [project @ 1994-06-06 00:41:10 by jwe]
jwe
parents:
diff changeset
1995 {
1948
d7dec93d4b87 [project @ 1996-02-14 03:45:49 by jwe]
jwe
parents: 1882
diff changeset
1996 ColumnVector retval;
d7dec93d4b87 [project @ 1996-02-14 03:45:49 by jwe]
jwe
parents: 1882
diff changeset
1997
5275
23b37da9fd5b [project @ 2005-04-08 16:07:35 by jwe]
jwe
parents: 5105
diff changeset
1998 octave_idx_type nrhs = 1;
23b37da9fd5b [project @ 2005-04-08 16:07:35 by jwe]
jwe
parents: 5105
diff changeset
1999
23b37da9fd5b [project @ 2005-04-08 16:07:35 by jwe]
jwe
parents: 5105
diff changeset
2000 octave_idx_type m = rows ();
23b37da9fd5b [project @ 2005-04-08 16:07:35 by jwe]
jwe
parents: 5105
diff changeset
2001 octave_idx_type n = cols ();
458
38cb88095913 [project @ 1994-06-06 00:41:10 by jwe]
jwe
parents:
diff changeset
2002
38cb88095913 [project @ 1994-06-06 00:41:10 by jwe]
jwe
parents:
diff changeset
2003 if (m == 0 || n == 0 || m != b.length ())
1948
d7dec93d4b87 [project @ 1996-02-14 03:45:49 by jwe]
jwe
parents: 1882
diff changeset
2004 (*current_liboctave_error_handler)
d7dec93d4b87 [project @ 1996-02-14 03:45:49 by jwe]
jwe
parents: 1882
diff changeset
2005 ("matrix dimension mismatch in solution of least squares problem");
d7dec93d4b87 [project @ 1996-02-14 03:45:49 by jwe]
jwe
parents: 1882
diff changeset
2006 else
458
38cb88095913 [project @ 1994-06-06 00:41:10 by jwe]
jwe
parents:
diff changeset
2007 {
1948
d7dec93d4b87 [project @ 1996-02-14 03:45:49 by jwe]
jwe
parents: 1882
diff changeset
2008 Matrix atmp = *this;
d7dec93d4b87 [project @ 1996-02-14 03:45:49 by jwe]
jwe
parents: 1882
diff changeset
2009 double *tmp_data = atmp.fortran_vec ();
d7dec93d4b87 [project @ 1996-02-14 03:45:49 by jwe]
jwe
parents: 1882
diff changeset
2010
5275
23b37da9fd5b [project @ 2005-04-08 16:07:35 by jwe]
jwe
parents: 5105
diff changeset
2011 octave_idx_type nrr = m > n ? m : n;
1948
d7dec93d4b87 [project @ 1996-02-14 03:45:49 by jwe]
jwe
parents: 1882
diff changeset
2012 ColumnVector result (nrr);
d7dec93d4b87 [project @ 1996-02-14 03:45:49 by jwe]
jwe
parents: 1882
diff changeset
2013
5275
23b37da9fd5b [project @ 2005-04-08 16:07:35 by jwe]
jwe
parents: 5105
diff changeset
2014 for (octave_idx_type i = 0; i < m; i++)
1948
d7dec93d4b87 [project @ 1996-02-14 03:45:49 by jwe]
jwe
parents: 1882
diff changeset
2015 result.elem (i) = b.elem (i);
d7dec93d4b87 [project @ 1996-02-14 03:45:49 by jwe]
jwe
parents: 1882
diff changeset
2016
d7dec93d4b87 [project @ 1996-02-14 03:45:49 by jwe]
jwe
parents: 1882
diff changeset
2017 double *presult = result.fortran_vec ();
d7dec93d4b87 [project @ 1996-02-14 03:45:49 by jwe]
jwe
parents: 1882
diff changeset
2018
5275
23b37da9fd5b [project @ 2005-04-08 16:07:35 by jwe]
jwe
parents: 5105
diff changeset
2019 octave_idx_type len_s = m < n ? m : n;
1948
d7dec93d4b87 [project @ 1996-02-14 03:45:49 by jwe]
jwe
parents: 1882
diff changeset
2020 Array<double> s (len_s);
d7dec93d4b87 [project @ 1996-02-14 03:45:49 by jwe]
jwe
parents: 1882
diff changeset
2021 double *ps = s.fortran_vec ();
d7dec93d4b87 [project @ 1996-02-14 03:45:49 by jwe]
jwe
parents: 1882
diff changeset
2022
d7dec93d4b87 [project @ 1996-02-14 03:45:49 by jwe]
jwe
parents: 1882
diff changeset
2023 double rcond = -1.0;
d7dec93d4b87 [project @ 1996-02-14 03:45:49 by jwe]
jwe
parents: 1882
diff changeset
2024
3752
719a44ff67c9 [project @ 2000-12-13 19:02:42 by jwe]
jwe
parents: 3726
diff changeset
2025 // Ask DGELSS what the dimension of WORK should be.
719a44ff67c9 [project @ 2000-12-13 19:02:42 by jwe]
jwe
parents: 3726
diff changeset
2026
5275
23b37da9fd5b [project @ 2005-04-08 16:07:35 by jwe]
jwe
parents: 5105
diff changeset
2027 octave_idx_type lwork = -1;
3752
719a44ff67c9 [project @ 2000-12-13 19:02:42 by jwe]
jwe
parents: 3726
diff changeset
2028
719a44ff67c9 [project @ 2000-12-13 19:02:42 by jwe]
jwe
parents: 3726
diff changeset
2029 Array<double> work (1);
719a44ff67c9 [project @ 2000-12-13 19:02:42 by jwe]
jwe
parents: 3726
diff changeset
2030
719a44ff67c9 [project @ 2000-12-13 19:02:42 by jwe]
jwe
parents: 3726
diff changeset
2031 F77_XFCN (dgelss, DGELSS, (m, n, nrhs, tmp_data, m, presult, nrr, ps,
719a44ff67c9 [project @ 2000-12-13 19:02:42 by jwe]
jwe
parents: 3726
diff changeset
2032 rcond, rank, work.fortran_vec (),
719a44ff67c9 [project @ 2000-12-13 19:02:42 by jwe]
jwe
parents: 3726
diff changeset
2033 lwork, info));
1948
d7dec93d4b87 [project @ 1996-02-14 03:45:49 by jwe]
jwe
parents: 1882
diff changeset
2034
d7dec93d4b87 [project @ 1996-02-14 03:45:49 by jwe]
jwe
parents: 1882
diff changeset
2035 if (f77_exception_encountered)
d7dec93d4b87 [project @ 1996-02-14 03:45:49 by jwe]
jwe
parents: 1882
diff changeset
2036 (*current_liboctave_error_handler) ("unrecoverable error in dgelss");
d7dec93d4b87 [project @ 1996-02-14 03:45:49 by jwe]
jwe
parents: 1882
diff changeset
2037 else
d7dec93d4b87 [project @ 1996-02-14 03:45:49 by jwe]
jwe
parents: 1882
diff changeset
2038 {
5275
23b37da9fd5b [project @ 2005-04-08 16:07:35 by jwe]
jwe
parents: 5105
diff changeset
2039 lwork = static_cast<octave_idx_type> (work(0));
3752
719a44ff67c9 [project @ 2000-12-13 19:02:42 by jwe]
jwe
parents: 3726
diff changeset
2040 work.resize (lwork);
719a44ff67c9 [project @ 2000-12-13 19:02:42 by jwe]
jwe
parents: 3726
diff changeset
2041
719a44ff67c9 [project @ 2000-12-13 19:02:42 by jwe]
jwe
parents: 3726
diff changeset
2042 F77_XFCN (dgelss, DGELSS, (m, n, nrhs, tmp_data, m, presult,
719a44ff67c9 [project @ 2000-12-13 19:02:42 by jwe]
jwe
parents: 3726
diff changeset
2043 nrr, ps, rcond, rank,
719a44ff67c9 [project @ 2000-12-13 19:02:42 by jwe]
jwe
parents: 3726
diff changeset
2044 work.fortran_vec (), lwork, info));
719a44ff67c9 [project @ 2000-12-13 19:02:42 by jwe]
jwe
parents: 3726
diff changeset
2045
719a44ff67c9 [project @ 2000-12-13 19:02:42 by jwe]
jwe
parents: 3726
diff changeset
2046 if (f77_exception_encountered)
719a44ff67c9 [project @ 2000-12-13 19:02:42 by jwe]
jwe
parents: 3726
diff changeset
2047 (*current_liboctave_error_handler)
719a44ff67c9 [project @ 2000-12-13 19:02:42 by jwe]
jwe
parents: 3726
diff changeset
2048 ("unrecoverable error in dgelss");
719a44ff67c9 [project @ 2000-12-13 19:02:42 by jwe]
jwe
parents: 3726
diff changeset
2049 else
719a44ff67c9 [project @ 2000-12-13 19:02:42 by jwe]
jwe
parents: 3726
diff changeset
2050 {
719a44ff67c9 [project @ 2000-12-13 19:02:42 by jwe]
jwe
parents: 3726
diff changeset
2051 retval.resize (n);
5275
23b37da9fd5b [project @ 2005-04-08 16:07:35 by jwe]
jwe
parents: 5105
diff changeset
2052 for (octave_idx_type i = 0; i < n; i++)
3752
719a44ff67c9 [project @ 2000-12-13 19:02:42 by jwe]
jwe
parents: 3726
diff changeset
2053 retval.elem (i) = result.elem (i);
719a44ff67c9 [project @ 2000-12-13 19:02:42 by jwe]
jwe
parents: 3726
diff changeset
2054 }
1948
d7dec93d4b87 [project @ 1996-02-14 03:45:49 by jwe]
jwe
parents: 1882
diff changeset
2055 }
458
38cb88095913 [project @ 1994-06-06 00:41:10 by jwe]
jwe
parents:
diff changeset
2056 }
38cb88095913 [project @ 1994-06-06 00:41:10 by jwe]
jwe
parents:
diff changeset
2057
38cb88095913 [project @ 1994-06-06 00:41:10 by jwe]
jwe
parents:
diff changeset
2058 return retval;
38cb88095913 [project @ 1994-06-06 00:41:10 by jwe]
jwe
parents:
diff changeset
2059 }
38cb88095913 [project @ 1994-06-06 00:41:10 by jwe]
jwe
parents:
diff changeset
2060
38cb88095913 [project @ 1994-06-06 00:41:10 by jwe]
jwe
parents:
diff changeset
2061 ComplexColumnVector
38cb88095913 [project @ 1994-06-06 00:41:10 by jwe]
jwe
parents:
diff changeset
2062 Matrix::lssolve (const ComplexColumnVector& b) const
38cb88095913 [project @ 1994-06-06 00:41:10 by jwe]
jwe
parents:
diff changeset
2063 {
38cb88095913 [project @ 1994-06-06 00:41:10 by jwe]
jwe
parents:
diff changeset
2064 ComplexMatrix tmp (*this);
38cb88095913 [project @ 1994-06-06 00:41:10 by jwe]
jwe
parents:
diff changeset
2065 return tmp.lssolve (b);
38cb88095913 [project @ 1994-06-06 00:41:10 by jwe]
jwe
parents:
diff changeset
2066 }
38cb88095913 [project @ 1994-06-06 00:41:10 by jwe]
jwe
parents:
diff changeset
2067
38cb88095913 [project @ 1994-06-06 00:41:10 by jwe]
jwe
parents:
diff changeset
2068 ComplexColumnVector
5275
23b37da9fd5b [project @ 2005-04-08 16:07:35 by jwe]
jwe
parents: 5105
diff changeset
2069 Matrix::lssolve (const ComplexColumnVector& b, octave_idx_type& info) const
458
38cb88095913 [project @ 1994-06-06 00:41:10 by jwe]
jwe
parents:
diff changeset
2070 {
38cb88095913 [project @ 1994-06-06 00:41:10 by jwe]
jwe
parents:
diff changeset
2071 ComplexMatrix tmp (*this);
38cb88095913 [project @ 1994-06-06 00:41:10 by jwe]
jwe
parents:
diff changeset
2072 return tmp.lssolve (b, info);
38cb88095913 [project @ 1994-06-06 00:41:10 by jwe]
jwe
parents:
diff changeset
2073 }
38cb88095913 [project @ 1994-06-06 00:41:10 by jwe]
jwe
parents:
diff changeset
2074
38cb88095913 [project @ 1994-06-06 00:41:10 by jwe]
jwe
parents:
diff changeset
2075 ComplexColumnVector
5275
23b37da9fd5b [project @ 2005-04-08 16:07:35 by jwe]
jwe
parents: 5105
diff changeset
2076 Matrix::lssolve (const ComplexColumnVector& b, octave_idx_type& info, octave_idx_type& rank) const
458
38cb88095913 [project @ 1994-06-06 00:41:10 by jwe]
jwe
parents:
diff changeset
2077 {
38cb88095913 [project @ 1994-06-06 00:41:10 by jwe]
jwe
parents:
diff changeset
2078 ComplexMatrix tmp (*this);
38cb88095913 [project @ 1994-06-06 00:41:10 by jwe]
jwe
parents:
diff changeset
2079 return tmp.lssolve (b, info, rank);
38cb88095913 [project @ 1994-06-06 00:41:10 by jwe]
jwe
parents:
diff changeset
2080 }
38cb88095913 [project @ 1994-06-06 00:41:10 by jwe]
jwe
parents:
diff changeset
2081
1819
8b8498bf8ec5 [project @ 1996-01-31 11:29:17 by jwe]
jwe
parents: 1698
diff changeset
2082 // Constants for matrix exponential calculation.
8b8498bf8ec5 [project @ 1996-01-31 11:29:17 by jwe]
jwe
parents: 1698
diff changeset
2083
8b8498bf8ec5 [project @ 1996-01-31 11:29:17 by jwe]
jwe
parents: 1698
diff changeset
2084 static double padec [] =
8b8498bf8ec5 [project @ 1996-01-31 11:29:17 by jwe]
jwe
parents: 1698
diff changeset
2085 {
8b8498bf8ec5 [project @ 1996-01-31 11:29:17 by jwe]
jwe
parents: 1698
diff changeset
2086 5.0000000000000000e-1,
8b8498bf8ec5 [project @ 1996-01-31 11:29:17 by jwe]
jwe
parents: 1698
diff changeset
2087 1.1666666666666667e-1,
8b8498bf8ec5 [project @ 1996-01-31 11:29:17 by jwe]
jwe
parents: 1698
diff changeset
2088 1.6666666666666667e-2,
8b8498bf8ec5 [project @ 1996-01-31 11:29:17 by jwe]
jwe
parents: 1698
diff changeset
2089 1.6025641025641026e-3,
8b8498bf8ec5 [project @ 1996-01-31 11:29:17 by jwe]
jwe
parents: 1698
diff changeset
2090 1.0683760683760684e-4,
8b8498bf8ec5 [project @ 1996-01-31 11:29:17 by jwe]
jwe
parents: 1698
diff changeset
2091 4.8562548562548563e-6,
8b8498bf8ec5 [project @ 1996-01-31 11:29:17 by jwe]
jwe
parents: 1698
diff changeset
2092 1.3875013875013875e-7,
8b8498bf8ec5 [project @ 1996-01-31 11:29:17 by jwe]
jwe
parents: 1698
diff changeset
2093 1.9270852604185938e-9,
8b8498bf8ec5 [project @ 1996-01-31 11:29:17 by jwe]
jwe
parents: 1698
diff changeset
2094 };
8b8498bf8ec5 [project @ 1996-01-31 11:29:17 by jwe]
jwe
parents: 1698
diff changeset
2095
8b8498bf8ec5 [project @ 1996-01-31 11:29:17 by jwe]
jwe
parents: 1698
diff changeset
2096 Matrix
8b8498bf8ec5 [project @ 1996-01-31 11:29:17 by jwe]
jwe
parents: 1698
diff changeset
2097 Matrix::expm (void) const
8b8498bf8ec5 [project @ 1996-01-31 11:29:17 by jwe]
jwe
parents: 1698
diff changeset
2098 {
8b8498bf8ec5 [project @ 1996-01-31 11:29:17 by jwe]
jwe
parents: 1698
diff changeset
2099 Matrix retval;
8b8498bf8ec5 [project @ 1996-01-31 11:29:17 by jwe]
jwe
parents: 1698
diff changeset
2100
8b8498bf8ec5 [project @ 1996-01-31 11:29:17 by jwe]
jwe
parents: 1698
diff changeset
2101 Matrix m = *this;
8b8498bf8ec5 [project @ 1996-01-31 11:29:17 by jwe]
jwe
parents: 1698
diff changeset
2102
5275
23b37da9fd5b [project @ 2005-04-08 16:07:35 by jwe]
jwe
parents: 5105
diff changeset
2103 octave_idx_type nc = columns ();
1819
8b8498bf8ec5 [project @ 1996-01-31 11:29:17 by jwe]
jwe
parents: 1698
diff changeset
2104
3130
02766207b74c [project @ 1998-01-25 08:27:23 by jwe]
jwe
parents: 3075
diff changeset
2105 // Preconditioning step 1: trace normalization to reduce dynamic
02766207b74c [project @ 1998-01-25 08:27:23 by jwe]
jwe
parents: 3075
diff changeset
2106 // range of poles, but avoid making stable eigenvalues unstable.
02766207b74c [project @ 1998-01-25 08:27:23 by jwe]
jwe
parents: 3075
diff changeset
2107
1819
8b8498bf8ec5 [project @ 1996-01-31 11:29:17 by jwe]
jwe
parents: 1698
diff changeset
2108 // trace shift value
3331
13cdcb7e5066 [project @ 1999-11-02 06:24:23 by jwe]
jwe
parents: 3248
diff changeset
2109 volatile double trshift = 0.0;
1819
8b8498bf8ec5 [project @ 1996-01-31 11:29:17 by jwe]
jwe
parents: 1698
diff changeset
2110
5275
23b37da9fd5b [project @ 2005-04-08 16:07:35 by jwe]
jwe
parents: 5105
diff changeset
2111 for (octave_idx_type i = 0; i < nc; i++)
1819
8b8498bf8ec5 [project @ 1996-01-31 11:29:17 by jwe]
jwe
parents: 1698
diff changeset
2112 trshift += m.elem (i, i);
8b8498bf8ec5 [project @ 1996-01-31 11:29:17 by jwe]
jwe
parents: 1698
diff changeset
2113
8b8498bf8ec5 [project @ 1996-01-31 11:29:17 by jwe]
jwe
parents: 1698
diff changeset
2114 trshift /= nc;
8b8498bf8ec5 [project @ 1996-01-31 11:29:17 by jwe]
jwe
parents: 1698
diff changeset
2115
3130
02766207b74c [project @ 1998-01-25 08:27:23 by jwe]
jwe
parents: 3075
diff changeset
2116 if (trshift > 0.0)
02766207b74c [project @ 1998-01-25 08:27:23 by jwe]
jwe
parents: 3075
diff changeset
2117 {
5275
23b37da9fd5b [project @ 2005-04-08 16:07:35 by jwe]
jwe
parents: 5105
diff changeset
2118 for (octave_idx_type i = 0; i < nc; i++)
3130
02766207b74c [project @ 1998-01-25 08:27:23 by jwe]
jwe
parents: 3075
diff changeset
2119 m.elem (i, i) -= trshift;
02766207b74c [project @ 1998-01-25 08:27:23 by jwe]
jwe
parents: 3075
diff changeset
2120 }
1819
8b8498bf8ec5 [project @ 1996-01-31 11:29:17 by jwe]
jwe
parents: 1698
diff changeset
2121
3331
13cdcb7e5066 [project @ 1999-11-02 06:24:23 by jwe]
jwe
parents: 3248
diff changeset
2122 // Preconditioning step 2: balancing; code follows development
13cdcb7e5066 [project @ 1999-11-02 06:24:23 by jwe]
jwe
parents: 3248
diff changeset
2123 // in AEPBAL
13cdcb7e5066 [project @ 1999-11-02 06:24:23 by jwe]
jwe
parents: 3248
diff changeset
2124
13cdcb7e5066 [project @ 1999-11-02 06:24:23 by jwe]
jwe
parents: 3248
diff changeset
2125 double *p_m = m.fortran_vec ();
13cdcb7e5066 [project @ 1999-11-02 06:24:23 by jwe]
jwe
parents: 3248
diff changeset
2126
5275
23b37da9fd5b [project @ 2005-04-08 16:07:35 by jwe]
jwe
parents: 5105
diff changeset
2127 octave_idx_type info, ilo, ihi, ilos, ihis;
3468
a2dc6de198f9 [project @ 2000-01-21 22:13:13 by jwe]
jwe
parents: 3466
diff changeset
2128 Array<double> dpermute (nc);
a2dc6de198f9 [project @ 2000-01-21 22:13:13 by jwe]
jwe
parents: 3466
diff changeset
2129 Array<double> dscale (nc);
3466
9ff5622c993e [project @ 2000-01-21 19:30:46 by hodelas]
hodelas
parents: 3354
diff changeset
2130
3468
a2dc6de198f9 [project @ 2000-01-21 22:13:13 by jwe]
jwe
parents: 3466
diff changeset
2131 // permutation first
a2dc6de198f9 [project @ 2000-01-21 22:13:13 by jwe]
jwe
parents: 3466
diff changeset
2132 char job = 'P';
4552
6f3382e08a52 [project @ 2003-10-27 20:38:02 by jwe]
jwe
parents: 4513
diff changeset
2133 F77_XFCN (dgebal, DGEBAL, (F77_CONST_CHAR_ARG2 (&job, 1),
6f3382e08a52 [project @ 2003-10-27 20:38:02 by jwe]
jwe
parents: 4513
diff changeset
2134 nc, p_m, nc, ilo, ihi,
6f3382e08a52 [project @ 2003-10-27 20:38:02 by jwe]
jwe
parents: 4513
diff changeset
2135 dpermute.fortran_vec (), info
6f3382e08a52 [project @ 2003-10-27 20:38:02 by jwe]
jwe
parents: 4513
diff changeset
2136 F77_CHAR_ARG_LEN (1)));
3466
9ff5622c993e [project @ 2000-01-21 19:30:46 by hodelas]
hodelas
parents: 3354
diff changeset
2137
3468
a2dc6de198f9 [project @ 2000-01-21 22:13:13 by jwe]
jwe
parents: 3466
diff changeset
2138 // then scaling
a2dc6de198f9 [project @ 2000-01-21 22:13:13 by jwe]
jwe
parents: 3466
diff changeset
2139 job = 'S';
4552
6f3382e08a52 [project @ 2003-10-27 20:38:02 by jwe]
jwe
parents: 4513
diff changeset
2140 F77_XFCN (dgebal, DGEBAL, (F77_CONST_CHAR_ARG2 (&job, 1),
6f3382e08a52 [project @ 2003-10-27 20:38:02 by jwe]
jwe
parents: 4513
diff changeset
2141 nc, p_m, nc, ilos, ihis,
6f3382e08a52 [project @ 2003-10-27 20:38:02 by jwe]
jwe
parents: 4513
diff changeset
2142 dscale.fortran_vec (), info
6f3382e08a52 [project @ 2003-10-27 20:38:02 by jwe]
jwe
parents: 4513
diff changeset
2143 F77_CHAR_ARG_LEN (1)));
3331
13cdcb7e5066 [project @ 1999-11-02 06:24:23 by jwe]
jwe
parents: 3248
diff changeset
2144
13cdcb7e5066 [project @ 1999-11-02 06:24:23 by jwe]
jwe
parents: 3248
diff changeset
2145 if (f77_exception_encountered)
13cdcb7e5066 [project @ 1999-11-02 06:24:23 by jwe]
jwe
parents: 3248
diff changeset
2146 {
13cdcb7e5066 [project @ 1999-11-02 06:24:23 by jwe]
jwe
parents: 3248
diff changeset
2147 (*current_liboctave_error_handler) ("unrecoverable error in dgebal");
13cdcb7e5066 [project @ 1999-11-02 06:24:23 by jwe]
jwe
parents: 3248
diff changeset
2148 return retval;
13cdcb7e5066 [project @ 1999-11-02 06:24:23 by jwe]
jwe
parents: 3248
diff changeset
2149 }
13cdcb7e5066 [project @ 1999-11-02 06:24:23 by jwe]
jwe
parents: 3248
diff changeset
2150
1819
8b8498bf8ec5 [project @ 1996-01-31 11:29:17 by jwe]
jwe
parents: 1698
diff changeset
2151 // Preconditioning step 3: scaling.
3331
13cdcb7e5066 [project @ 1999-11-02 06:24:23 by jwe]
jwe
parents: 3248
diff changeset
2152
1819
8b8498bf8ec5 [project @ 1996-01-31 11:29:17 by jwe]
jwe
parents: 1698
diff changeset
2153 ColumnVector work(nc);
3130
02766207b74c [project @ 1998-01-25 08:27:23 by jwe]
jwe
parents: 3075
diff changeset
2154 double inf_norm;
3331
13cdcb7e5066 [project @ 1999-11-02 06:24:23 by jwe]
jwe
parents: 3248
diff changeset
2155
4552
6f3382e08a52 [project @ 2003-10-27 20:38:02 by jwe]
jwe
parents: 4513
diff changeset
2156 F77_XFCN (xdlange, XDLANGE, (F77_CONST_CHAR_ARG2 ("I", 1),
6f3382e08a52 [project @ 2003-10-27 20:38:02 by jwe]
jwe
parents: 4513
diff changeset
2157 nc, nc, m.fortran_vec (), nc,
6f3382e08a52 [project @ 2003-10-27 20:38:02 by jwe]
jwe
parents: 4513
diff changeset
2158 work.fortran_vec (), inf_norm
6f3382e08a52 [project @ 2003-10-27 20:38:02 by jwe]
jwe
parents: 4513
diff changeset
2159 F77_CHAR_ARG_LEN (1)));
3331
13cdcb7e5066 [project @ 1999-11-02 06:24:23 by jwe]
jwe
parents: 3248
diff changeset
2160
13cdcb7e5066 [project @ 1999-11-02 06:24:23 by jwe]
jwe
parents: 3248
diff changeset
2161 if (f77_exception_encountered)
13cdcb7e5066 [project @ 1999-11-02 06:24:23 by jwe]
jwe
parents: 3248
diff changeset
2162 {
13cdcb7e5066 [project @ 1999-11-02 06:24:23 by jwe]
jwe
parents: 3248
diff changeset
2163 (*current_liboctave_error_handler) ("unrecoverable error in dlange");
13cdcb7e5066 [project @ 1999-11-02 06:24:23 by jwe]
jwe
parents: 3248
diff changeset
2164 return retval;
13cdcb7e5066 [project @ 1999-11-02 06:24:23 by jwe]
jwe
parents: 3248
diff changeset
2165 }
1819
8b8498bf8ec5 [project @ 1996-01-31 11:29:17 by jwe]
jwe
parents: 1698
diff changeset
2166
5275
23b37da9fd5b [project @ 2005-04-08 16:07:35 by jwe]
jwe
parents: 5105
diff changeset
2167 octave_idx_type sqpow = static_cast<octave_idx_type> (inf_norm > 0.0
1819
8b8498bf8ec5 [project @ 1996-01-31 11:29:17 by jwe]
jwe
parents: 1698
diff changeset
2168 ? (1.0 + log (inf_norm) / log (2.0))
8b8498bf8ec5 [project @ 1996-01-31 11:29:17 by jwe]
jwe
parents: 1698
diff changeset
2169 : 0.0);
3331
13cdcb7e5066 [project @ 1999-11-02 06:24:23 by jwe]
jwe
parents: 3248
diff changeset
2170
1819
8b8498bf8ec5 [project @ 1996-01-31 11:29:17 by jwe]
jwe
parents: 1698
diff changeset
2171 // Check whether we need to square at all.
3331
13cdcb7e5066 [project @ 1999-11-02 06:24:23 by jwe]
jwe
parents: 3248
diff changeset
2172
1819
8b8498bf8ec5 [project @ 1996-01-31 11:29:17 by jwe]
jwe
parents: 1698
diff changeset
2173 if (sqpow < 0)
8b8498bf8ec5 [project @ 1996-01-31 11:29:17 by jwe]
jwe
parents: 1698
diff changeset
2174 sqpow = 0;
3331
13cdcb7e5066 [project @ 1999-11-02 06:24:23 by jwe]
jwe
parents: 3248
diff changeset
2175
1819
8b8498bf8ec5 [project @ 1996-01-31 11:29:17 by jwe]
jwe
parents: 1698
diff changeset
2176 if (sqpow > 0)
8b8498bf8ec5 [project @ 1996-01-31 11:29:17 by jwe]
jwe
parents: 1698
diff changeset
2177 {
8b8498bf8ec5 [project @ 1996-01-31 11:29:17 by jwe]
jwe
parents: 1698
diff changeset
2178 double scale_factor = 1.0;
5275
23b37da9fd5b [project @ 2005-04-08 16:07:35 by jwe]
jwe
parents: 5105
diff changeset
2179 for (octave_idx_type i = 0; i < sqpow; i++)
1819
8b8498bf8ec5 [project @ 1996-01-31 11:29:17 by jwe]
jwe
parents: 1698
diff changeset
2180 scale_factor *= 2.0;
3331
13cdcb7e5066 [project @ 1999-11-02 06:24:23 by jwe]
jwe
parents: 3248
diff changeset
2181
1819
8b8498bf8ec5 [project @ 1996-01-31 11:29:17 by jwe]
jwe
parents: 1698
diff changeset
2182 m = m / scale_factor;
8b8498bf8ec5 [project @ 1996-01-31 11:29:17 by jwe]
jwe
parents: 1698
diff changeset
2183 }
3331
13cdcb7e5066 [project @ 1999-11-02 06:24:23 by jwe]
jwe
parents: 3248
diff changeset
2184
1819
8b8498bf8ec5 [project @ 1996-01-31 11:29:17 by jwe]
jwe
parents: 1698
diff changeset
2185 // npp, dpp: pade' approx polynomial matrices.
3331
13cdcb7e5066 [project @ 1999-11-02 06:24:23 by jwe]
jwe
parents: 3248
diff changeset
2186
1819
8b8498bf8ec5 [project @ 1996-01-31 11:29:17 by jwe]
jwe
parents: 1698
diff changeset
2187 Matrix npp (nc, nc, 0.0);
8b8498bf8ec5 [project @ 1996-01-31 11:29:17 by jwe]
jwe
parents: 1698
diff changeset
2188 Matrix dpp = npp;
3331
13cdcb7e5066 [project @ 1999-11-02 06:24:23 by jwe]
jwe
parents: 3248
diff changeset
2189
1819
8b8498bf8ec5 [project @ 1996-01-31 11:29:17 by jwe]
jwe
parents: 1698
diff changeset
2190 // Now powers a^8 ... a^1.
3331
13cdcb7e5066 [project @ 1999-11-02 06:24:23 by jwe]
jwe
parents: 3248
diff changeset
2191
5275
23b37da9fd5b [project @ 2005-04-08 16:07:35 by jwe]
jwe
parents: 5105
diff changeset
2192 octave_idx_type minus_one_j = -1;
23b37da9fd5b [project @ 2005-04-08 16:07:35 by jwe]
jwe
parents: 5105
diff changeset
2193 for (octave_idx_type j = 7; j >= 0; j--)
1819
8b8498bf8ec5 [project @ 1996-01-31 11:29:17 by jwe]
jwe
parents: 1698
diff changeset
2194 {
3573
6ae6f1180e62 [project @ 2000-02-04 09:01:59 by jwe]
jwe
parents: 3572
diff changeset
2195 npp = m * npp + padec[j] * m;
6ae6f1180e62 [project @ 2000-02-04 09:01:59 by jwe]
jwe
parents: 3572
diff changeset
2196 dpp = m * dpp + (minus_one_j * padec[j]) * m;
1819
8b8498bf8ec5 [project @ 1996-01-31 11:29:17 by jwe]
jwe
parents: 1698
diff changeset
2197 minus_one_j *= -1;
8b8498bf8ec5 [project @ 1996-01-31 11:29:17 by jwe]
jwe
parents: 1698
diff changeset
2198 }
3331
13cdcb7e5066 [project @ 1999-11-02 06:24:23 by jwe]
jwe
parents: 3248
diff changeset
2199
1819
8b8498bf8ec5 [project @ 1996-01-31 11:29:17 by jwe]
jwe
parents: 1698
diff changeset
2200 // Zero power.
3331
13cdcb7e5066 [project @ 1999-11-02 06:24:23 by jwe]
jwe
parents: 3248
diff changeset
2201
1819
8b8498bf8ec5 [project @ 1996-01-31 11:29:17 by jwe]
jwe
parents: 1698
diff changeset
2202 dpp = -dpp;
5275
23b37da9fd5b [project @ 2005-04-08 16:07:35 by jwe]
jwe
parents: 5105
diff changeset
2203 for (octave_idx_type j = 0; j < nc; j++)
1819
8b8498bf8ec5 [project @ 1996-01-31 11:29:17 by jwe]
jwe
parents: 1698
diff changeset
2204 {
8b8498bf8ec5 [project @ 1996-01-31 11:29:17 by jwe]
jwe
parents: 1698
diff changeset
2205 npp.elem (j, j) += 1.0;
8b8498bf8ec5 [project @ 1996-01-31 11:29:17 by jwe]
jwe
parents: 1698
diff changeset
2206 dpp.elem (j, j) += 1.0;
8b8498bf8ec5 [project @ 1996-01-31 11:29:17 by jwe]
jwe
parents: 1698
diff changeset
2207 }
3331
13cdcb7e5066 [project @ 1999-11-02 06:24:23 by jwe]
jwe
parents: 3248
diff changeset
2208
1819
8b8498bf8ec5 [project @ 1996-01-31 11:29:17 by jwe]
jwe
parents: 1698
diff changeset
2209 // Compute pade approximation = inverse (dpp) * npp.
8b8498bf8ec5 [project @ 1996-01-31 11:29:17 by jwe]
jwe
parents: 1698
diff changeset
2210
3331
13cdcb7e5066 [project @ 1999-11-02 06:24:23 by jwe]
jwe
parents: 3248
diff changeset
2211 retval = dpp.solve (npp, info);
13cdcb7e5066 [project @ 1999-11-02 06:24:23 by jwe]
jwe
parents: 3248
diff changeset
2212
1819
8b8498bf8ec5 [project @ 1996-01-31 11:29:17 by jwe]
jwe
parents: 1698
diff changeset
2213 // Reverse preconditioning step 3: repeated squaring.
3331
13cdcb7e5066 [project @ 1999-11-02 06:24:23 by jwe]
jwe
parents: 3248
diff changeset
2214
1819
8b8498bf8ec5 [project @ 1996-01-31 11:29:17 by jwe]
jwe
parents: 1698
diff changeset
2215 while (sqpow)
8b8498bf8ec5 [project @ 1996-01-31 11:29:17 by jwe]
jwe
parents: 1698
diff changeset
2216 {
8b8498bf8ec5 [project @ 1996-01-31 11:29:17 by jwe]
jwe
parents: 1698
diff changeset
2217 retval = retval * retval;
8b8498bf8ec5 [project @ 1996-01-31 11:29:17 by jwe]
jwe
parents: 1698
diff changeset
2218 sqpow--;
8b8498bf8ec5 [project @ 1996-01-31 11:29:17 by jwe]
jwe
parents: 1698
diff changeset
2219 }
3331
13cdcb7e5066 [project @ 1999-11-02 06:24:23 by jwe]
jwe
parents: 3248
diff changeset
2220
1819
8b8498bf8ec5 [project @ 1996-01-31 11:29:17 by jwe]
jwe
parents: 1698
diff changeset
2221 // Reverse preconditioning step 2: inverse balancing.
3466
9ff5622c993e [project @ 2000-01-21 19:30:46 by hodelas]
hodelas
parents: 3354
diff changeset
2222 // apply inverse scaling to computed exponential
5275
23b37da9fd5b [project @ 2005-04-08 16:07:35 by jwe]
jwe
parents: 5105
diff changeset
2223 for (octave_idx_type i = 0; i < nc; i++)
23b37da9fd5b [project @ 2005-04-08 16:07:35 by jwe]
jwe
parents: 5105
diff changeset
2224 for (octave_idx_type j = 0; j < nc; j++)
3468
a2dc6de198f9 [project @ 2000-01-21 22:13:13 by jwe]
jwe
parents: 3466
diff changeset
2225 retval(i,j) *= dscale(i) / dscale(j);
3466
9ff5622c993e [project @ 2000-01-21 19:30:46 by hodelas]
hodelas
parents: 3354
diff changeset
2226
4153
6b96ce9f5743 [project @ 2002-11-06 20:38:49 by jwe]
jwe
parents: 4130
diff changeset
2227 OCTAVE_QUIT;
6b96ce9f5743 [project @ 2002-11-06 20:38:49 by jwe]
jwe
parents: 4130
diff changeset
2228
3466
9ff5622c993e [project @ 2000-01-21 19:30:46 by hodelas]
hodelas
parents: 3354
diff changeset
2229 // construct balancing permutation vector
5275
23b37da9fd5b [project @ 2005-04-08 16:07:35 by jwe]
jwe
parents: 5105
diff changeset
2230 Array<octave_idx_type> iperm (nc);
23b37da9fd5b [project @ 2005-04-08 16:07:35 by jwe]
jwe
parents: 5105
diff changeset
2231 for (octave_idx_type i = 0; i < nc; i++)
4593
77566be8b9e9 [project @ 2003-11-11 17:25:42 by jwe]
jwe
parents: 4587
diff changeset
2232 iperm(i) = i; // identity permutation
3466
9ff5622c993e [project @ 2000-01-21 19:30:46 by hodelas]
hodelas
parents: 3354
diff changeset
2233
9ff5622c993e [project @ 2000-01-21 19:30:46 by hodelas]
hodelas
parents: 3354
diff changeset
2234 // leading permutations in forward order
5275
23b37da9fd5b [project @ 2005-04-08 16:07:35 by jwe]
jwe
parents: 5105
diff changeset
2235 for (octave_idx_type i = 0; i < (ilo-1); i++)
3468
a2dc6de198f9 [project @ 2000-01-21 22:13:13 by jwe]
jwe
parents: 3466
diff changeset
2236 {
5275
23b37da9fd5b [project @ 2005-04-08 16:07:35 by jwe]
jwe
parents: 5105
diff changeset
2237 octave_idx_type swapidx = static_cast<octave_idx_type> (dpermute(i)) - 1;
23b37da9fd5b [project @ 2005-04-08 16:07:35 by jwe]
jwe
parents: 5105
diff changeset
2238 octave_idx_type tmp = iperm(i);
4593
77566be8b9e9 [project @ 2003-11-11 17:25:42 by jwe]
jwe
parents: 4587
diff changeset
2239 iperm(i) = iperm (swapidx);
77566be8b9e9 [project @ 2003-11-11 17:25:42 by jwe]
jwe
parents: 4587
diff changeset
2240 iperm(swapidx) = tmp;
3468
a2dc6de198f9 [project @ 2000-01-21 22:13:13 by jwe]
jwe
parents: 3466
diff changeset
2241 }
3466
9ff5622c993e [project @ 2000-01-21 19:30:46 by hodelas]
hodelas
parents: 3354
diff changeset
2242
9ff5622c993e [project @ 2000-01-21 19:30:46 by hodelas]
hodelas
parents: 3354
diff changeset
2243 // trailing permutations must be done in reverse order
5275
23b37da9fd5b [project @ 2005-04-08 16:07:35 by jwe]
jwe
parents: 5105
diff changeset
2244 for (octave_idx_type i = nc - 1; i >= ihi; i--)
3468
a2dc6de198f9 [project @ 2000-01-21 22:13:13 by jwe]
jwe
parents: 3466
diff changeset
2245 {
5275
23b37da9fd5b [project @ 2005-04-08 16:07:35 by jwe]
jwe
parents: 5105
diff changeset
2246 octave_idx_type swapidx = static_cast<octave_idx_type> (dpermute(i)) - 1;
23b37da9fd5b [project @ 2005-04-08 16:07:35 by jwe]
jwe
parents: 5105
diff changeset
2247 octave_idx_type tmp = iperm(i);
4593
77566be8b9e9 [project @ 2003-11-11 17:25:42 by jwe]
jwe
parents: 4587
diff changeset
2248 iperm(i) = iperm(swapidx);
77566be8b9e9 [project @ 2003-11-11 17:25:42 by jwe]
jwe
parents: 4587
diff changeset
2249 iperm(swapidx) = tmp;
3468
a2dc6de198f9 [project @ 2000-01-21 22:13:13 by jwe]
jwe
parents: 3466
diff changeset
2250 }
3466
9ff5622c993e [project @ 2000-01-21 19:30:46 by hodelas]
hodelas
parents: 3354
diff changeset
2251
9ff5622c993e [project @ 2000-01-21 19:30:46 by hodelas]
hodelas
parents: 3354
diff changeset
2252 // construct inverse balancing permutation vector
5275
23b37da9fd5b [project @ 2005-04-08 16:07:35 by jwe]
jwe
parents: 5105
diff changeset
2253 Array<octave_idx_type> invpvec (nc);
23b37da9fd5b [project @ 2005-04-08 16:07:35 by jwe]
jwe
parents: 5105
diff changeset
2254 for (octave_idx_type i = 0; i < nc; i++)
4593
77566be8b9e9 [project @ 2003-11-11 17:25:42 by jwe]
jwe
parents: 4587
diff changeset
2255 invpvec(iperm(i)) = i; // Thanks to R. A. Lippert for this method
4153
6b96ce9f5743 [project @ 2002-11-06 20:38:49 by jwe]
jwe
parents: 4130
diff changeset
2256
6b96ce9f5743 [project @ 2002-11-06 20:38:49 by jwe]
jwe
parents: 4130
diff changeset
2257 OCTAVE_QUIT;
3466
9ff5622c993e [project @ 2000-01-21 19:30:46 by hodelas]
hodelas
parents: 3354
diff changeset
2258
9ff5622c993e [project @ 2000-01-21 19:30:46 by hodelas]
hodelas
parents: 3354
diff changeset
2259 Matrix tmpMat = retval;
5275
23b37da9fd5b [project @ 2005-04-08 16:07:35 by jwe]
jwe
parents: 5105
diff changeset
2260 for (octave_idx_type i = 0; i < nc; i++)
23b37da9fd5b [project @ 2005-04-08 16:07:35 by jwe]
jwe
parents: 5105
diff changeset
2261 for (octave_idx_type j = 0; j < nc; j++)
3468
a2dc6de198f9 [project @ 2000-01-21 22:13:13 by jwe]
jwe
parents: 3466
diff changeset
2262 retval(i,j) = tmpMat(invpvec(i),invpvec(j));
3466
9ff5622c993e [project @ 2000-01-21 19:30:46 by hodelas]
hodelas
parents: 3354
diff changeset
2263
1819
8b8498bf8ec5 [project @ 1996-01-31 11:29:17 by jwe]
jwe
parents: 1698
diff changeset
2264 // Reverse preconditioning step 1: fix trace normalization.
3331
13cdcb7e5066 [project @ 1999-11-02 06:24:23 by jwe]
jwe
parents: 3248
diff changeset
2265
3130
02766207b74c [project @ 1998-01-25 08:27:23 by jwe]
jwe
parents: 3075
diff changeset
2266 if (trshift > 0.0)
02766207b74c [project @ 1998-01-25 08:27:23 by jwe]
jwe
parents: 3075
diff changeset
2267 retval = exp (trshift) * retval;
02766207b74c [project @ 1998-01-25 08:27:23 by jwe]
jwe
parents: 3075
diff changeset
2268
02766207b74c [project @ 1998-01-25 08:27:23 by jwe]
jwe
parents: 3075
diff changeset
2269 return retval;
1819
8b8498bf8ec5 [project @ 1996-01-31 11:29:17 by jwe]
jwe
parents: 1698
diff changeset
2270 }
8b8498bf8ec5 [project @ 1996-01-31 11:29:17 by jwe]
jwe
parents: 1698
diff changeset
2271
458
38cb88095913 [project @ 1994-06-06 00:41:10 by jwe]
jwe
parents:
diff changeset
2272 Matrix&
38cb88095913 [project @ 1994-06-06 00:41:10 by jwe]
jwe
parents:
diff changeset
2273 Matrix::operator += (const DiagMatrix& a)
38cb88095913 [project @ 1994-06-06 00:41:10 by jwe]
jwe
parents:
diff changeset
2274 {
5275
23b37da9fd5b [project @ 2005-04-08 16:07:35 by jwe]
jwe
parents: 5105
diff changeset
2275 octave_idx_type nr = rows ();
23b37da9fd5b [project @ 2005-04-08 16:07:35 by jwe]
jwe
parents: 5105
diff changeset
2276 octave_idx_type nc = cols ();
23b37da9fd5b [project @ 2005-04-08 16:07:35 by jwe]
jwe
parents: 5105
diff changeset
2277
23b37da9fd5b [project @ 2005-04-08 16:07:35 by jwe]
jwe
parents: 5105
diff changeset
2278 octave_idx_type a_nr = a.rows ();
23b37da9fd5b [project @ 2005-04-08 16:07:35 by jwe]
jwe
parents: 5105
diff changeset
2279 octave_idx_type a_nc = a.cols ();
2385
170053c0f75e [project @ 1996-10-12 18:23:01 by jwe]
jwe
parents: 2354
diff changeset
2280
170053c0f75e [project @ 1996-10-12 18:23:01 by jwe]
jwe
parents: 2354
diff changeset
2281 if (nr != a_nr || nc != a_nc)
458
38cb88095913 [project @ 1994-06-06 00:41:10 by jwe]
jwe
parents:
diff changeset
2282 {
2385
170053c0f75e [project @ 1996-10-12 18:23:01 by jwe]
jwe
parents: 2354
diff changeset
2283 gripe_nonconformant ("operator +=", nr, nc, a_nr, a_nc);
458
38cb88095913 [project @ 1994-06-06 00:41:10 by jwe]
jwe
parents:
diff changeset
2284 return *this;
38cb88095913 [project @ 1994-06-06 00:41:10 by jwe]
jwe
parents:
diff changeset
2285 }
38cb88095913 [project @ 1994-06-06 00:41:10 by jwe]
jwe
parents:
diff changeset
2286
5275
23b37da9fd5b [project @ 2005-04-08 16:07:35 by jwe]
jwe
parents: 5105
diff changeset
2287 for (octave_idx_type i = 0; i < a.length (); i++)
458
38cb88095913 [project @ 1994-06-06 00:41:10 by jwe]
jwe
parents:
diff changeset
2288 elem (i, i) += a.elem (i, i);
38cb88095913 [project @ 1994-06-06 00:41:10 by jwe]
jwe
parents:
diff changeset
2289
38cb88095913 [project @ 1994-06-06 00:41:10 by jwe]
jwe
parents:
diff changeset
2290 return *this;
38cb88095913 [project @ 1994-06-06 00:41:10 by jwe]
jwe
parents:
diff changeset
2291 }
38cb88095913 [project @ 1994-06-06 00:41:10 by jwe]
jwe
parents:
diff changeset
2292
38cb88095913 [project @ 1994-06-06 00:41:10 by jwe]
jwe
parents:
diff changeset
2293 Matrix&
38cb88095913 [project @ 1994-06-06 00:41:10 by jwe]
jwe
parents:
diff changeset
2294 Matrix::operator -= (const DiagMatrix& a)
38cb88095913 [project @ 1994-06-06 00:41:10 by jwe]
jwe
parents:
diff changeset
2295 {
5275
23b37da9fd5b [project @ 2005-04-08 16:07:35 by jwe]
jwe
parents: 5105
diff changeset
2296 octave_idx_type nr = rows ();
23b37da9fd5b [project @ 2005-04-08 16:07:35 by jwe]
jwe
parents: 5105
diff changeset
2297 octave_idx_type nc = cols ();
23b37da9fd5b [project @ 2005-04-08 16:07:35 by jwe]
jwe
parents: 5105
diff changeset
2298
23b37da9fd5b [project @ 2005-04-08 16:07:35 by jwe]
jwe
parents: 5105
diff changeset
2299 octave_idx_type a_nr = a.rows ();
23b37da9fd5b [project @ 2005-04-08 16:07:35 by jwe]
jwe
parents: 5105
diff changeset
2300 octave_idx_type a_nc = a.cols ();
2385
170053c0f75e [project @ 1996-10-12 18:23:01 by jwe]
jwe
parents: 2354
diff changeset
2301
170053c0f75e [project @ 1996-10-12 18:23:01 by jwe]
jwe
parents: 2354
diff changeset
2302 if (nr != a_nr || nc != a_nc)
458
38cb88095913 [project @ 1994-06-06 00:41:10 by jwe]
jwe
parents:
diff changeset
2303 {
2385
170053c0f75e [project @ 1996-10-12 18:23:01 by jwe]
jwe
parents: 2354
diff changeset
2304 gripe_nonconformant ("operator -=", nr, nc, a_nr, a_nc);
458
38cb88095913 [project @ 1994-06-06 00:41:10 by jwe]
jwe
parents:
diff changeset
2305 return *this;
38cb88095913 [project @ 1994-06-06 00:41:10 by jwe]
jwe
parents:
diff changeset
2306 }
38cb88095913 [project @ 1994-06-06 00:41:10 by jwe]
jwe
parents:
diff changeset
2307
5275
23b37da9fd5b [project @ 2005-04-08 16:07:35 by jwe]
jwe
parents: 5105
diff changeset
2308 for (octave_idx_type i = 0; i < a.length (); i++)
458
38cb88095913 [project @ 1994-06-06 00:41:10 by jwe]
jwe
parents:
diff changeset
2309 elem (i, i) -= a.elem (i, i);
38cb88095913 [project @ 1994-06-06 00:41:10 by jwe]
jwe
parents:
diff changeset
2310
38cb88095913 [project @ 1994-06-06 00:41:10 by jwe]
jwe
parents:
diff changeset
2311 return *this;
38cb88095913 [project @ 1994-06-06 00:41:10 by jwe]
jwe
parents:
diff changeset
2312 }
38cb88095913 [project @ 1994-06-06 00:41:10 by jwe]
jwe
parents:
diff changeset
2313
38cb88095913 [project @ 1994-06-06 00:41:10 by jwe]
jwe
parents:
diff changeset
2314 // unary operations
38cb88095913 [project @ 1994-06-06 00:41:10 by jwe]
jwe
parents:
diff changeset
2315
2964
0a2551ec7004 [project @ 1997-05-12 07:26:50 by jwe]
jwe
parents: 2870
diff changeset
2316 boolMatrix
458
38cb88095913 [project @ 1994-06-06 00:41:10 by jwe]
jwe
parents:
diff changeset
2317 Matrix::operator ! (void) const
38cb88095913 [project @ 1994-06-06 00:41:10 by jwe]
jwe
parents:
diff changeset
2318 {
5275
23b37da9fd5b [project @ 2005-04-08 16:07:35 by jwe]
jwe
parents: 5105
diff changeset
2319 octave_idx_type nr = rows ();
23b37da9fd5b [project @ 2005-04-08 16:07:35 by jwe]
jwe
parents: 5105
diff changeset
2320 octave_idx_type nc = cols ();
458
38cb88095913 [project @ 1994-06-06 00:41:10 by jwe]
jwe
parents:
diff changeset
2321
2964
0a2551ec7004 [project @ 1997-05-12 07:26:50 by jwe]
jwe
parents: 2870
diff changeset
2322 boolMatrix b (nr, nc);
458
38cb88095913 [project @ 1994-06-06 00:41:10 by jwe]
jwe
parents:
diff changeset
2323
5275
23b37da9fd5b [project @ 2005-04-08 16:07:35 by jwe]
jwe
parents: 5105
diff changeset
2324 for (octave_idx_type j = 0; j < nc; j++)
23b37da9fd5b [project @ 2005-04-08 16:07:35 by jwe]
jwe
parents: 5105
diff changeset
2325 for (octave_idx_type i = 0; i < nr; i++)
458
38cb88095913 [project @ 1994-06-06 00:41:10 by jwe]
jwe
parents:
diff changeset
2326 b.elem (i, j) = ! elem (i, j);
38cb88095913 [project @ 1994-06-06 00:41:10 by jwe]
jwe
parents:
diff changeset
2327
38cb88095913 [project @ 1994-06-06 00:41:10 by jwe]
jwe
parents:
diff changeset
2328 return b;
38cb88095913 [project @ 1994-06-06 00:41:10 by jwe]
jwe
parents:
diff changeset
2329 }
38cb88095913 [project @ 1994-06-06 00:41:10 by jwe]
jwe
parents:
diff changeset
2330
1205
8302fab9fe24 [project @ 1995-04-04 02:05:01 by jwe]
jwe
parents: 1195
diff changeset
2331 // column vector by row vector -> matrix operations
458
38cb88095913 [project @ 1994-06-06 00:41:10 by jwe]
jwe
parents:
diff changeset
2332
1205
8302fab9fe24 [project @ 1995-04-04 02:05:01 by jwe]
jwe
parents: 1195
diff changeset
2333 Matrix
8302fab9fe24 [project @ 1995-04-04 02:05:01 by jwe]
jwe
parents: 1195
diff changeset
2334 operator * (const ColumnVector& v, const RowVector& a)
458
38cb88095913 [project @ 1994-06-06 00:41:10 by jwe]
jwe
parents:
diff changeset
2335 {
1948
d7dec93d4b87 [project @ 1996-02-14 03:45:49 by jwe]
jwe
parents: 1882
diff changeset
2336 Matrix retval;
d7dec93d4b87 [project @ 1996-02-14 03:45:49 by jwe]
jwe
parents: 1882
diff changeset
2337
5275
23b37da9fd5b [project @ 2005-04-08 16:07:35 by jwe]
jwe
parents: 5105
diff changeset
2338 octave_idx_type len = v.length ();
3233
98d0ee053ba4 [project @ 1999-01-27 20:23:40 by jwe]
jwe
parents: 3225
diff changeset
2339
98d0ee053ba4 [project @ 1999-01-27 20:23:40 by jwe]
jwe
parents: 3225
diff changeset
2340 if (len != 0)
1205
8302fab9fe24 [project @ 1995-04-04 02:05:01 by jwe]
jwe
parents: 1195
diff changeset
2341 {
5275
23b37da9fd5b [project @ 2005-04-08 16:07:35 by jwe]
jwe
parents: 5105
diff changeset
2342 octave_idx_type a_len = a.length ();
3233
98d0ee053ba4 [project @ 1999-01-27 20:23:40 by jwe]
jwe
parents: 3225
diff changeset
2343
98d0ee053ba4 [project @ 1999-01-27 20:23:40 by jwe]
jwe
parents: 3225
diff changeset
2344 retval.resize (len, a_len);
98d0ee053ba4 [project @ 1999-01-27 20:23:40 by jwe]
jwe
parents: 3225
diff changeset
2345 double *c = retval.fortran_vec ();
98d0ee053ba4 [project @ 1999-01-27 20:23:40 by jwe]
jwe
parents: 3225
diff changeset
2346
4552
6f3382e08a52 [project @ 2003-10-27 20:38:02 by jwe]
jwe
parents: 4513
diff changeset
2347 F77_XFCN (dgemm, DGEMM, (F77_CONST_CHAR_ARG2 ("N", 1),
6f3382e08a52 [project @ 2003-10-27 20:38:02 by jwe]
jwe
parents: 4513
diff changeset
2348 F77_CONST_CHAR_ARG2 ("N", 1),
6f3382e08a52 [project @ 2003-10-27 20:38:02 by jwe]
jwe
parents: 4513
diff changeset
2349 len, a_len, 1, 1.0, v.data (), len,
6f3382e08a52 [project @ 2003-10-27 20:38:02 by jwe]
jwe
parents: 4513
diff changeset
2350 a.data (), 1, 0.0, c, len
6f3382e08a52 [project @ 2003-10-27 20:38:02 by jwe]
jwe
parents: 4513
diff changeset
2351 F77_CHAR_ARG_LEN (1)
6f3382e08a52 [project @ 2003-10-27 20:38:02 by jwe]
jwe
parents: 4513
diff changeset
2352 F77_CHAR_ARG_LEN (1)));
3233
98d0ee053ba4 [project @ 1999-01-27 20:23:40 by jwe]
jwe
parents: 3225
diff changeset
2353
98d0ee053ba4 [project @ 1999-01-27 20:23:40 by jwe]
jwe
parents: 3225
diff changeset
2354 if (f77_exception_encountered)
98d0ee053ba4 [project @ 1999-01-27 20:23:40 by jwe]
jwe
parents: 3225
diff changeset
2355 (*current_liboctave_error_handler)
98d0ee053ba4 [project @ 1999-01-27 20:23:40 by jwe]
jwe
parents: 3225
diff changeset
2356 ("unrecoverable error in dgemm");
1205
8302fab9fe24 [project @ 1995-04-04 02:05:01 by jwe]
jwe
parents: 1195
diff changeset
2357 }
458
38cb88095913 [project @ 1994-06-06 00:41:10 by jwe]
jwe
parents:
diff changeset
2358
1948
d7dec93d4b87 [project @ 1996-02-14 03:45:49 by jwe]
jwe
parents: 1882
diff changeset
2359 return retval;
458
38cb88095913 [project @ 1994-06-06 00:41:10 by jwe]
jwe
parents:
diff changeset
2360 }
38cb88095913 [project @ 1994-06-06 00:41:10 by jwe]
jwe
parents:
diff changeset
2361
38cb88095913 [project @ 1994-06-06 00:41:10 by jwe]
jwe
parents:
diff changeset
2362 // other operations.
38cb88095913 [project @ 1994-06-06 00:41:10 by jwe]
jwe
parents:
diff changeset
2363
38cb88095913 [project @ 1994-06-06 00:41:10 by jwe]
jwe
parents:
diff changeset
2364 Matrix
2676
a5a300c61159 [project @ 1997-02-14 03:16:06 by jwe]
jwe
parents: 2601
diff changeset
2365 Matrix::map (d_d_Mapper f) const
1205
8302fab9fe24 [project @ 1995-04-04 02:05:01 by jwe]
jwe
parents: 1195
diff changeset
2366 {
2676
a5a300c61159 [project @ 1997-02-14 03:16:06 by jwe]
jwe
parents: 2601
diff changeset
2367 Matrix b (*this);
a5a300c61159 [project @ 1997-02-14 03:16:06 by jwe]
jwe
parents: 2601
diff changeset
2368 return b.apply (f);
1205
8302fab9fe24 [project @ 1995-04-04 02:05:01 by jwe]
jwe
parents: 1195
diff changeset
2369 }
8302fab9fe24 [project @ 1995-04-04 02:05:01 by jwe]
jwe
parents: 1195
diff changeset
2370
3248
68259f410026 [project @ 1999-07-13 03:34:54 by jwe]
jwe
parents: 3233
diff changeset
2371 boolMatrix
68259f410026 [project @ 1999-07-13 03:34:54 by jwe]
jwe
parents: 3233
diff changeset
2372 Matrix::map (b_d_Mapper f) const
68259f410026 [project @ 1999-07-13 03:34:54 by jwe]
jwe
parents: 3233
diff changeset
2373 {
5275
23b37da9fd5b [project @ 2005-04-08 16:07:35 by jwe]
jwe
parents: 5105
diff changeset
2374 octave_idx_type nr = rows ();
23b37da9fd5b [project @ 2005-04-08 16:07:35 by jwe]
jwe
parents: 5105
diff changeset
2375 octave_idx_type nc = cols ();
3248
68259f410026 [project @ 1999-07-13 03:34:54 by jwe]
jwe
parents: 3233
diff changeset
2376
68259f410026 [project @ 1999-07-13 03:34:54 by jwe]
jwe
parents: 3233
diff changeset
2377 boolMatrix retval (nr, nc);
68259f410026 [project @ 1999-07-13 03:34:54 by jwe]
jwe
parents: 3233
diff changeset
2378
5275
23b37da9fd5b [project @ 2005-04-08 16:07:35 by jwe]
jwe
parents: 5105
diff changeset
2379 for (octave_idx_type j = 0; j < nc; j++)
23b37da9fd5b [project @ 2005-04-08 16:07:35 by jwe]
jwe
parents: 5105
diff changeset
2380 for (octave_idx_type i = 0; i < nr; i++)
3248
68259f410026 [project @ 1999-07-13 03:34:54 by jwe]
jwe
parents: 3233
diff changeset
2381 retval(i,j) = f (elem(i,j));
68259f410026 [project @ 1999-07-13 03:34:54 by jwe]
jwe
parents: 3233
diff changeset
2382
68259f410026 [project @ 1999-07-13 03:34:54 by jwe]
jwe
parents: 3233
diff changeset
2383 return retval;
68259f410026 [project @ 1999-07-13 03:34:54 by jwe]
jwe
parents: 3233
diff changeset
2384 }
68259f410026 [project @ 1999-07-13 03:34:54 by jwe]
jwe
parents: 3233
diff changeset
2385
2676
a5a300c61159 [project @ 1997-02-14 03:16:06 by jwe]
jwe
parents: 2601
diff changeset
2386 Matrix&
a5a300c61159 [project @ 1997-02-14 03:16:06 by jwe]
jwe
parents: 2601
diff changeset
2387 Matrix::apply (d_d_Mapper f)
458
38cb88095913 [project @ 1994-06-06 00:41:10 by jwe]
jwe
parents:
diff changeset
2388 {
38cb88095913 [project @ 1994-06-06 00:41:10 by jwe]
jwe
parents:
diff changeset
2389 double *d = fortran_vec (); // Ensures only one reference to my privates!
38cb88095913 [project @ 1994-06-06 00:41:10 by jwe]
jwe
parents:
diff changeset
2390
5275
23b37da9fd5b [project @ 2005-04-08 16:07:35 by jwe]
jwe
parents: 5105
diff changeset
2391 for (octave_idx_type i = 0; i < length (); i++)
458
38cb88095913 [project @ 1994-06-06 00:41:10 by jwe]
jwe
parents:
diff changeset
2392 d[i] = f (d[i]);
2676
a5a300c61159 [project @ 1997-02-14 03:16:06 by jwe]
jwe
parents: 2601
diff changeset
2393
a5a300c61159 [project @ 1997-02-14 03:16:06 by jwe]
jwe
parents: 2601
diff changeset
2394 return *this;
458
38cb88095913 [project @ 1994-06-06 00:41:10 by jwe]
jwe
parents:
diff changeset
2395 }
38cb88095913 [project @ 1994-06-06 00:41:10 by jwe]
jwe
parents:
diff changeset
2396
2385
170053c0f75e [project @ 1996-10-12 18:23:01 by jwe]
jwe
parents: 2354
diff changeset
2397 bool
4431
c4bde1d5eb98 [project @ 2003-06-18 15:47:09 by jwe]
jwe
parents: 4384
diff changeset
2398 Matrix::any_element_is_negative (bool neg_zero) const
2385
170053c0f75e [project @ 1996-10-12 18:23:01 by jwe]
jwe
parents: 2354
diff changeset
2399 {
5275
23b37da9fd5b [project @ 2005-04-08 16:07:35 by jwe]
jwe
parents: 5105
diff changeset
2400 octave_idx_type nel = nelem ();
2385
170053c0f75e [project @ 1996-10-12 18:23:01 by jwe]
jwe
parents: 2354
diff changeset
2401
4431
c4bde1d5eb98 [project @ 2003-06-18 15:47:09 by jwe]
jwe
parents: 4384
diff changeset
2402 if (neg_zero)
c4bde1d5eb98 [project @ 2003-06-18 15:47:09 by jwe]
jwe
parents: 4384
diff changeset
2403 {
5275
23b37da9fd5b [project @ 2005-04-08 16:07:35 by jwe]
jwe
parents: 5105
diff changeset
2404 for (octave_idx_type i = 0; i < nel; i++)
4634
79fe96966ca0 [project @ 2003-11-19 21:22:39 by jwe]
jwe
parents: 4593
diff changeset
2405 if (lo_ieee_signbit (elem (i)))
79fe96966ca0 [project @ 2003-11-19 21:22:39 by jwe]
jwe
parents: 4593
diff changeset
2406 return true;
4431
c4bde1d5eb98 [project @ 2003-06-18 15:47:09 by jwe]
jwe
parents: 4384
diff changeset
2407 }
c4bde1d5eb98 [project @ 2003-06-18 15:47:09 by jwe]
jwe
parents: 4384
diff changeset
2408 else
c4bde1d5eb98 [project @ 2003-06-18 15:47:09 by jwe]
jwe
parents: 4384
diff changeset
2409 {
5275
23b37da9fd5b [project @ 2005-04-08 16:07:35 by jwe]
jwe
parents: 5105
diff changeset
2410 for (octave_idx_type i = 0; i < nel; i++)
4634
79fe96966ca0 [project @ 2003-11-19 21:22:39 by jwe]
jwe
parents: 4593
diff changeset
2411 if (elem (i) < 0)
79fe96966ca0 [project @ 2003-11-19 21:22:39 by jwe]
jwe
parents: 4593
diff changeset
2412 return true;
4431
c4bde1d5eb98 [project @ 2003-06-18 15:47:09 by jwe]
jwe
parents: 4384
diff changeset
2413 }
2385
170053c0f75e [project @ 1996-10-12 18:23:01 by jwe]
jwe
parents: 2354
diff changeset
2414
170053c0f75e [project @ 1996-10-12 18:23:01 by jwe]
jwe
parents: 2354
diff changeset
2415 return false;
170053c0f75e [project @ 1996-10-12 18:23:01 by jwe]
jwe
parents: 2354
diff changeset
2416 }
170053c0f75e [project @ 1996-10-12 18:23:01 by jwe]
jwe
parents: 2354
diff changeset
2417
170053c0f75e [project @ 1996-10-12 18:23:01 by jwe]
jwe
parents: 2354
diff changeset
2418
170053c0f75e [project @ 1996-10-12 18:23:01 by jwe]
jwe
parents: 2354
diff changeset
2419 bool
170053c0f75e [project @ 1996-10-12 18:23:01 by jwe]
jwe
parents: 2354
diff changeset
2420 Matrix::any_element_is_inf_or_nan (void) const
170053c0f75e [project @ 1996-10-12 18:23:01 by jwe]
jwe
parents: 2354
diff changeset
2421 {
5275
23b37da9fd5b [project @ 2005-04-08 16:07:35 by jwe]
jwe
parents: 5105
diff changeset
2422 octave_idx_type nel = nelem ();
23b37da9fd5b [project @ 2005-04-08 16:07:35 by jwe]
jwe
parents: 5105
diff changeset
2423
23b37da9fd5b [project @ 2005-04-08 16:07:35 by jwe]
jwe
parents: 5105
diff changeset
2424 for (octave_idx_type i = 0; i < nel; i++)
4634
79fe96966ca0 [project @ 2003-11-19 21:22:39 by jwe]
jwe
parents: 4593
diff changeset
2425 {
79fe96966ca0 [project @ 2003-11-19 21:22:39 by jwe]
jwe
parents: 4593
diff changeset
2426 double val = elem (i);
79fe96966ca0 [project @ 2003-11-19 21:22:39 by jwe]
jwe
parents: 4593
diff changeset
2427 if (xisinf (val) || xisnan (val))
79fe96966ca0 [project @ 2003-11-19 21:22:39 by jwe]
jwe
parents: 4593
diff changeset
2428 return true;
79fe96966ca0 [project @ 2003-11-19 21:22:39 by jwe]
jwe
parents: 4593
diff changeset
2429 }
79fe96966ca0 [project @ 2003-11-19 21:22:39 by jwe]
jwe
parents: 4593
diff changeset
2430
79fe96966ca0 [project @ 2003-11-19 21:22:39 by jwe]
jwe
parents: 4593
diff changeset
2431 return false;
2385
170053c0f75e [project @ 1996-10-12 18:23:01 by jwe]
jwe
parents: 2354
diff changeset
2432 }
170053c0f75e [project @ 1996-10-12 18:23:01 by jwe]
jwe
parents: 2354
diff changeset
2433
170053c0f75e [project @ 1996-10-12 18:23:01 by jwe]
jwe
parents: 2354
diff changeset
2434 bool
5943
c038c2947ee1 [project @ 2006-08-18 21:27:03 by jwe]
jwe
parents: 5785
diff changeset
2435 Matrix::any_element_not_one_or_zero (void) const
c038c2947ee1 [project @ 2006-08-18 21:27:03 by jwe]
jwe
parents: 5785
diff changeset
2436 {
c038c2947ee1 [project @ 2006-08-18 21:27:03 by jwe]
jwe
parents: 5785
diff changeset
2437 octave_idx_type nel = nelem ();
c038c2947ee1 [project @ 2006-08-18 21:27:03 by jwe]
jwe
parents: 5785
diff changeset
2438
c038c2947ee1 [project @ 2006-08-18 21:27:03 by jwe]
jwe
parents: 5785
diff changeset
2439 for (octave_idx_type i = 0; i < nel; i++)
c038c2947ee1 [project @ 2006-08-18 21:27:03 by jwe]
jwe
parents: 5785
diff changeset
2440 {
c038c2947ee1 [project @ 2006-08-18 21:27:03 by jwe]
jwe
parents: 5785
diff changeset
2441 double val = elem (i);
c038c2947ee1 [project @ 2006-08-18 21:27:03 by jwe]
jwe
parents: 5785
diff changeset
2442 if (val != 0 && val != 1)
c038c2947ee1 [project @ 2006-08-18 21:27:03 by jwe]
jwe
parents: 5785
diff changeset
2443 return true;
c038c2947ee1 [project @ 2006-08-18 21:27:03 by jwe]
jwe
parents: 5785
diff changeset
2444 }
c038c2947ee1 [project @ 2006-08-18 21:27:03 by jwe]
jwe
parents: 5785
diff changeset
2445
c038c2947ee1 [project @ 2006-08-18 21:27:03 by jwe]
jwe
parents: 5785
diff changeset
2446 return false;
c038c2947ee1 [project @ 2006-08-18 21:27:03 by jwe]
jwe
parents: 5785
diff changeset
2447 }
c038c2947ee1 [project @ 2006-08-18 21:27:03 by jwe]
jwe
parents: 5785
diff changeset
2448
c038c2947ee1 [project @ 2006-08-18 21:27:03 by jwe]
jwe
parents: 5785
diff changeset
2449 bool
2385
170053c0f75e [project @ 1996-10-12 18:23:01 by jwe]
jwe
parents: 2354
diff changeset
2450 Matrix::all_elements_are_int_or_inf_or_nan (void) const
170053c0f75e [project @ 1996-10-12 18:23:01 by jwe]
jwe
parents: 2354
diff changeset
2451 {
5275
23b37da9fd5b [project @ 2005-04-08 16:07:35 by jwe]
jwe
parents: 5105
diff changeset
2452 octave_idx_type nel = nelem ();
23b37da9fd5b [project @ 2005-04-08 16:07:35 by jwe]
jwe
parents: 5105
diff changeset
2453
23b37da9fd5b [project @ 2005-04-08 16:07:35 by jwe]
jwe
parents: 5105
diff changeset
2454 for (octave_idx_type i = 0; i < nel; i++)
4634
79fe96966ca0 [project @ 2003-11-19 21:22:39 by jwe]
jwe
parents: 4593
diff changeset
2455 {
79fe96966ca0 [project @ 2003-11-19 21:22:39 by jwe]
jwe
parents: 4593
diff changeset
2456 double val = elem (i);
79fe96966ca0 [project @ 2003-11-19 21:22:39 by jwe]
jwe
parents: 4593
diff changeset
2457 if (xisnan (val) || D_NINT (val) == val)
79fe96966ca0 [project @ 2003-11-19 21:22:39 by jwe]
jwe
parents: 4593
diff changeset
2458 continue;
79fe96966ca0 [project @ 2003-11-19 21:22:39 by jwe]
jwe
parents: 4593
diff changeset
2459 else
79fe96966ca0 [project @ 2003-11-19 21:22:39 by jwe]
jwe
parents: 4593
diff changeset
2460 return false;
79fe96966ca0 [project @ 2003-11-19 21:22:39 by jwe]
jwe
parents: 4593
diff changeset
2461 }
2385
170053c0f75e [project @ 1996-10-12 18:23:01 by jwe]
jwe
parents: 2354
diff changeset
2462
170053c0f75e [project @ 1996-10-12 18:23:01 by jwe]
jwe
parents: 2354
diff changeset
2463 return true;
170053c0f75e [project @ 1996-10-12 18:23:01 by jwe]
jwe
parents: 2354
diff changeset
2464 }
170053c0f75e [project @ 1996-10-12 18:23:01 by jwe]
jwe
parents: 2354
diff changeset
2465
1968
a2e206524aa0 [project @ 1996-02-17 02:54:24 by jwe]
jwe
parents: 1959
diff changeset
2466 // Return nonzero if any element of M is not an integer. Also extract
a2e206524aa0 [project @ 1996-02-17 02:54:24 by jwe]
jwe
parents: 1959
diff changeset
2467 // the largest and smallest values and return them in MAX_VAL and MIN_VAL.
a2e206524aa0 [project @ 1996-02-17 02:54:24 by jwe]
jwe
parents: 1959
diff changeset
2468
2385
170053c0f75e [project @ 1996-10-12 18:23:01 by jwe]
jwe
parents: 2354
diff changeset
2469 bool
1968
a2e206524aa0 [project @ 1996-02-17 02:54:24 by jwe]
jwe
parents: 1959
diff changeset
2470 Matrix::all_integers (double& max_val, double& min_val) const
a2e206524aa0 [project @ 1996-02-17 02:54:24 by jwe]
jwe
parents: 1959
diff changeset
2471 {
5275
23b37da9fd5b [project @ 2005-04-08 16:07:35 by jwe]
jwe
parents: 5105
diff changeset
2472 octave_idx_type nel = nelem ();
4634
79fe96966ca0 [project @ 2003-11-19 21:22:39 by jwe]
jwe
parents: 4593
diff changeset
2473
79fe96966ca0 [project @ 2003-11-19 21:22:39 by jwe]
jwe
parents: 4593
diff changeset
2474 if (nel > 0)
1968
a2e206524aa0 [project @ 1996-02-17 02:54:24 by jwe]
jwe
parents: 1959
diff changeset
2475 {
4634
79fe96966ca0 [project @ 2003-11-19 21:22:39 by jwe]
jwe
parents: 4593
diff changeset
2476 max_val = elem (0);
79fe96966ca0 [project @ 2003-11-19 21:22:39 by jwe]
jwe
parents: 4593
diff changeset
2477 min_val = elem (0);
1968
a2e206524aa0 [project @ 1996-02-17 02:54:24 by jwe]
jwe
parents: 1959
diff changeset
2478 }
a2e206524aa0 [project @ 1996-02-17 02:54:24 by jwe]
jwe
parents: 1959
diff changeset
2479 else
2385
170053c0f75e [project @ 1996-10-12 18:23:01 by jwe]
jwe
parents: 2354
diff changeset
2480 return false;
1968
a2e206524aa0 [project @ 1996-02-17 02:54:24 by jwe]
jwe
parents: 1959
diff changeset
2481
5275
23b37da9fd5b [project @ 2005-04-08 16:07:35 by jwe]
jwe
parents: 5105
diff changeset
2482 for (octave_idx_type i = 0; i < nel; i++)
4634
79fe96966ca0 [project @ 2003-11-19 21:22:39 by jwe]
jwe
parents: 4593
diff changeset
2483 {
79fe96966ca0 [project @ 2003-11-19 21:22:39 by jwe]
jwe
parents: 4593
diff changeset
2484 double val = elem (i);
79fe96966ca0 [project @ 2003-11-19 21:22:39 by jwe]
jwe
parents: 4593
diff changeset
2485
79fe96966ca0 [project @ 2003-11-19 21:22:39 by jwe]
jwe
parents: 4593
diff changeset
2486 if (val > max_val)
79fe96966ca0 [project @ 2003-11-19 21:22:39 by jwe]
jwe
parents: 4593
diff changeset
2487 max_val = val;
79fe96966ca0 [project @ 2003-11-19 21:22:39 by jwe]
jwe
parents: 4593
diff changeset
2488
79fe96966ca0 [project @ 2003-11-19 21:22:39 by jwe]
jwe
parents: 4593
diff changeset
2489 if (val < min_val)
79fe96966ca0 [project @ 2003-11-19 21:22:39 by jwe]
jwe
parents: 4593
diff changeset
2490 min_val = val;
79fe96966ca0 [project @ 2003-11-19 21:22:39 by jwe]
jwe
parents: 4593
diff changeset
2491
79fe96966ca0 [project @ 2003-11-19 21:22:39 by jwe]
jwe
parents: 4593
diff changeset
2492 if (D_NINT (val) != val)
79fe96966ca0 [project @ 2003-11-19 21:22:39 by jwe]
jwe
parents: 4593
diff changeset
2493 return false;
79fe96966ca0 [project @ 2003-11-19 21:22:39 by jwe]
jwe
parents: 4593
diff changeset
2494 }
2385
170053c0f75e [project @ 1996-10-12 18:23:01 by jwe]
jwe
parents: 2354
diff changeset
2495
170053c0f75e [project @ 1996-10-12 18:23:01 by jwe]
jwe
parents: 2354
diff changeset
2496 return true;
1968
a2e206524aa0 [project @ 1996-02-17 02:54:24 by jwe]
jwe
parents: 1959
diff changeset
2497 }
a2e206524aa0 [project @ 1996-02-17 02:54:24 by jwe]
jwe
parents: 1959
diff changeset
2498
2385
170053c0f75e [project @ 1996-10-12 18:23:01 by jwe]
jwe
parents: 2354
diff changeset
2499 bool
1968
a2e206524aa0 [project @ 1996-02-17 02:54:24 by jwe]
jwe
parents: 1959
diff changeset
2500 Matrix::too_large_for_float (void) const
a2e206524aa0 [project @ 1996-02-17 02:54:24 by jwe]
jwe
parents: 1959
diff changeset
2501 {
5275
23b37da9fd5b [project @ 2005-04-08 16:07:35 by jwe]
jwe
parents: 5105
diff changeset
2502 octave_idx_type nel = nelem ();
23b37da9fd5b [project @ 2005-04-08 16:07:35 by jwe]
jwe
parents: 5105
diff changeset
2503
23b37da9fd5b [project @ 2005-04-08 16:07:35 by jwe]
jwe
parents: 5105
diff changeset
2504 for (octave_idx_type i = 0; i < nel; i++)
4634
79fe96966ca0 [project @ 2003-11-19 21:22:39 by jwe]
jwe
parents: 4593
diff changeset
2505 {
79fe96966ca0 [project @ 2003-11-19 21:22:39 by jwe]
jwe
parents: 4593
diff changeset
2506 double val = elem (i);
79fe96966ca0 [project @ 2003-11-19 21:22:39 by jwe]
jwe
parents: 4593
diff changeset
2507
5389
25c8956d2204 [project @ 2005-06-15 03:45:46 by jwe]
jwe
parents: 5387
diff changeset
2508 if (! (xisnan (val) || xisinf (val))
5387
5b00a8beb504 [project @ 2005-06-14 17:13:45 by jwe]
jwe
parents: 5386
diff changeset
2509 && fabs (val) > FLT_MAX)
4634
79fe96966ca0 [project @ 2003-11-19 21:22:39 by jwe]
jwe
parents: 4593
diff changeset
2510 return true;
79fe96966ca0 [project @ 2003-11-19 21:22:39 by jwe]
jwe
parents: 4593
diff changeset
2511 }
1968
a2e206524aa0 [project @ 1996-02-17 02:54:24 by jwe]
jwe
parents: 1959
diff changeset
2512
2385
170053c0f75e [project @ 1996-10-12 18:23:01 by jwe]
jwe
parents: 2354
diff changeset
2513 return false;
1968
a2e206524aa0 [project @ 1996-02-17 02:54:24 by jwe]
jwe
parents: 1959
diff changeset
2514 }
a2e206524aa0 [project @ 1996-02-17 02:54:24 by jwe]
jwe
parents: 1959
diff changeset
2515
5775
ace8d8d26933 [project @ 2006-04-24 19:13:06 by jwe]
jwe
parents: 5717
diff changeset
2516 // FIXME Do these really belong here? Maybe they should be
4015
6476dd85a65f [project @ 2002-08-02 07:59:19 by jwe]
jwe
parents: 3887
diff changeset
2517 // in a base class?
458
38cb88095913 [project @ 1994-06-06 00:41:10 by jwe]
jwe
parents:
diff changeset
2518
2832
4dff308e9acc [project @ 1997-03-26 05:16:58 by jwe]
jwe
parents: 2828
diff changeset
2519 boolMatrix
4015
6476dd85a65f [project @ 2002-08-02 07:59:19 by jwe]
jwe
parents: 3887
diff changeset
2520 Matrix::all (int dim) const
458
38cb88095913 [project @ 1994-06-06 00:41:10 by jwe]
jwe
parents:
diff changeset
2521 {
4015
6476dd85a65f [project @ 2002-08-02 07:59:19 by jwe]
jwe
parents: 3887
diff changeset
2522 MX_ALL_OP (dim);
458
38cb88095913 [project @ 1994-06-06 00:41:10 by jwe]
jwe
parents:
diff changeset
2523 }
38cb88095913 [project @ 1994-06-06 00:41:10 by jwe]
jwe
parents:
diff changeset
2524
2832
4dff308e9acc [project @ 1997-03-26 05:16:58 by jwe]
jwe
parents: 2828
diff changeset
2525 boolMatrix
4015
6476dd85a65f [project @ 2002-08-02 07:59:19 by jwe]
jwe
parents: 3887
diff changeset
2526 Matrix::any (int dim) const
458
38cb88095913 [project @ 1994-06-06 00:41:10 by jwe]
jwe
parents:
diff changeset
2527 {
4015
6476dd85a65f [project @ 2002-08-02 07:59:19 by jwe]
jwe
parents: 3887
diff changeset
2528 MX_ANY_OP (dim);
458
38cb88095913 [project @ 1994-06-06 00:41:10 by jwe]
jwe
parents:
diff changeset
2529 }
38cb88095913 [project @ 1994-06-06 00:41:10 by jwe]
jwe
parents:
diff changeset
2530
38cb88095913 [project @ 1994-06-06 00:41:10 by jwe]
jwe
parents:
diff changeset
2531 Matrix
3723
4c3774db5b3c [project @ 2000-10-12 05:10:08 by jwe]
jwe
parents: 3585
diff changeset
2532 Matrix::cumprod (int dim) const
458
38cb88095913 [project @ 1994-06-06 00:41:10 by jwe]
jwe
parents:
diff changeset
2533 {
4015
6476dd85a65f [project @ 2002-08-02 07:59:19 by jwe]
jwe
parents: 3887
diff changeset
2534 MX_CUMULATIVE_OP (Matrix, double, *=);
458
38cb88095913 [project @ 1994-06-06 00:41:10 by jwe]
jwe
parents:
diff changeset
2535 }
38cb88095913 [project @ 1994-06-06 00:41:10 by jwe]
jwe
parents:
diff changeset
2536
38cb88095913 [project @ 1994-06-06 00:41:10 by jwe]
jwe
parents:
diff changeset
2537 Matrix
3723
4c3774db5b3c [project @ 2000-10-12 05:10:08 by jwe]
jwe
parents: 3585
diff changeset
2538 Matrix::cumsum (int dim) const
458
38cb88095913 [project @ 1994-06-06 00:41:10 by jwe]
jwe
parents:
diff changeset
2539 {
4015
6476dd85a65f [project @ 2002-08-02 07:59:19 by jwe]
jwe
parents: 3887
diff changeset
2540 MX_CUMULATIVE_OP (Matrix, double, +=);
458
38cb88095913 [project @ 1994-06-06 00:41:10 by jwe]
jwe
parents:
diff changeset
2541 }
38cb88095913 [project @ 1994-06-06 00:41:10 by jwe]
jwe
parents:
diff changeset
2542
38cb88095913 [project @ 1994-06-06 00:41:10 by jwe]
jwe
parents:
diff changeset
2543 Matrix
3723
4c3774db5b3c [project @ 2000-10-12 05:10:08 by jwe]
jwe
parents: 3585
diff changeset
2544 Matrix::prod (int dim) const
458
38cb88095913 [project @ 1994-06-06 00:41:10 by jwe]
jwe
parents:
diff changeset
2545 {
3864
e78705239df5 [project @ 2001-11-16 12:56:20 by jwe]
jwe
parents: 3838
diff changeset
2546 MX_REDUCTION_OP (Matrix, *=, 1.0, 1.0);
458
38cb88095913 [project @ 1994-06-06 00:41:10 by jwe]
jwe
parents:
diff changeset
2547 }
38cb88095913 [project @ 1994-06-06 00:41:10 by jwe]
jwe
parents:
diff changeset
2548
38cb88095913 [project @ 1994-06-06 00:41:10 by jwe]
jwe
parents:
diff changeset
2549 Matrix
3723
4c3774db5b3c [project @ 2000-10-12 05:10:08 by jwe]
jwe
parents: 3585
diff changeset
2550 Matrix::sum (int dim) const
458
38cb88095913 [project @ 1994-06-06 00:41:10 by jwe]
jwe
parents:
diff changeset
2551 {
3864
e78705239df5 [project @ 2001-11-16 12:56:20 by jwe]
jwe
parents: 3838
diff changeset
2552 MX_REDUCTION_OP (Matrix, +=, 0.0, 0.0);
458
38cb88095913 [project @ 1994-06-06 00:41:10 by jwe]
jwe
parents:
diff changeset
2553 }
38cb88095913 [project @ 1994-06-06 00:41:10 by jwe]
jwe
parents:
diff changeset
2554
38cb88095913 [project @ 1994-06-06 00:41:10 by jwe]
jwe
parents:
diff changeset
2555 Matrix
3723
4c3774db5b3c [project @ 2000-10-12 05:10:08 by jwe]
jwe
parents: 3585
diff changeset
2556 Matrix::sumsq (int dim) const
458
38cb88095913 [project @ 1994-06-06 00:41:10 by jwe]
jwe
parents:
diff changeset
2557 {
3864
e78705239df5 [project @ 2001-11-16 12:56:20 by jwe]
jwe
parents: 3838
diff changeset
2558 #define ROW_EXPR \
e78705239df5 [project @ 2001-11-16 12:56:20 by jwe]
jwe
parents: 3838
diff changeset
2559 double d = elem (i, j); \
e78705239df5 [project @ 2001-11-16 12:56:20 by jwe]
jwe
parents: 3838
diff changeset
2560 retval.elem (i, 0) += d * d
e78705239df5 [project @ 2001-11-16 12:56:20 by jwe]
jwe
parents: 3838
diff changeset
2561
e78705239df5 [project @ 2001-11-16 12:56:20 by jwe]
jwe
parents: 3838
diff changeset
2562 #define COL_EXPR \
e78705239df5 [project @ 2001-11-16 12:56:20 by jwe]
jwe
parents: 3838
diff changeset
2563 double d = elem (i, j); \
e78705239df5 [project @ 2001-11-16 12:56:20 by jwe]
jwe
parents: 3838
diff changeset
2564 retval.elem (0, j) += d * d
e78705239df5 [project @ 2001-11-16 12:56:20 by jwe]
jwe
parents: 3838
diff changeset
2565
e78705239df5 [project @ 2001-11-16 12:56:20 by jwe]
jwe
parents: 3838
diff changeset
2566 MX_BASE_REDUCTION_OP (Matrix, ROW_EXPR, COL_EXPR, 0.0, 0.0);
e78705239df5 [project @ 2001-11-16 12:56:20 by jwe]
jwe
parents: 3838
diff changeset
2567
e78705239df5 [project @ 2001-11-16 12:56:20 by jwe]
jwe
parents: 3838
diff changeset
2568 #undef ROW_EXPR
e78705239df5 [project @ 2001-11-16 12:56:20 by jwe]
jwe
parents: 3838
diff changeset
2569 #undef COL_EXPR
458
38cb88095913 [project @ 1994-06-06 00:41:10 by jwe]
jwe
parents:
diff changeset
2570 }
38cb88095913 [project @ 1994-06-06 00:41:10 by jwe]
jwe
parents:
diff changeset
2571
2385
170053c0f75e [project @ 1996-10-12 18:23:01 by jwe]
jwe
parents: 2354
diff changeset
2572 Matrix
170053c0f75e [project @ 1996-10-12 18:23:01 by jwe]
jwe
parents: 2354
diff changeset
2573 Matrix::abs (void) const
170053c0f75e [project @ 1996-10-12 18:23:01 by jwe]
jwe
parents: 2354
diff changeset
2574 {
5275
23b37da9fd5b [project @ 2005-04-08 16:07:35 by jwe]
jwe
parents: 5105
diff changeset
2575 octave_idx_type nr = rows ();
23b37da9fd5b [project @ 2005-04-08 16:07:35 by jwe]
jwe
parents: 5105
diff changeset
2576 octave_idx_type nc = cols ();
2385
170053c0f75e [project @ 1996-10-12 18:23:01 by jwe]
jwe
parents: 2354
diff changeset
2577
170053c0f75e [project @ 1996-10-12 18:23:01 by jwe]
jwe
parents: 2354
diff changeset
2578 Matrix retval (nr, nc);
170053c0f75e [project @ 1996-10-12 18:23:01 by jwe]
jwe
parents: 2354
diff changeset
2579
5275
23b37da9fd5b [project @ 2005-04-08 16:07:35 by jwe]
jwe
parents: 5105
diff changeset
2580 for (octave_idx_type j = 0; j < nc; j++)
23b37da9fd5b [project @ 2005-04-08 16:07:35 by jwe]
jwe
parents: 5105
diff changeset
2581 for (octave_idx_type i = 0; i < nr; i++)
2385
170053c0f75e [project @ 1996-10-12 18:23:01 by jwe]
jwe
parents: 2354
diff changeset
2582 retval (i, j) = fabs (elem (i, j));
170053c0f75e [project @ 1996-10-12 18:23:01 by jwe]
jwe
parents: 2354
diff changeset
2583
170053c0f75e [project @ 1996-10-12 18:23:01 by jwe]
jwe
parents: 2354
diff changeset
2584 return retval;
170053c0f75e [project @ 1996-10-12 18:23:01 by jwe]
jwe
parents: 2354
diff changeset
2585 }
170053c0f75e [project @ 1996-10-12 18:23:01 by jwe]
jwe
parents: 2354
diff changeset
2586
458
38cb88095913 [project @ 1994-06-06 00:41:10 by jwe]
jwe
parents:
diff changeset
2587 ColumnVector
38cb88095913 [project @ 1994-06-06 00:41:10 by jwe]
jwe
parents:
diff changeset
2588 Matrix::diag (void) const
38cb88095913 [project @ 1994-06-06 00:41:10 by jwe]
jwe
parents:
diff changeset
2589 {
38cb88095913 [project @ 1994-06-06 00:41:10 by jwe]
jwe
parents:
diff changeset
2590 return diag (0);
38cb88095913 [project @ 1994-06-06 00:41:10 by jwe]
jwe
parents:
diff changeset
2591 }
38cb88095913 [project @ 1994-06-06 00:41:10 by jwe]
jwe
parents:
diff changeset
2592
38cb88095913 [project @ 1994-06-06 00:41:10 by jwe]
jwe
parents:
diff changeset
2593 ColumnVector
5275
23b37da9fd5b [project @ 2005-04-08 16:07:35 by jwe]
jwe
parents: 5105
diff changeset
2594 Matrix::diag (octave_idx_type k) const
458
38cb88095913 [project @ 1994-06-06 00:41:10 by jwe]
jwe
parents:
diff changeset
2595 {
5275
23b37da9fd5b [project @ 2005-04-08 16:07:35 by jwe]
jwe
parents: 5105
diff changeset
2596 octave_idx_type nnr = rows ();
23b37da9fd5b [project @ 2005-04-08 16:07:35 by jwe]
jwe
parents: 5105
diff changeset
2597 octave_idx_type nnc = cols ();
458
38cb88095913 [project @ 1994-06-06 00:41:10 by jwe]
jwe
parents:
diff changeset
2598 if (k > 0)
38cb88095913 [project @ 1994-06-06 00:41:10 by jwe]
jwe
parents:
diff changeset
2599 nnc -= k;
38cb88095913 [project @ 1994-06-06 00:41:10 by jwe]
jwe
parents:
diff changeset
2600 else if (k < 0)
38cb88095913 [project @ 1994-06-06 00:41:10 by jwe]
jwe
parents:
diff changeset
2601 nnr += k;
38cb88095913 [project @ 1994-06-06 00:41:10 by jwe]
jwe
parents:
diff changeset
2602
38cb88095913 [project @ 1994-06-06 00:41:10 by jwe]
jwe
parents:
diff changeset
2603 ColumnVector d;
38cb88095913 [project @ 1994-06-06 00:41:10 by jwe]
jwe
parents:
diff changeset
2604
38cb88095913 [project @ 1994-06-06 00:41:10 by jwe]
jwe
parents:
diff changeset
2605 if (nnr > 0 && nnc > 0)
38cb88095913 [project @ 1994-06-06 00:41:10 by jwe]
jwe
parents:
diff changeset
2606 {
5275
23b37da9fd5b [project @ 2005-04-08 16:07:35 by jwe]
jwe
parents: 5105
diff changeset
2607 octave_idx_type ndiag = (nnr < nnc) ? nnr : nnc;
458
38cb88095913 [project @ 1994-06-06 00:41:10 by jwe]
jwe
parents:
diff changeset
2608
38cb88095913 [project @ 1994-06-06 00:41:10 by jwe]
jwe
parents:
diff changeset
2609 d.resize (ndiag);
38cb88095913 [project @ 1994-06-06 00:41:10 by jwe]
jwe
parents:
diff changeset
2610
38cb88095913 [project @ 1994-06-06 00:41:10 by jwe]
jwe
parents:
diff changeset
2611 if (k > 0)
38cb88095913 [project @ 1994-06-06 00:41:10 by jwe]
jwe
parents:
diff changeset
2612 {
5275
23b37da9fd5b [project @ 2005-04-08 16:07:35 by jwe]
jwe
parents: 5105
diff changeset
2613 for (octave_idx_type i = 0; i < ndiag; i++)
458
38cb88095913 [project @ 1994-06-06 00:41:10 by jwe]
jwe
parents:
diff changeset
2614 d.elem (i) = elem (i, i+k);
38cb88095913 [project @ 1994-06-06 00:41:10 by jwe]
jwe
parents:
diff changeset
2615 }
4509
9ec494b3eb5f [project @ 2003-09-11 19:08:25 by jwe]
jwe
parents: 4469
diff changeset
2616 else if (k < 0)
458
38cb88095913 [project @ 1994-06-06 00:41:10 by jwe]
jwe
parents:
diff changeset
2617 {
5275
23b37da9fd5b [project @ 2005-04-08 16:07:35 by jwe]
jwe
parents: 5105
diff changeset
2618 for (octave_idx_type i = 0; i < ndiag; i++)
458
38cb88095913 [project @ 1994-06-06 00:41:10 by jwe]
jwe
parents:
diff changeset
2619 d.elem (i) = elem (i-k, i);
38cb88095913 [project @ 1994-06-06 00:41:10 by jwe]
jwe
parents:
diff changeset
2620 }
38cb88095913 [project @ 1994-06-06 00:41:10 by jwe]
jwe
parents:
diff changeset
2621 else
38cb88095913 [project @ 1994-06-06 00:41:10 by jwe]
jwe
parents:
diff changeset
2622 {
5275
23b37da9fd5b [project @ 2005-04-08 16:07:35 by jwe]
jwe
parents: 5105
diff changeset
2623 for (octave_idx_type i = 0; i < ndiag; i++)
458
38cb88095913 [project @ 1994-06-06 00:41:10 by jwe]
jwe
parents:
diff changeset
2624 d.elem (i) = elem (i, i);
38cb88095913 [project @ 1994-06-06 00:41:10 by jwe]
jwe
parents:
diff changeset
2625 }
38cb88095913 [project @ 1994-06-06 00:41:10 by jwe]
jwe
parents:
diff changeset
2626 }
38cb88095913 [project @ 1994-06-06 00:41:10 by jwe]
jwe
parents:
diff changeset
2627 else
4513
508238e65af7 [project @ 2003-09-19 21:40:57 by jwe]
jwe
parents: 4509
diff changeset
2628 (*current_liboctave_error_handler)
508238e65af7 [project @ 2003-09-19 21:40:57 by jwe]
jwe
parents: 4509
diff changeset
2629 ("diag: requested diagonal out of range");
458
38cb88095913 [project @ 1994-06-06 00:41:10 by jwe]
jwe
parents:
diff changeset
2630
38cb88095913 [project @ 1994-06-06 00:41:10 by jwe]
jwe
parents:
diff changeset
2631 return d;
38cb88095913 [project @ 1994-06-06 00:41:10 by jwe]
jwe
parents:
diff changeset
2632 }
38cb88095913 [project @ 1994-06-06 00:41:10 by jwe]
jwe
parents:
diff changeset
2633
38cb88095913 [project @ 1994-06-06 00:41:10 by jwe]
jwe
parents:
diff changeset
2634 ColumnVector
38cb88095913 [project @ 1994-06-06 00:41:10 by jwe]
jwe
parents:
diff changeset
2635 Matrix::row_min (void) const
38cb88095913 [project @ 1994-06-06 00:41:10 by jwe]
jwe
parents:
diff changeset
2636 {
5275
23b37da9fd5b [project @ 2005-04-08 16:07:35 by jwe]
jwe
parents: 5105
diff changeset
2637 Array<octave_idx_type> dummy_idx;
4587
7b957b442818 [project @ 2003-11-10 15:50:39 by jwe]
jwe
parents: 4574
diff changeset
2638 return row_min (dummy_idx);
458
38cb88095913 [project @ 1994-06-06 00:41:10 by jwe]
jwe
parents:
diff changeset
2639 }
38cb88095913 [project @ 1994-06-06 00:41:10 by jwe]
jwe
parents:
diff changeset
2640
38cb88095913 [project @ 1994-06-06 00:41:10 by jwe]
jwe
parents:
diff changeset
2641 ColumnVector
5275
23b37da9fd5b [project @ 2005-04-08 16:07:35 by jwe]
jwe
parents: 5105
diff changeset
2642 Matrix::row_min (Array<octave_idx_type>& idx_arg) const
458
38cb88095913 [project @ 1994-06-06 00:41:10 by jwe]
jwe
parents:
diff changeset
2643 {
38cb88095913 [project @ 1994-06-06 00:41:10 by jwe]
jwe
parents:
diff changeset
2644 ColumnVector result;
38cb88095913 [project @ 1994-06-06 00:41:10 by jwe]
jwe
parents:
diff changeset
2645
5275
23b37da9fd5b [project @ 2005-04-08 16:07:35 by jwe]
jwe
parents: 5105
diff changeset
2646 octave_idx_type nr = rows ();
23b37da9fd5b [project @ 2005-04-08 16:07:35 by jwe]
jwe
parents: 5105
diff changeset
2647 octave_idx_type nc = cols ();
458
38cb88095913 [project @ 1994-06-06 00:41:10 by jwe]
jwe
parents:
diff changeset
2648
38cb88095913 [project @ 1994-06-06 00:41:10 by jwe]
jwe
parents:
diff changeset
2649 if (nr > 0 && nc > 0)
38cb88095913 [project @ 1994-06-06 00:41:10 by jwe]
jwe
parents:
diff changeset
2650 {
38cb88095913 [project @ 1994-06-06 00:41:10 by jwe]
jwe
parents:
diff changeset
2651 result.resize (nr);
4587
7b957b442818 [project @ 2003-11-10 15:50:39 by jwe]
jwe
parents: 4574
diff changeset
2652 idx_arg.resize (nr);
458
38cb88095913 [project @ 1994-06-06 00:41:10 by jwe]
jwe
parents:
diff changeset
2653
5275
23b37da9fd5b [project @ 2005-04-08 16:07:35 by jwe]
jwe
parents: 5105
diff changeset
2654 for (octave_idx_type i = 0; i < nr; i++)
458
38cb88095913 [project @ 1994-06-06 00:41:10 by jwe]
jwe
parents:
diff changeset
2655 {
5275
23b37da9fd5b [project @ 2005-04-08 16:07:35 by jwe]
jwe
parents: 5105
diff changeset
2656 octave_idx_type idx_j;
4469
53ee020af847 [project @ 2003-07-26 03:45:10 by jwe]
jwe
parents: 4431
diff changeset
2657
53ee020af847 [project @ 2003-07-26 03:45:10 by jwe]
jwe
parents: 4431
diff changeset
2658 double tmp_min = octave_NaN;
53ee020af847 [project @ 2003-07-26 03:45:10 by jwe]
jwe
parents: 4431
diff changeset
2659
53ee020af847 [project @ 2003-07-26 03:45:10 by jwe]
jwe
parents: 4431
diff changeset
2660 for (idx_j = 0; idx_j < nc; idx_j++)
2354
2ce6e1ec9b53 [project @ 1996-08-20 22:44:25 by jwe]
jwe
parents: 2349
diff changeset
2661 {
4469
53ee020af847 [project @ 2003-07-26 03:45:10 by jwe]
jwe
parents: 4431
diff changeset
2662 tmp_min = elem (i, idx_j);
53ee020af847 [project @ 2003-07-26 03:45:10 by jwe]
jwe
parents: 4431
diff changeset
2663
5389
25c8956d2204 [project @ 2005-06-15 03:45:46 by jwe]
jwe
parents: 5387
diff changeset
2664 if (! xisnan (tmp_min))
4469
53ee020af847 [project @ 2003-07-26 03:45:10 by jwe]
jwe
parents: 4431
diff changeset
2665 break;
53ee020af847 [project @ 2003-07-26 03:45:10 by jwe]
jwe
parents: 4431
diff changeset
2666 }
53ee020af847 [project @ 2003-07-26 03:45:10 by jwe]
jwe
parents: 4431
diff changeset
2667
5275
23b37da9fd5b [project @ 2005-04-08 16:07:35 by jwe]
jwe
parents: 5105
diff changeset
2668 for (octave_idx_type j = idx_j+1; j < nc; j++)
4469
53ee020af847 [project @ 2003-07-26 03:45:10 by jwe]
jwe
parents: 4431
diff changeset
2669 {
53ee020af847 [project @ 2003-07-26 03:45:10 by jwe]
jwe
parents: 4431
diff changeset
2670 double tmp = elem (i, j);
53ee020af847 [project @ 2003-07-26 03:45:10 by jwe]
jwe
parents: 4431
diff changeset
2671
5389
25c8956d2204 [project @ 2005-06-15 03:45:46 by jwe]
jwe
parents: 5387
diff changeset
2672 if (xisnan (tmp))
4469
53ee020af847 [project @ 2003-07-26 03:45:10 by jwe]
jwe
parents: 4431
diff changeset
2673 continue;
53ee020af847 [project @ 2003-07-26 03:45:10 by jwe]
jwe
parents: 4431
diff changeset
2674 else if (tmp < tmp_min)
2354
2ce6e1ec9b53 [project @ 1996-08-20 22:44:25 by jwe]
jwe
parents: 2349
diff changeset
2675 {
4469
53ee020af847 [project @ 2003-07-26 03:45:10 by jwe]
jwe
parents: 4431
diff changeset
2676 idx_j = j;
53ee020af847 [project @ 2003-07-26 03:45:10 by jwe]
jwe
parents: 4431
diff changeset
2677 tmp_min = tmp;
2354
2ce6e1ec9b53 [project @ 1996-08-20 22:44:25 by jwe]
jwe
parents: 2349
diff changeset
2678 }
2ce6e1ec9b53 [project @ 1996-08-20 22:44:25 by jwe]
jwe
parents: 2349
diff changeset
2679 }
2ce6e1ec9b53 [project @ 1996-08-20 22:44:25 by jwe]
jwe
parents: 2349
diff changeset
2680
4469
53ee020af847 [project @ 2003-07-26 03:45:10 by jwe]
jwe
parents: 4431
diff changeset
2681 result.elem (i) = tmp_min;
5389
25c8956d2204 [project @ 2005-06-15 03:45:46 by jwe]
jwe
parents: 5387
diff changeset
2682 idx_arg.elem (i) = xisnan (tmp_min) ? 0 : idx_j;
458
38cb88095913 [project @ 1994-06-06 00:41:10 by jwe]
jwe
parents:
diff changeset
2683 }
38cb88095913 [project @ 1994-06-06 00:41:10 by jwe]
jwe
parents:
diff changeset
2684 }
38cb88095913 [project @ 1994-06-06 00:41:10 by jwe]
jwe
parents:
diff changeset
2685
38cb88095913 [project @ 1994-06-06 00:41:10 by jwe]
jwe
parents:
diff changeset
2686 return result;
38cb88095913 [project @ 1994-06-06 00:41:10 by jwe]
jwe
parents:
diff changeset
2687 }
38cb88095913 [project @ 1994-06-06 00:41:10 by jwe]
jwe
parents:
diff changeset
2688
38cb88095913 [project @ 1994-06-06 00:41:10 by jwe]
jwe
parents:
diff changeset
2689 ColumnVector
38cb88095913 [project @ 1994-06-06 00:41:10 by jwe]
jwe
parents:
diff changeset
2690 Matrix::row_max (void) const
38cb88095913 [project @ 1994-06-06 00:41:10 by jwe]
jwe
parents:
diff changeset
2691 {
5275
23b37da9fd5b [project @ 2005-04-08 16:07:35 by jwe]
jwe
parents: 5105
diff changeset
2692 Array<octave_idx_type> dummy_idx;
4587
7b957b442818 [project @ 2003-11-10 15:50:39 by jwe]
jwe
parents: 4574
diff changeset
2693 return row_max (dummy_idx);
458
38cb88095913 [project @ 1994-06-06 00:41:10 by jwe]
jwe
parents:
diff changeset
2694 }
38cb88095913 [project @ 1994-06-06 00:41:10 by jwe]
jwe
parents:
diff changeset
2695
38cb88095913 [project @ 1994-06-06 00:41:10 by jwe]
jwe
parents:
diff changeset
2696 ColumnVector
5275
23b37da9fd5b [project @ 2005-04-08 16:07:35 by jwe]
jwe
parents: 5105
diff changeset
2697 Matrix::row_max (Array<octave_idx_type>& idx_arg) const
458
38cb88095913 [project @ 1994-06-06 00:41:10 by jwe]
jwe
parents:
diff changeset
2698 {
38cb88095913 [project @ 1994-06-06 00:41:10 by jwe]
jwe
parents:
diff changeset
2699 ColumnVector result;
38cb88095913 [project @ 1994-06-06 00:41:10 by jwe]
jwe
parents:
diff changeset
2700
5275
23b37da9fd5b [project @ 2005-04-08 16:07:35 by jwe]
jwe
parents: 5105
diff changeset
2701 octave_idx_type nr = rows ();
23b37da9fd5b [project @ 2005-04-08 16:07:35 by jwe]
jwe
parents: 5105
diff changeset
2702 octave_idx_type nc = cols ();
458
38cb88095913 [project @ 1994-06-06 00:41:10 by jwe]
jwe
parents:
diff changeset
2703
38cb88095913 [project @ 1994-06-06 00:41:10 by jwe]
jwe
parents:
diff changeset
2704 if (nr > 0 && nc > 0)
38cb88095913 [project @ 1994-06-06 00:41:10 by jwe]
jwe
parents:
diff changeset
2705 {
38cb88095913 [project @ 1994-06-06 00:41:10 by jwe]
jwe
parents:
diff changeset
2706 result.resize (nr);
4587
7b957b442818 [project @ 2003-11-10 15:50:39 by jwe]
jwe
parents: 4574
diff changeset
2707 idx_arg.resize (nr);
458
38cb88095913 [project @ 1994-06-06 00:41:10 by jwe]
jwe
parents:
diff changeset
2708
5275
23b37da9fd5b [project @ 2005-04-08 16:07:35 by jwe]
jwe
parents: 5105
diff changeset
2709 for (octave_idx_type i = 0; i < nr; i++)
458
38cb88095913 [project @ 1994-06-06 00:41:10 by jwe]
jwe
parents:
diff changeset
2710 {
5275
23b37da9fd5b [project @ 2005-04-08 16:07:35 by jwe]
jwe
parents: 5105
diff changeset
2711 octave_idx_type idx_j;
4469
53ee020af847 [project @ 2003-07-26 03:45:10 by jwe]
jwe
parents: 4431
diff changeset
2712
53ee020af847 [project @ 2003-07-26 03:45:10 by jwe]
jwe
parents: 4431
diff changeset
2713 double tmp_max = octave_NaN;
53ee020af847 [project @ 2003-07-26 03:45:10 by jwe]
jwe
parents: 4431
diff changeset
2714
53ee020af847 [project @ 2003-07-26 03:45:10 by jwe]
jwe
parents: 4431
diff changeset
2715 for (idx_j = 0; idx_j < nc; idx_j++)
2354
2ce6e1ec9b53 [project @ 1996-08-20 22:44:25 by jwe]
jwe
parents: 2349
diff changeset
2716 {
4469
53ee020af847 [project @ 2003-07-26 03:45:10 by jwe]
jwe
parents: 4431
diff changeset
2717 tmp_max = elem (i, idx_j);
53ee020af847 [project @ 2003-07-26 03:45:10 by jwe]
jwe
parents: 4431
diff changeset
2718
5389
25c8956d2204 [project @ 2005-06-15 03:45:46 by jwe]
jwe
parents: 5387
diff changeset
2719 if (! xisnan (tmp_max))
4469
53ee020af847 [project @ 2003-07-26 03:45:10 by jwe]
jwe
parents: 4431
diff changeset
2720 break;
53ee020af847 [project @ 2003-07-26 03:45:10 by jwe]
jwe
parents: 4431
diff changeset
2721 }
53ee020af847 [project @ 2003-07-26 03:45:10 by jwe]
jwe
parents: 4431
diff changeset
2722
5275
23b37da9fd5b [project @ 2005-04-08 16:07:35 by jwe]
jwe
parents: 5105
diff changeset
2723 for (octave_idx_type j = idx_j+1; j < nc; j++)
4469
53ee020af847 [project @ 2003-07-26 03:45:10 by jwe]
jwe
parents: 4431
diff changeset
2724 {
53ee020af847 [project @ 2003-07-26 03:45:10 by jwe]
jwe
parents: 4431
diff changeset
2725 double tmp = elem (i, j);
53ee020af847 [project @ 2003-07-26 03:45:10 by jwe]
jwe
parents: 4431
diff changeset
2726
5389
25c8956d2204 [project @ 2005-06-15 03:45:46 by jwe]
jwe
parents: 5387
diff changeset
2727 if (xisnan (tmp))
4469
53ee020af847 [project @ 2003-07-26 03:45:10 by jwe]
jwe
parents: 4431
diff changeset
2728 continue;
53ee020af847 [project @ 2003-07-26 03:45:10 by jwe]
jwe
parents: 4431
diff changeset
2729 else if (tmp > tmp_max)
2354
2ce6e1ec9b53 [project @ 1996-08-20 22:44:25 by jwe]
jwe
parents: 2349
diff changeset
2730 {
4469
53ee020af847 [project @ 2003-07-26 03:45:10 by jwe]
jwe
parents: 4431
diff changeset
2731 idx_j = j;
53ee020af847 [project @ 2003-07-26 03:45:10 by jwe]
jwe
parents: 4431
diff changeset
2732 tmp_max = tmp;
2354
2ce6e1ec9b53 [project @ 1996-08-20 22:44:25 by jwe]
jwe
parents: 2349
diff changeset
2733 }
2ce6e1ec9b53 [project @ 1996-08-20 22:44:25 by jwe]
jwe
parents: 2349
diff changeset
2734 }
2ce6e1ec9b53 [project @ 1996-08-20 22:44:25 by jwe]
jwe
parents: 2349
diff changeset
2735
4469
53ee020af847 [project @ 2003-07-26 03:45:10 by jwe]
jwe
parents: 4431
diff changeset
2736 result.elem (i) = tmp_max;
5389
25c8956d2204 [project @ 2005-06-15 03:45:46 by jwe]
jwe
parents: 5387
diff changeset
2737 idx_arg.elem (i) = xisnan (tmp_max) ? 0 : idx_j;
458
38cb88095913 [project @ 1994-06-06 00:41:10 by jwe]
jwe
parents:
diff changeset
2738 }
38cb88095913 [project @ 1994-06-06 00:41:10 by jwe]
jwe
parents:
diff changeset
2739 }
38cb88095913 [project @ 1994-06-06 00:41:10 by jwe]
jwe
parents:
diff changeset
2740
38cb88095913 [project @ 1994-06-06 00:41:10 by jwe]
jwe
parents:
diff changeset
2741 return result;
38cb88095913 [project @ 1994-06-06 00:41:10 by jwe]
jwe
parents:
diff changeset
2742 }
38cb88095913 [project @ 1994-06-06 00:41:10 by jwe]
jwe
parents:
diff changeset
2743
38cb88095913 [project @ 1994-06-06 00:41:10 by jwe]
jwe
parents:
diff changeset
2744 RowVector
38cb88095913 [project @ 1994-06-06 00:41:10 by jwe]
jwe
parents:
diff changeset
2745 Matrix::column_min (void) const
38cb88095913 [project @ 1994-06-06 00:41:10 by jwe]
jwe
parents:
diff changeset
2746 {
5275
23b37da9fd5b [project @ 2005-04-08 16:07:35 by jwe]
jwe
parents: 5105
diff changeset
2747 Array<octave_idx_type> dummy_idx;
4587
7b957b442818 [project @ 2003-11-10 15:50:39 by jwe]
jwe
parents: 4574
diff changeset
2748 return column_min (dummy_idx);
458
38cb88095913 [project @ 1994-06-06 00:41:10 by jwe]
jwe
parents:
diff changeset
2749 }
2354
2ce6e1ec9b53 [project @ 1996-08-20 22:44:25 by jwe]
jwe
parents: 2349
diff changeset
2750
458
38cb88095913 [project @ 1994-06-06 00:41:10 by jwe]
jwe
parents:
diff changeset
2751 RowVector
5275
23b37da9fd5b [project @ 2005-04-08 16:07:35 by jwe]
jwe
parents: 5105
diff changeset
2752 Matrix::column_min (Array<octave_idx_type>& idx_arg) const
458
38cb88095913 [project @ 1994-06-06 00:41:10 by jwe]
jwe
parents:
diff changeset
2753 {
38cb88095913 [project @ 1994-06-06 00:41:10 by jwe]
jwe
parents:
diff changeset
2754 RowVector result;
38cb88095913 [project @ 1994-06-06 00:41:10 by jwe]
jwe
parents:
diff changeset
2755
5275
23b37da9fd5b [project @ 2005-04-08 16:07:35 by jwe]
jwe
parents: 5105
diff changeset
2756 octave_idx_type nr = rows ();
23b37da9fd5b [project @ 2005-04-08 16:07:35 by jwe]
jwe
parents: 5105
diff changeset
2757 octave_idx_type nc = cols ();
458
38cb88095913 [project @ 1994-06-06 00:41:10 by jwe]
jwe
parents:
diff changeset
2758
38cb88095913 [project @ 1994-06-06 00:41:10 by jwe]
jwe
parents:
diff changeset
2759 if (nr > 0 && nc > 0)
38cb88095913 [project @ 1994-06-06 00:41:10 by jwe]
jwe
parents:
diff changeset
2760 {
38cb88095913 [project @ 1994-06-06 00:41:10 by jwe]
jwe
parents:
diff changeset
2761 result.resize (nc);
4587
7b957b442818 [project @ 2003-11-10 15:50:39 by jwe]
jwe
parents: 4574
diff changeset
2762 idx_arg.resize (nc);
458
38cb88095913 [project @ 1994-06-06 00:41:10 by jwe]
jwe
parents:
diff changeset
2763
5275
23b37da9fd5b [project @ 2005-04-08 16:07:35 by jwe]
jwe
parents: 5105
diff changeset
2764 for (octave_idx_type j = 0; j < nc; j++)
458
38cb88095913 [project @ 1994-06-06 00:41:10 by jwe]
jwe
parents:
diff changeset
2765 {
5275
23b37da9fd5b [project @ 2005-04-08 16:07:35 by jwe]
jwe
parents: 5105
diff changeset
2766 octave_idx_type idx_i;
4469
53ee020af847 [project @ 2003-07-26 03:45:10 by jwe]
jwe
parents: 4431
diff changeset
2767
53ee020af847 [project @ 2003-07-26 03:45:10 by jwe]
jwe
parents: 4431
diff changeset
2768 double tmp_min = octave_NaN;
53ee020af847 [project @ 2003-07-26 03:45:10 by jwe]
jwe
parents: 4431
diff changeset
2769
53ee020af847 [project @ 2003-07-26 03:45:10 by jwe]
jwe
parents: 4431
diff changeset
2770 for (idx_i = 0; idx_i < nr; idx_i++)
2354
2ce6e1ec9b53 [project @ 1996-08-20 22:44:25 by jwe]
jwe
parents: 2349
diff changeset
2771 {
4469
53ee020af847 [project @ 2003-07-26 03:45:10 by jwe]
jwe
parents: 4431
diff changeset
2772 tmp_min = elem (idx_i, j);
53ee020af847 [project @ 2003-07-26 03:45:10 by jwe]
jwe
parents: 4431
diff changeset
2773
5389
25c8956d2204 [project @ 2005-06-15 03:45:46 by jwe]
jwe
parents: 5387
diff changeset
2774 if (! xisnan (tmp_min))
4469
53ee020af847 [project @ 2003-07-26 03:45:10 by jwe]
jwe
parents: 4431
diff changeset
2775 break;
53ee020af847 [project @ 2003-07-26 03:45:10 by jwe]
jwe
parents: 4431
diff changeset
2776 }
53ee020af847 [project @ 2003-07-26 03:45:10 by jwe]
jwe
parents: 4431
diff changeset
2777
5275
23b37da9fd5b [project @ 2005-04-08 16:07:35 by jwe]
jwe
parents: 5105
diff changeset
2778 for (octave_idx_type i = idx_i+1; i < nr; i++)
4469
53ee020af847 [project @ 2003-07-26 03:45:10 by jwe]
jwe
parents: 4431
diff changeset
2779 {
53ee020af847 [project @ 2003-07-26 03:45:10 by jwe]
jwe
parents: 4431
diff changeset
2780 double tmp = elem (i, j);
53ee020af847 [project @ 2003-07-26 03:45:10 by jwe]
jwe
parents: 4431
diff changeset
2781
5389
25c8956d2204 [project @ 2005-06-15 03:45:46 by jwe]
jwe
parents: 5387
diff changeset
2782 if (xisnan (tmp))
4469
53ee020af847 [project @ 2003-07-26 03:45:10 by jwe]
jwe
parents: 4431
diff changeset
2783 continue;
53ee020af847 [project @ 2003-07-26 03:45:10 by jwe]
jwe
parents: 4431
diff changeset
2784 else if (tmp < tmp_min)
2354
2ce6e1ec9b53 [project @ 1996-08-20 22:44:25 by jwe]
jwe
parents: 2349
diff changeset
2785 {
4469
53ee020af847 [project @ 2003-07-26 03:45:10 by jwe]
jwe
parents: 4431
diff changeset
2786 idx_i = i;
53ee020af847 [project @ 2003-07-26 03:45:10 by jwe]
jwe
parents: 4431
diff changeset
2787 tmp_min = tmp;
2354
2ce6e1ec9b53 [project @ 1996-08-20 22:44:25 by jwe]
jwe
parents: 2349
diff changeset
2788 }
2ce6e1ec9b53 [project @ 1996-08-20 22:44:25 by jwe]
jwe
parents: 2349
diff changeset
2789 }
2ce6e1ec9b53 [project @ 1996-08-20 22:44:25 by jwe]
jwe
parents: 2349
diff changeset
2790
4469
53ee020af847 [project @ 2003-07-26 03:45:10 by jwe]
jwe
parents: 4431
diff changeset
2791 result.elem (j) = tmp_min;
5389
25c8956d2204 [project @ 2005-06-15 03:45:46 by jwe]
jwe
parents: 5387
diff changeset
2792 idx_arg.elem (j) = xisnan (tmp_min) ? 0 : idx_i;
458
38cb88095913 [project @ 1994-06-06 00:41:10 by jwe]
jwe
parents:
diff changeset
2793 }
38cb88095913 [project @ 1994-06-06 00:41:10 by jwe]
jwe
parents:
diff changeset
2794 }
38cb88095913 [project @ 1994-06-06 00:41:10 by jwe]
jwe
parents:
diff changeset
2795
38cb88095913 [project @ 1994-06-06 00:41:10 by jwe]
jwe
parents:
diff changeset
2796 return result;
38cb88095913 [project @ 1994-06-06 00:41:10 by jwe]
jwe
parents:
diff changeset
2797 }
38cb88095913 [project @ 1994-06-06 00:41:10 by jwe]
jwe
parents:
diff changeset
2798
2354
2ce6e1ec9b53 [project @ 1996-08-20 22:44:25 by jwe]
jwe
parents: 2349
diff changeset
2799 RowVector
2ce6e1ec9b53 [project @ 1996-08-20 22:44:25 by jwe]
jwe
parents: 2349
diff changeset
2800 Matrix::column_max (void) const
2ce6e1ec9b53 [project @ 1996-08-20 22:44:25 by jwe]
jwe
parents: 2349
diff changeset
2801 {
5275
23b37da9fd5b [project @ 2005-04-08 16:07:35 by jwe]
jwe
parents: 5105
diff changeset
2802 Array<octave_idx_type> dummy_idx;
4587
7b957b442818 [project @ 2003-11-10 15:50:39 by jwe]
jwe
parents: 4574
diff changeset
2803 return column_max (dummy_idx);
2354
2ce6e1ec9b53 [project @ 1996-08-20 22:44:25 by jwe]
jwe
parents: 2349
diff changeset
2804 }
458
38cb88095913 [project @ 1994-06-06 00:41:10 by jwe]
jwe
parents:
diff changeset
2805
38cb88095913 [project @ 1994-06-06 00:41:10 by jwe]
jwe
parents:
diff changeset
2806 RowVector
5275
23b37da9fd5b [project @ 2005-04-08 16:07:35 by jwe]
jwe
parents: 5105
diff changeset
2807 Matrix::column_max (Array<octave_idx_type>& idx_arg) const
458
38cb88095913 [project @ 1994-06-06 00:41:10 by jwe]
jwe
parents:
diff changeset
2808 {
38cb88095913 [project @ 1994-06-06 00:41:10 by jwe]
jwe
parents:
diff changeset
2809 RowVector result;
38cb88095913 [project @ 1994-06-06 00:41:10 by jwe]
jwe
parents:
diff changeset
2810
5275
23b37da9fd5b [project @ 2005-04-08 16:07:35 by jwe]
jwe
parents: 5105
diff changeset
2811 octave_idx_type nr = rows ();
23b37da9fd5b [project @ 2005-04-08 16:07:35 by jwe]
jwe
parents: 5105
diff changeset
2812 octave_idx_type nc = cols ();
458
38cb88095913 [project @ 1994-06-06 00:41:10 by jwe]
jwe
parents:
diff changeset
2813
38cb88095913 [project @ 1994-06-06 00:41:10 by jwe]
jwe
parents:
diff changeset
2814 if (nr > 0 && nc > 0)
38cb88095913 [project @ 1994-06-06 00:41:10 by jwe]
jwe
parents:
diff changeset
2815 {
38cb88095913 [project @ 1994-06-06 00:41:10 by jwe]
jwe
parents:
diff changeset
2816 result.resize (nc);
4587
7b957b442818 [project @ 2003-11-10 15:50:39 by jwe]
jwe
parents: 4574
diff changeset
2817 idx_arg.resize (nc);
458
38cb88095913 [project @ 1994-06-06 00:41:10 by jwe]
jwe
parents:
diff changeset
2818
5275
23b37da9fd5b [project @ 2005-04-08 16:07:35 by jwe]
jwe
parents: 5105
diff changeset
2819 for (octave_idx_type j = 0; j < nc; j++)
458
38cb88095913 [project @ 1994-06-06 00:41:10 by jwe]
jwe
parents:
diff changeset
2820 {
5275
23b37da9fd5b [project @ 2005-04-08 16:07:35 by jwe]
jwe
parents: 5105
diff changeset
2821 octave_idx_type idx_i;
4469
53ee020af847 [project @ 2003-07-26 03:45:10 by jwe]
jwe
parents: 4431
diff changeset
2822
53ee020af847 [project @ 2003-07-26 03:45:10 by jwe]
jwe
parents: 4431
diff changeset
2823 double tmp_max = octave_NaN;
53ee020af847 [project @ 2003-07-26 03:45:10 by jwe]
jwe
parents: 4431
diff changeset
2824
53ee020af847 [project @ 2003-07-26 03:45:10 by jwe]
jwe
parents: 4431
diff changeset
2825 for (idx_i = 0; idx_i < nr; idx_i++)
2354
2ce6e1ec9b53 [project @ 1996-08-20 22:44:25 by jwe]
jwe
parents: 2349
diff changeset
2826 {
4469
53ee020af847 [project @ 2003-07-26 03:45:10 by jwe]
jwe
parents: 4431
diff changeset
2827 tmp_max = elem (idx_i, j);
53ee020af847 [project @ 2003-07-26 03:45:10 by jwe]
jwe
parents: 4431
diff changeset
2828
5389
25c8956d2204 [project @ 2005-06-15 03:45:46 by jwe]
jwe
parents: 5387
diff changeset
2829 if (! xisnan (tmp_max))
4469
53ee020af847 [project @ 2003-07-26 03:45:10 by jwe]
jwe
parents: 4431
diff changeset
2830 break;
53ee020af847 [project @ 2003-07-26 03:45:10 by jwe]
jwe
parents: 4431
diff changeset
2831 }
53ee020af847 [project @ 2003-07-26 03:45:10 by jwe]
jwe
parents: 4431
diff changeset
2832
5275
23b37da9fd5b [project @ 2005-04-08 16:07:35 by jwe]
jwe
parents: 5105
diff changeset
2833 for (octave_idx_type i = idx_i+1; i < nr; i++)
4469
53ee020af847 [project @ 2003-07-26 03:45:10 by jwe]
jwe
parents: 4431
diff changeset
2834 {
53ee020af847 [project @ 2003-07-26 03:45:10 by jwe]
jwe
parents: 4431
diff changeset
2835 double tmp = elem (i, j);
53ee020af847 [project @ 2003-07-26 03:45:10 by jwe]
jwe
parents: 4431
diff changeset
2836
5389
25c8956d2204 [project @ 2005-06-15 03:45:46 by jwe]
jwe
parents: 5387
diff changeset
2837 if (xisnan (tmp))
4469
53ee020af847 [project @ 2003-07-26 03:45:10 by jwe]
jwe
parents: 4431
diff changeset
2838 continue;
53ee020af847 [project @ 2003-07-26 03:45:10 by jwe]
jwe
parents: 4431
diff changeset
2839 else if (tmp > tmp_max)
2354
2ce6e1ec9b53 [project @ 1996-08-20 22:44:25 by jwe]
jwe
parents: 2349
diff changeset
2840 {
4469
53ee020af847 [project @ 2003-07-26 03:45:10 by jwe]
jwe
parents: 4431
diff changeset
2841 idx_i = i;
53ee020af847 [project @ 2003-07-26 03:45:10 by jwe]
jwe
parents: 4431
diff changeset
2842 tmp_max = tmp;
2354
2ce6e1ec9b53 [project @ 1996-08-20 22:44:25 by jwe]
jwe
parents: 2349
diff changeset
2843 }
2ce6e1ec9b53 [project @ 1996-08-20 22:44:25 by jwe]
jwe
parents: 2349
diff changeset
2844 }
2ce6e1ec9b53 [project @ 1996-08-20 22:44:25 by jwe]
jwe
parents: 2349
diff changeset
2845
4469
53ee020af847 [project @ 2003-07-26 03:45:10 by jwe]
jwe
parents: 4431
diff changeset
2846 result.elem (j) = tmp_max;
5389
25c8956d2204 [project @ 2005-06-15 03:45:46 by jwe]
jwe
parents: 5387
diff changeset
2847 idx_arg.elem (j) = xisnan (tmp_max) ? 0 : idx_i;
458
38cb88095913 [project @ 1994-06-06 00:41:10 by jwe]
jwe
parents:
diff changeset
2848 }
38cb88095913 [project @ 1994-06-06 00:41:10 by jwe]
jwe
parents:
diff changeset
2849 }
38cb88095913 [project @ 1994-06-06 00:41:10 by jwe]
jwe
parents:
diff changeset
2850
38cb88095913 [project @ 1994-06-06 00:41:10 by jwe]
jwe
parents:
diff changeset
2851 return result;
38cb88095913 [project @ 1994-06-06 00:41:10 by jwe]
jwe
parents:
diff changeset
2852 }
38cb88095913 [project @ 1994-06-06 00:41:10 by jwe]
jwe
parents:
diff changeset
2853
5956
cdef72fcd206 [project @ 2006-08-22 20:36:56 by jwe]
jwe
parents: 5943
diff changeset
2854 // Used when converting Inf to something that gnuplot can read.
cdef72fcd206 [project @ 2006-08-22 20:36:56 by jwe]
jwe
parents: 5943
diff changeset
2855
cdef72fcd206 [project @ 2006-08-22 20:36:56 by jwe]
jwe
parents: 5943
diff changeset
2856 #ifndef OCT_RBV
cdef72fcd206 [project @ 2006-08-22 20:36:56 by jwe]
jwe
parents: 5943
diff changeset
2857 #define OCT_RBV DBL_MAX / 100.0
cdef72fcd206 [project @ 2006-08-22 20:36:56 by jwe]
jwe
parents: 5943
diff changeset
2858 #endif
cdef72fcd206 [project @ 2006-08-22 20:36:56 by jwe]
jwe
parents: 5943
diff changeset
2859
cdef72fcd206 [project @ 2006-08-22 20:36:56 by jwe]
jwe
parents: 5943
diff changeset
2860 std::ostream&
cdef72fcd206 [project @ 2006-08-22 20:36:56 by jwe]
jwe
parents: 5943
diff changeset
2861 Matrix::save_ascii (std::ostream& os, bool& infnan_warned,
cdef72fcd206 [project @ 2006-08-22 20:36:56 by jwe]
jwe
parents: 5943
diff changeset
2862 int strip_nan_and_inf)
cdef72fcd206 [project @ 2006-08-22 20:36:56 by jwe]
jwe
parents: 5943
diff changeset
2863 {
cdef72fcd206 [project @ 2006-08-22 20:36:56 by jwe]
jwe
parents: 5943
diff changeset
2864 if (strip_nan_and_inf)
cdef72fcd206 [project @ 2006-08-22 20:36:56 by jwe]
jwe
parents: 5943
diff changeset
2865 {
cdef72fcd206 [project @ 2006-08-22 20:36:56 by jwe]
jwe
parents: 5943
diff changeset
2866 octave_idx_type nr = rows ();
cdef72fcd206 [project @ 2006-08-22 20:36:56 by jwe]
jwe
parents: 5943
diff changeset
2867 octave_idx_type nc = columns ();
cdef72fcd206 [project @ 2006-08-22 20:36:56 by jwe]
jwe
parents: 5943
diff changeset
2868
cdef72fcd206 [project @ 2006-08-22 20:36:56 by jwe]
jwe
parents: 5943
diff changeset
2869 for (octave_idx_type i = 0; i < nr; i++)
cdef72fcd206 [project @ 2006-08-22 20:36:56 by jwe]
jwe
parents: 5943
diff changeset
2870 {
cdef72fcd206 [project @ 2006-08-22 20:36:56 by jwe]
jwe
parents: 5943
diff changeset
2871 if (strip_nan_and_inf)
cdef72fcd206 [project @ 2006-08-22 20:36:56 by jwe]
jwe
parents: 5943
diff changeset
2872 {
cdef72fcd206 [project @ 2006-08-22 20:36:56 by jwe]
jwe
parents: 5943
diff changeset
2873 for (octave_idx_type j = 0; j < nc; j++)
cdef72fcd206 [project @ 2006-08-22 20:36:56 by jwe]
jwe
parents: 5943
diff changeset
2874 {
cdef72fcd206 [project @ 2006-08-22 20:36:56 by jwe]
jwe
parents: 5943
diff changeset
2875 double d = elem (i, j);
cdef72fcd206 [project @ 2006-08-22 20:36:56 by jwe]
jwe
parents: 5943
diff changeset
2876
cdef72fcd206 [project @ 2006-08-22 20:36:56 by jwe]
jwe
parents: 5943
diff changeset
2877 if (xisnan (d))
cdef72fcd206 [project @ 2006-08-22 20:36:56 by jwe]
jwe
parents: 5943
diff changeset
2878 {
cdef72fcd206 [project @ 2006-08-22 20:36:56 by jwe]
jwe
parents: 5943
diff changeset
2879 if (strip_nan_and_inf == 1)
cdef72fcd206 [project @ 2006-08-22 20:36:56 by jwe]
jwe
parents: 5943
diff changeset
2880 goto next_row;
cdef72fcd206 [project @ 2006-08-22 20:36:56 by jwe]
jwe
parents: 5943
diff changeset
2881 else if (strip_nan_and_inf == 2)
cdef72fcd206 [project @ 2006-08-22 20:36:56 by jwe]
jwe
parents: 5943
diff changeset
2882 goto next_row_with_newline;
cdef72fcd206 [project @ 2006-08-22 20:36:56 by jwe]
jwe
parents: 5943
diff changeset
2883 }
cdef72fcd206 [project @ 2006-08-22 20:36:56 by jwe]
jwe
parents: 5943
diff changeset
2884 }
cdef72fcd206 [project @ 2006-08-22 20:36:56 by jwe]
jwe
parents: 5943
diff changeset
2885 }
cdef72fcd206 [project @ 2006-08-22 20:36:56 by jwe]
jwe
parents: 5943
diff changeset
2886
cdef72fcd206 [project @ 2006-08-22 20:36:56 by jwe]
jwe
parents: 5943
diff changeset
2887 for (octave_idx_type j = 0; j < nc; j++)
cdef72fcd206 [project @ 2006-08-22 20:36:56 by jwe]
jwe
parents: 5943
diff changeset
2888 {
cdef72fcd206 [project @ 2006-08-22 20:36:56 by jwe]
jwe
parents: 5943
diff changeset
2889 double d = elem (i, j);
cdef72fcd206 [project @ 2006-08-22 20:36:56 by jwe]
jwe
parents: 5943
diff changeset
2890
cdef72fcd206 [project @ 2006-08-22 20:36:56 by jwe]
jwe
parents: 5943
diff changeset
2891 if (strip_nan_and_inf)
cdef72fcd206 [project @ 2006-08-22 20:36:56 by jwe]
jwe
parents: 5943
diff changeset
2892 {
cdef72fcd206 [project @ 2006-08-22 20:36:56 by jwe]
jwe
parents: 5943
diff changeset
2893 if (xisinf (d))
cdef72fcd206 [project @ 2006-08-22 20:36:56 by jwe]
jwe
parents: 5943
diff changeset
2894 d = d > 0 ? OCT_RBV : -OCT_RBV;
cdef72fcd206 [project @ 2006-08-22 20:36:56 by jwe]
jwe
parents: 5943
diff changeset
2895 }
cdef72fcd206 [project @ 2006-08-22 20:36:56 by jwe]
jwe
parents: 5943
diff changeset
2896 else if (! infnan_warned && (xisnan (d) || xisinf (d)))
cdef72fcd206 [project @ 2006-08-22 20:36:56 by jwe]
jwe
parents: 5943
diff changeset
2897 {
cdef72fcd206 [project @ 2006-08-22 20:36:56 by jwe]
jwe
parents: 5943
diff changeset
2898 (*current_liboctave_warning_handler)
cdef72fcd206 [project @ 2006-08-22 20:36:56 by jwe]
jwe
parents: 5943
diff changeset
2899 ("save: Inf or NaN values may not be reloadable");
cdef72fcd206 [project @ 2006-08-22 20:36:56 by jwe]
jwe
parents: 5943
diff changeset
2900
cdef72fcd206 [project @ 2006-08-22 20:36:56 by jwe]
jwe
parents: 5943
diff changeset
2901 infnan_warned = true;
cdef72fcd206 [project @ 2006-08-22 20:36:56 by jwe]
jwe
parents: 5943
diff changeset
2902 }
cdef72fcd206 [project @ 2006-08-22 20:36:56 by jwe]
jwe
parents: 5943
diff changeset
2903
cdef72fcd206 [project @ 2006-08-22 20:36:56 by jwe]
jwe
parents: 5943
diff changeset
2904 octave_write_double (os, d);
cdef72fcd206 [project @ 2006-08-22 20:36:56 by jwe]
jwe
parents: 5943
diff changeset
2905
cdef72fcd206 [project @ 2006-08-22 20:36:56 by jwe]
jwe
parents: 5943
diff changeset
2906 os << " ";
cdef72fcd206 [project @ 2006-08-22 20:36:56 by jwe]
jwe
parents: 5943
diff changeset
2907 }
cdef72fcd206 [project @ 2006-08-22 20:36:56 by jwe]
jwe
parents: 5943
diff changeset
2908
cdef72fcd206 [project @ 2006-08-22 20:36:56 by jwe]
jwe
parents: 5943
diff changeset
2909 next_row_with_newline:
cdef72fcd206 [project @ 2006-08-22 20:36:56 by jwe]
jwe
parents: 5943
diff changeset
2910 os << "\n";
cdef72fcd206 [project @ 2006-08-22 20:36:56 by jwe]
jwe
parents: 5943
diff changeset
2911
cdef72fcd206 [project @ 2006-08-22 20:36:56 by jwe]
jwe
parents: 5943
diff changeset
2912 next_row:
cdef72fcd206 [project @ 2006-08-22 20:36:56 by jwe]
jwe
parents: 5943
diff changeset
2913 continue;
cdef72fcd206 [project @ 2006-08-22 20:36:56 by jwe]
jwe
parents: 5943
diff changeset
2914 }
cdef72fcd206 [project @ 2006-08-22 20:36:56 by jwe]
jwe
parents: 5943
diff changeset
2915 }
cdef72fcd206 [project @ 2006-08-22 20:36:56 by jwe]
jwe
parents: 5943
diff changeset
2916 else
cdef72fcd206 [project @ 2006-08-22 20:36:56 by jwe]
jwe
parents: 5943
diff changeset
2917 os << *this;
cdef72fcd206 [project @ 2006-08-22 20:36:56 by jwe]
jwe
parents: 5943
diff changeset
2918
cdef72fcd206 [project @ 2006-08-22 20:36:56 by jwe]
jwe
parents: 5943
diff changeset
2919 return os;
cdef72fcd206 [project @ 2006-08-22 20:36:56 by jwe]
jwe
parents: 5943
diff changeset
2920 }
cdef72fcd206 [project @ 2006-08-22 20:36:56 by jwe]
jwe
parents: 5943
diff changeset
2921
3504
5eef8a2294bd [project @ 2000-02-01 10:06:51 by jwe]
jwe
parents: 3503
diff changeset
2922 std::ostream&
5eef8a2294bd [project @ 2000-02-01 10:06:51 by jwe]
jwe
parents: 3503
diff changeset
2923 operator << (std::ostream& os, const Matrix& a)
458
38cb88095913 [project @ 1994-06-06 00:41:10 by jwe]
jwe
parents:
diff changeset
2924 {
5275
23b37da9fd5b [project @ 2005-04-08 16:07:35 by jwe]
jwe
parents: 5105
diff changeset
2925 for (octave_idx_type i = 0; i < a.rows (); i++)
458
38cb88095913 [project @ 1994-06-06 00:41:10 by jwe]
jwe
parents:
diff changeset
2926 {
5275
23b37da9fd5b [project @ 2005-04-08 16:07:35 by jwe]
jwe
parents: 5105
diff changeset
2927 for (octave_idx_type j = 0; j < a.cols (); j++)
4130
7d9bda865012 [project @ 2002-10-28 21:05:30 by jwe]
jwe
parents: 4083
diff changeset
2928 {
7d9bda865012 [project @ 2002-10-28 21:05:30 by jwe]
jwe
parents: 4083
diff changeset
2929 os << " ";
7d9bda865012 [project @ 2002-10-28 21:05:30 by jwe]
jwe
parents: 4083
diff changeset
2930 octave_write_double (os, a.elem (i, j));
7d9bda865012 [project @ 2002-10-28 21:05:30 by jwe]
jwe
parents: 4083
diff changeset
2931 }
458
38cb88095913 [project @ 1994-06-06 00:41:10 by jwe]
jwe
parents:
diff changeset
2932 os << "\n";
38cb88095913 [project @ 1994-06-06 00:41:10 by jwe]
jwe
parents:
diff changeset
2933 }
38cb88095913 [project @ 1994-06-06 00:41:10 by jwe]
jwe
parents:
diff changeset
2934 return os;
38cb88095913 [project @ 1994-06-06 00:41:10 by jwe]
jwe
parents:
diff changeset
2935 }
38cb88095913 [project @ 1994-06-06 00:41:10 by jwe]
jwe
parents:
diff changeset
2936
3504
5eef8a2294bd [project @ 2000-02-01 10:06:51 by jwe]
jwe
parents: 3503
diff changeset
2937 std::istream&
5eef8a2294bd [project @ 2000-02-01 10:06:51 by jwe]
jwe
parents: 3503
diff changeset
2938 operator >> (std::istream& is, Matrix& a)
458
38cb88095913 [project @ 1994-06-06 00:41:10 by jwe]
jwe
parents:
diff changeset
2939 {
5275
23b37da9fd5b [project @ 2005-04-08 16:07:35 by jwe]
jwe
parents: 5105
diff changeset
2940 octave_idx_type nr = a.rows ();
23b37da9fd5b [project @ 2005-04-08 16:07:35 by jwe]
jwe
parents: 5105
diff changeset
2941 octave_idx_type nc = a.cols ();
458
38cb88095913 [project @ 1994-06-06 00:41:10 by jwe]
jwe
parents:
diff changeset
2942
38cb88095913 [project @ 1994-06-06 00:41:10 by jwe]
jwe
parents:
diff changeset
2943 if (nr < 1 || nc < 1)
3504
5eef8a2294bd [project @ 2000-02-01 10:06:51 by jwe]
jwe
parents: 3503
diff changeset
2944 is.clear (std::ios::badbit);
458
38cb88095913 [project @ 1994-06-06 00:41:10 by jwe]
jwe
parents:
diff changeset
2945 else
38cb88095913 [project @ 1994-06-06 00:41:10 by jwe]
jwe
parents:
diff changeset
2946 {
38cb88095913 [project @ 1994-06-06 00:41:10 by jwe]
jwe
parents:
diff changeset
2947 double tmp;
5275
23b37da9fd5b [project @ 2005-04-08 16:07:35 by jwe]
jwe
parents: 5105
diff changeset
2948 for (octave_idx_type i = 0; i < nr; i++)
23b37da9fd5b [project @ 2005-04-08 16:07:35 by jwe]
jwe
parents: 5105
diff changeset
2949 for (octave_idx_type j = 0; j < nc; j++)
458
38cb88095913 [project @ 1994-06-06 00:41:10 by jwe]
jwe
parents:
diff changeset
2950 {
4130
7d9bda865012 [project @ 2002-10-28 21:05:30 by jwe]
jwe
parents: 4083
diff changeset
2951 tmp = octave_read_double (is);
458
38cb88095913 [project @ 1994-06-06 00:41:10 by jwe]
jwe
parents:
diff changeset
2952 if (is)
38cb88095913 [project @ 1994-06-06 00:41:10 by jwe]
jwe
parents:
diff changeset
2953 a.elem (i, j) = tmp;
38cb88095913 [project @ 1994-06-06 00:41:10 by jwe]
jwe
parents:
diff changeset
2954 else
2795
14d07e4a0265 [project @ 1997-03-07 02:18:49 by jwe]
jwe
parents: 2676
diff changeset
2955 goto done;
458
38cb88095913 [project @ 1994-06-06 00:41:10 by jwe]
jwe
parents:
diff changeset
2956 }
38cb88095913 [project @ 1994-06-06 00:41:10 by jwe]
jwe
parents:
diff changeset
2957 }
38cb88095913 [project @ 1994-06-06 00:41:10 by jwe]
jwe
parents:
diff changeset
2958
2795
14d07e4a0265 [project @ 1997-03-07 02:18:49 by jwe]
jwe
parents: 2676
diff changeset
2959 done:
14d07e4a0265 [project @ 1997-03-07 02:18:49 by jwe]
jwe
parents: 2676
diff changeset
2960
458
38cb88095913 [project @ 1994-06-06 00:41:10 by jwe]
jwe
parents:
diff changeset
2961 return is;
38cb88095913 [project @ 1994-06-06 00:41:10 by jwe]
jwe
parents:
diff changeset
2962 }
38cb88095913 [project @ 1994-06-06 00:41:10 by jwe]
jwe
parents:
diff changeset
2963
1819
8b8498bf8ec5 [project @ 1996-01-31 11:29:17 by jwe]
jwe
parents: 1698
diff changeset
2964 Matrix
8b8498bf8ec5 [project @ 1996-01-31 11:29:17 by jwe]
jwe
parents: 1698
diff changeset
2965 Givens (double x, double y)
8b8498bf8ec5 [project @ 1996-01-31 11:29:17 by jwe]
jwe
parents: 1698
diff changeset
2966 {
8b8498bf8ec5 [project @ 1996-01-31 11:29:17 by jwe]
jwe
parents: 1698
diff changeset
2967 double cc, s, temp_r;
8b8498bf8ec5 [project @ 1996-01-31 11:29:17 by jwe]
jwe
parents: 1698
diff changeset
2968
3887
7da18459c08b [project @ 2002-04-04 00:44:21 by jwe]
jwe
parents: 3864
diff changeset
2969 F77_FUNC (dlartg, DLARTG) (x, y, cc, s, temp_r);
1819
8b8498bf8ec5 [project @ 1996-01-31 11:29:17 by jwe]
jwe
parents: 1698
diff changeset
2970
8b8498bf8ec5 [project @ 1996-01-31 11:29:17 by jwe]
jwe
parents: 1698
diff changeset
2971 Matrix g (2, 2);
8b8498bf8ec5 [project @ 1996-01-31 11:29:17 by jwe]
jwe
parents: 1698
diff changeset
2972
8b8498bf8ec5 [project @ 1996-01-31 11:29:17 by jwe]
jwe
parents: 1698
diff changeset
2973 g.elem (0, 0) = cc;
8b8498bf8ec5 [project @ 1996-01-31 11:29:17 by jwe]
jwe
parents: 1698
diff changeset
2974 g.elem (1, 1) = cc;
8b8498bf8ec5 [project @ 1996-01-31 11:29:17 by jwe]
jwe
parents: 1698
diff changeset
2975 g.elem (0, 1) = s;
8b8498bf8ec5 [project @ 1996-01-31 11:29:17 by jwe]
jwe
parents: 1698
diff changeset
2976 g.elem (1, 0) = -s;
8b8498bf8ec5 [project @ 1996-01-31 11:29:17 by jwe]
jwe
parents: 1698
diff changeset
2977
8b8498bf8ec5 [project @ 1996-01-31 11:29:17 by jwe]
jwe
parents: 1698
diff changeset
2978 return g;
8b8498bf8ec5 [project @ 1996-01-31 11:29:17 by jwe]
jwe
parents: 1698
diff changeset
2979 }
8b8498bf8ec5 [project @ 1996-01-31 11:29:17 by jwe]
jwe
parents: 1698
diff changeset
2980
8b8498bf8ec5 [project @ 1996-01-31 11:29:17 by jwe]
jwe
parents: 1698
diff changeset
2981 Matrix
8b8498bf8ec5 [project @ 1996-01-31 11:29:17 by jwe]
jwe
parents: 1698
diff changeset
2982 Sylvester (const Matrix& a, const Matrix& b, const Matrix& c)
8b8498bf8ec5 [project @ 1996-01-31 11:29:17 by jwe]
jwe
parents: 1698
diff changeset
2983 {
8b8498bf8ec5 [project @ 1996-01-31 11:29:17 by jwe]
jwe
parents: 1698
diff changeset
2984 Matrix retval;
8b8498bf8ec5 [project @ 1996-01-31 11:29:17 by jwe]
jwe
parents: 1698
diff changeset
2985
5775
ace8d8d26933 [project @ 2006-04-24 19:13:06 by jwe]
jwe
parents: 5717
diff changeset
2986 // FIXME -- need to check that a, b, and c are all the same
1819
8b8498bf8ec5 [project @ 1996-01-31 11:29:17 by jwe]
jwe
parents: 1698
diff changeset
2987 // size.
8b8498bf8ec5 [project @ 1996-01-31 11:29:17 by jwe]
jwe
parents: 1698
diff changeset
2988
8b8498bf8ec5 [project @ 1996-01-31 11:29:17 by jwe]
jwe
parents: 1698
diff changeset
2989 // Compute Schur decompositions.
8b8498bf8ec5 [project @ 1996-01-31 11:29:17 by jwe]
jwe
parents: 1698
diff changeset
2990
8b8498bf8ec5 [project @ 1996-01-31 11:29:17 by jwe]
jwe
parents: 1698
diff changeset
2991 SCHUR as (a, "U");
8b8498bf8ec5 [project @ 1996-01-31 11:29:17 by jwe]
jwe
parents: 1698
diff changeset
2992 SCHUR bs (b, "U");
8b8498bf8ec5 [project @ 1996-01-31 11:29:17 by jwe]
jwe
parents: 1698
diff changeset
2993
8b8498bf8ec5 [project @ 1996-01-31 11:29:17 by jwe]
jwe
parents: 1698
diff changeset
2994 // Transform c to new coordinates.
8b8498bf8ec5 [project @ 1996-01-31 11:29:17 by jwe]
jwe
parents: 1698
diff changeset
2995
8b8498bf8ec5 [project @ 1996-01-31 11:29:17 by jwe]
jwe
parents: 1698
diff changeset
2996 Matrix ua = as.unitary_matrix ();
8b8498bf8ec5 [project @ 1996-01-31 11:29:17 by jwe]
jwe
parents: 1698
diff changeset
2997 Matrix sch_a = as.schur_matrix ();
8b8498bf8ec5 [project @ 1996-01-31 11:29:17 by jwe]
jwe
parents: 1698
diff changeset
2998
8b8498bf8ec5 [project @ 1996-01-31 11:29:17 by jwe]
jwe
parents: 1698
diff changeset
2999 Matrix ub = bs.unitary_matrix ();
8b8498bf8ec5 [project @ 1996-01-31 11:29:17 by jwe]
jwe
parents: 1698
diff changeset
3000 Matrix sch_b = bs.schur_matrix ();
8b8498bf8ec5 [project @ 1996-01-31 11:29:17 by jwe]
jwe
parents: 1698
diff changeset
3001
8b8498bf8ec5 [project @ 1996-01-31 11:29:17 by jwe]
jwe
parents: 1698
diff changeset
3002 Matrix cx = ua.transpose () * c * ub;
8b8498bf8ec5 [project @ 1996-01-31 11:29:17 by jwe]
jwe
parents: 1698
diff changeset
3003
8b8498bf8ec5 [project @ 1996-01-31 11:29:17 by jwe]
jwe
parents: 1698
diff changeset
3004 // Solve the sylvester equation, back-transform, and return the
8b8498bf8ec5 [project @ 1996-01-31 11:29:17 by jwe]
jwe
parents: 1698
diff changeset
3005 // solution.
8b8498bf8ec5 [project @ 1996-01-31 11:29:17 by jwe]
jwe
parents: 1698
diff changeset
3006
5275
23b37da9fd5b [project @ 2005-04-08 16:07:35 by jwe]
jwe
parents: 5105
diff changeset
3007 octave_idx_type a_nr = a.rows ();
23b37da9fd5b [project @ 2005-04-08 16:07:35 by jwe]
jwe
parents: 5105
diff changeset
3008 octave_idx_type b_nr = b.rows ();
1819
8b8498bf8ec5 [project @ 1996-01-31 11:29:17 by jwe]
jwe
parents: 1698
diff changeset
3009
8b8498bf8ec5 [project @ 1996-01-31 11:29:17 by jwe]
jwe
parents: 1698
diff changeset
3010 double scale;
5275
23b37da9fd5b [project @ 2005-04-08 16:07:35 by jwe]
jwe
parents: 5105
diff changeset
3011 octave_idx_type info;
1819
8b8498bf8ec5 [project @ 1996-01-31 11:29:17 by jwe]
jwe
parents: 1698
diff changeset
3012
1950
ab6abe89aaa1 [project @ 1996-02-14 04:36:21 by jwe]
jwe
parents: 1948
diff changeset
3013 double *pa = sch_a.fortran_vec ();
ab6abe89aaa1 [project @ 1996-02-14 04:36:21 by jwe]
jwe
parents: 1948
diff changeset
3014 double *pb = sch_b.fortran_vec ();
ab6abe89aaa1 [project @ 1996-02-14 04:36:21 by jwe]
jwe
parents: 1948
diff changeset
3015 double *px = cx.fortran_vec ();
ab6abe89aaa1 [project @ 1996-02-14 04:36:21 by jwe]
jwe
parents: 1948
diff changeset
3016
4552
6f3382e08a52 [project @ 2003-10-27 20:38:02 by jwe]
jwe
parents: 4513
diff changeset
3017 F77_XFCN (dtrsyl, DTRSYL, (F77_CONST_CHAR_ARG2 ("N", 1),
6f3382e08a52 [project @ 2003-10-27 20:38:02 by jwe]
jwe
parents: 4513
diff changeset
3018 F77_CONST_CHAR_ARG2 ("N", 1),
6f3382e08a52 [project @ 2003-10-27 20:38:02 by jwe]
jwe
parents: 4513
diff changeset
3019 1, a_nr, b_nr, pa, a_nr, pb,
6f3382e08a52 [project @ 2003-10-27 20:38:02 by jwe]
jwe
parents: 4513
diff changeset
3020 b_nr, px, a_nr, scale, info
6f3382e08a52 [project @ 2003-10-27 20:38:02 by jwe]
jwe
parents: 4513
diff changeset
3021 F77_CHAR_ARG_LEN (1)
6f3382e08a52 [project @ 2003-10-27 20:38:02 by jwe]
jwe
parents: 4513
diff changeset
3022 F77_CHAR_ARG_LEN (1)));
1950
ab6abe89aaa1 [project @ 1996-02-14 04:36:21 by jwe]
jwe
parents: 1948
diff changeset
3023
ab6abe89aaa1 [project @ 1996-02-14 04:36:21 by jwe]
jwe
parents: 1948
diff changeset
3024
ab6abe89aaa1 [project @ 1996-02-14 04:36:21 by jwe]
jwe
parents: 1948
diff changeset
3025 if (f77_exception_encountered)
ab6abe89aaa1 [project @ 1996-02-14 04:36:21 by jwe]
jwe
parents: 1948
diff changeset
3026 (*current_liboctave_error_handler) ("unrecoverable error in dtrsyl");
ab6abe89aaa1 [project @ 1996-02-14 04:36:21 by jwe]
jwe
parents: 1948
diff changeset
3027 else
ab6abe89aaa1 [project @ 1996-02-14 04:36:21 by jwe]
jwe
parents: 1948
diff changeset
3028 {
5775
ace8d8d26933 [project @ 2006-04-24 19:13:06 by jwe]
jwe
parents: 5717
diff changeset
3029 // FIXME -- check info?
1819
8b8498bf8ec5 [project @ 1996-01-31 11:29:17 by jwe]
jwe
parents: 1698
diff changeset
3030
1950
ab6abe89aaa1 [project @ 1996-02-14 04:36:21 by jwe]
jwe
parents: 1948
diff changeset
3031 retval = -ua*cx*ub.transpose ();
ab6abe89aaa1 [project @ 1996-02-14 04:36:21 by jwe]
jwe
parents: 1948
diff changeset
3032 }
1819
8b8498bf8ec5 [project @ 1996-01-31 11:29:17 by jwe]
jwe
parents: 1698
diff changeset
3033
8b8498bf8ec5 [project @ 1996-01-31 11:29:17 by jwe]
jwe
parents: 1698
diff changeset
3034 return retval;
8b8498bf8ec5 [project @ 1996-01-31 11:29:17 by jwe]
jwe
parents: 1698
diff changeset
3035 }
8b8498bf8ec5 [project @ 1996-01-31 11:29:17 by jwe]
jwe
parents: 1698
diff changeset
3036
2828
92826d6e8bd9 [project @ 1997-03-25 23:41:41 by jwe]
jwe
parents: 2800
diff changeset
3037 // matrix by matrix -> matrix operations
92826d6e8bd9 [project @ 1997-03-25 23:41:41 by jwe]
jwe
parents: 2800
diff changeset
3038
92826d6e8bd9 [project @ 1997-03-25 23:41:41 by jwe]
jwe
parents: 2800
diff changeset
3039 Matrix
92826d6e8bd9 [project @ 1997-03-25 23:41:41 by jwe]
jwe
parents: 2800
diff changeset
3040 operator * (const Matrix& m, const Matrix& a)
92826d6e8bd9 [project @ 1997-03-25 23:41:41 by jwe]
jwe
parents: 2800
diff changeset
3041 {
92826d6e8bd9 [project @ 1997-03-25 23:41:41 by jwe]
jwe
parents: 2800
diff changeset
3042 Matrix retval;
92826d6e8bd9 [project @ 1997-03-25 23:41:41 by jwe]
jwe
parents: 2800
diff changeset
3043
5275
23b37da9fd5b [project @ 2005-04-08 16:07:35 by jwe]
jwe
parents: 5105
diff changeset
3044 octave_idx_type nr = m.rows ();
23b37da9fd5b [project @ 2005-04-08 16:07:35 by jwe]
jwe
parents: 5105
diff changeset
3045 octave_idx_type nc = m.cols ();
23b37da9fd5b [project @ 2005-04-08 16:07:35 by jwe]
jwe
parents: 5105
diff changeset
3046
23b37da9fd5b [project @ 2005-04-08 16:07:35 by jwe]
jwe
parents: 5105
diff changeset
3047 octave_idx_type a_nr = a.rows ();
23b37da9fd5b [project @ 2005-04-08 16:07:35 by jwe]
jwe
parents: 5105
diff changeset
3048 octave_idx_type a_nc = a.cols ();
2828
92826d6e8bd9 [project @ 1997-03-25 23:41:41 by jwe]
jwe
parents: 2800
diff changeset
3049
92826d6e8bd9 [project @ 1997-03-25 23:41:41 by jwe]
jwe
parents: 2800
diff changeset
3050 if (nc != a_nr)
92826d6e8bd9 [project @ 1997-03-25 23:41:41 by jwe]
jwe
parents: 2800
diff changeset
3051 gripe_nonconformant ("operator *", nr, nc, a_nr, a_nc);
92826d6e8bd9 [project @ 1997-03-25 23:41:41 by jwe]
jwe
parents: 2800
diff changeset
3052 else
92826d6e8bd9 [project @ 1997-03-25 23:41:41 by jwe]
jwe
parents: 2800
diff changeset
3053 {
92826d6e8bd9 [project @ 1997-03-25 23:41:41 by jwe]
jwe
parents: 2800
diff changeset
3054 if (nr == 0 || nc == 0 || a_nc == 0)
92826d6e8bd9 [project @ 1997-03-25 23:41:41 by jwe]
jwe
parents: 2800
diff changeset
3055 retval.resize (nr, a_nc, 0.0);
92826d6e8bd9 [project @ 1997-03-25 23:41:41 by jwe]
jwe
parents: 2800
diff changeset
3056 else
92826d6e8bd9 [project @ 1997-03-25 23:41:41 by jwe]
jwe
parents: 2800
diff changeset
3057 {
5275
23b37da9fd5b [project @ 2005-04-08 16:07:35 by jwe]
jwe
parents: 5105
diff changeset
3058 octave_idx_type ld = nr;
23b37da9fd5b [project @ 2005-04-08 16:07:35 by jwe]
jwe
parents: 5105
diff changeset
3059 octave_idx_type lda = a_nr;
2828
92826d6e8bd9 [project @ 1997-03-25 23:41:41 by jwe]
jwe
parents: 2800
diff changeset
3060
92826d6e8bd9 [project @ 1997-03-25 23:41:41 by jwe]
jwe
parents: 2800
diff changeset
3061 retval.resize (nr, a_nc);
92826d6e8bd9 [project @ 1997-03-25 23:41:41 by jwe]
jwe
parents: 2800
diff changeset
3062 double *c = retval.fortran_vec ();
92826d6e8bd9 [project @ 1997-03-25 23:41:41 by jwe]
jwe
parents: 2800
diff changeset
3063
4552
6f3382e08a52 [project @ 2003-10-27 20:38:02 by jwe]
jwe
parents: 4513
diff changeset
3064 F77_XFCN (dgemm, DGEMM, (F77_CONST_CHAR_ARG2 ("N", 1),
6f3382e08a52 [project @ 2003-10-27 20:38:02 by jwe]
jwe
parents: 4513
diff changeset
3065 F77_CONST_CHAR_ARG2 ("N", 1),
6f3382e08a52 [project @ 2003-10-27 20:38:02 by jwe]
jwe
parents: 4513
diff changeset
3066 nr, a_nc, nc, 1.0, m.data (),
6f3382e08a52 [project @ 2003-10-27 20:38:02 by jwe]
jwe
parents: 4513
diff changeset
3067 ld, a.data (), lda, 0.0, c, nr
6f3382e08a52 [project @ 2003-10-27 20:38:02 by jwe]
jwe
parents: 4513
diff changeset
3068 F77_CHAR_ARG_LEN (1)
6f3382e08a52 [project @ 2003-10-27 20:38:02 by jwe]
jwe
parents: 4513
diff changeset
3069 F77_CHAR_ARG_LEN (1)));
2828
92826d6e8bd9 [project @ 1997-03-25 23:41:41 by jwe]
jwe
parents: 2800
diff changeset
3070
92826d6e8bd9 [project @ 1997-03-25 23:41:41 by jwe]
jwe
parents: 2800
diff changeset
3071 if (f77_exception_encountered)
92826d6e8bd9 [project @ 1997-03-25 23:41:41 by jwe]
jwe
parents: 2800
diff changeset
3072 (*current_liboctave_error_handler)
92826d6e8bd9 [project @ 1997-03-25 23:41:41 by jwe]
jwe
parents: 2800
diff changeset
3073 ("unrecoverable error in dgemm");
92826d6e8bd9 [project @ 1997-03-25 23:41:41 by jwe]
jwe
parents: 2800
diff changeset
3074 }
92826d6e8bd9 [project @ 1997-03-25 23:41:41 by jwe]
jwe
parents: 2800
diff changeset
3075 }
92826d6e8bd9 [project @ 1997-03-25 23:41:41 by jwe]
jwe
parents: 2800
diff changeset
3076
92826d6e8bd9 [project @ 1997-03-25 23:41:41 by jwe]
jwe
parents: 2800
diff changeset
3077 return retval;
92826d6e8bd9 [project @ 1997-03-25 23:41:41 by jwe]
jwe
parents: 2800
diff changeset
3078 }
92826d6e8bd9 [project @ 1997-03-25 23:41:41 by jwe]
jwe
parents: 2800
diff changeset
3079
5775
ace8d8d26933 [project @ 2006-04-24 19:13:06 by jwe]
jwe
parents: 5717
diff changeset
3080 // FIXME -- it would be nice to share code among the min/max
4309
a9560cebae6e [project @ 2003-01-28 23:24:58 by jwe]
jwe
parents: 4293
diff changeset
3081 // functions below.
a9560cebae6e [project @ 2003-01-28 23:24:58 by jwe]
jwe
parents: 4293
diff changeset
3082
a9560cebae6e [project @ 2003-01-28 23:24:58 by jwe]
jwe
parents: 4293
diff changeset
3083 #define EMPTY_RETURN_CHECK(T) \
a9560cebae6e [project @ 2003-01-28 23:24:58 by jwe]
jwe
parents: 4293
diff changeset
3084 if (nr == 0 || nc == 0) \
a9560cebae6e [project @ 2003-01-28 23:24:58 by jwe]
jwe
parents: 4293
diff changeset
3085 return T (nr, nc);
a9560cebae6e [project @ 2003-01-28 23:24:58 by jwe]
jwe
parents: 4293
diff changeset
3086
a9560cebae6e [project @ 2003-01-28 23:24:58 by jwe]
jwe
parents: 4293
diff changeset
3087 Matrix
a9560cebae6e [project @ 2003-01-28 23:24:58 by jwe]
jwe
parents: 4293
diff changeset
3088 min (double d, const Matrix& m)
a9560cebae6e [project @ 2003-01-28 23:24:58 by jwe]
jwe
parents: 4293
diff changeset
3089 {
5275
23b37da9fd5b [project @ 2005-04-08 16:07:35 by jwe]
jwe
parents: 5105
diff changeset
3090 octave_idx_type nr = m.rows ();
23b37da9fd5b [project @ 2005-04-08 16:07:35 by jwe]
jwe
parents: 5105
diff changeset
3091 octave_idx_type nc = m.columns ();
4309
a9560cebae6e [project @ 2003-01-28 23:24:58 by jwe]
jwe
parents: 4293
diff changeset
3092
a9560cebae6e [project @ 2003-01-28 23:24:58 by jwe]
jwe
parents: 4293
diff changeset
3093 EMPTY_RETURN_CHECK (Matrix);
a9560cebae6e [project @ 2003-01-28 23:24:58 by jwe]
jwe
parents: 4293
diff changeset
3094
a9560cebae6e [project @ 2003-01-28 23:24:58 by jwe]
jwe
parents: 4293
diff changeset
3095 Matrix result (nr, nc);
a9560cebae6e [project @ 2003-01-28 23:24:58 by jwe]
jwe
parents: 4293
diff changeset
3096
5275
23b37da9fd5b [project @ 2005-04-08 16:07:35 by jwe]
jwe
parents: 5105
diff changeset
3097 for (octave_idx_type j = 0; j < nc; j++)
23b37da9fd5b [project @ 2005-04-08 16:07:35 by jwe]
jwe
parents: 5105
diff changeset
3098 for (octave_idx_type i = 0; i < nr; i++)
4309
a9560cebae6e [project @ 2003-01-28 23:24:58 by jwe]
jwe
parents: 4293
diff changeset
3099 {
a9560cebae6e [project @ 2003-01-28 23:24:58 by jwe]
jwe
parents: 4293
diff changeset
3100 OCTAVE_QUIT;
a9560cebae6e [project @ 2003-01-28 23:24:58 by jwe]
jwe
parents: 4293
diff changeset
3101 result (i, j) = xmin (d, m (i, j));
a9560cebae6e [project @ 2003-01-28 23:24:58 by jwe]
jwe
parents: 4293
diff changeset
3102 }
a9560cebae6e [project @ 2003-01-28 23:24:58 by jwe]
jwe
parents: 4293
diff changeset
3103
a9560cebae6e [project @ 2003-01-28 23:24:58 by jwe]
jwe
parents: 4293
diff changeset
3104 return result;
a9560cebae6e [project @ 2003-01-28 23:24:58 by jwe]
jwe
parents: 4293
diff changeset
3105 }
a9560cebae6e [project @ 2003-01-28 23:24:58 by jwe]
jwe
parents: 4293
diff changeset
3106
a9560cebae6e [project @ 2003-01-28 23:24:58 by jwe]
jwe
parents: 4293
diff changeset
3107 Matrix
a9560cebae6e [project @ 2003-01-28 23:24:58 by jwe]
jwe
parents: 4293
diff changeset
3108 min (const Matrix& m, double d)
a9560cebae6e [project @ 2003-01-28 23:24:58 by jwe]
jwe
parents: 4293
diff changeset
3109 {
5275
23b37da9fd5b [project @ 2005-04-08 16:07:35 by jwe]
jwe
parents: 5105
diff changeset
3110 octave_idx_type nr = m.rows ();
23b37da9fd5b [project @ 2005-04-08 16:07:35 by jwe]
jwe
parents: 5105
diff changeset
3111 octave_idx_type nc = m.columns ();
4309
a9560cebae6e [project @ 2003-01-28 23:24:58 by jwe]
jwe
parents: 4293
diff changeset
3112
a9560cebae6e [project @ 2003-01-28 23:24:58 by jwe]
jwe
parents: 4293
diff changeset
3113 EMPTY_RETURN_CHECK (Matrix);
a9560cebae6e [project @ 2003-01-28 23:24:58 by jwe]
jwe
parents: 4293
diff changeset
3114
a9560cebae6e [project @ 2003-01-28 23:24:58 by jwe]
jwe
parents: 4293
diff changeset
3115 Matrix result (nr, nc);
a9560cebae6e [project @ 2003-01-28 23:24:58 by jwe]
jwe
parents: 4293
diff changeset
3116
5275
23b37da9fd5b [project @ 2005-04-08 16:07:35 by jwe]
jwe
parents: 5105
diff changeset
3117 for (octave_idx_type j = 0; j < nc; j++)
23b37da9fd5b [project @ 2005-04-08 16:07:35 by jwe]
jwe
parents: 5105
diff changeset
3118 for (octave_idx_type i = 0; i < nr; i++)
4309
a9560cebae6e [project @ 2003-01-28 23:24:58 by jwe]
jwe
parents: 4293
diff changeset
3119 {
a9560cebae6e [project @ 2003-01-28 23:24:58 by jwe]
jwe
parents: 4293
diff changeset
3120 OCTAVE_QUIT;
a9560cebae6e [project @ 2003-01-28 23:24:58 by jwe]
jwe
parents: 4293
diff changeset
3121 result (i, j) = xmin (m (i, j), d);
a9560cebae6e [project @ 2003-01-28 23:24:58 by jwe]
jwe
parents: 4293
diff changeset
3122 }
a9560cebae6e [project @ 2003-01-28 23:24:58 by jwe]
jwe
parents: 4293
diff changeset
3123
a9560cebae6e [project @ 2003-01-28 23:24:58 by jwe]
jwe
parents: 4293
diff changeset
3124 return result;
a9560cebae6e [project @ 2003-01-28 23:24:58 by jwe]
jwe
parents: 4293
diff changeset
3125 }
a9560cebae6e [project @ 2003-01-28 23:24:58 by jwe]
jwe
parents: 4293
diff changeset
3126
a9560cebae6e [project @ 2003-01-28 23:24:58 by jwe]
jwe
parents: 4293
diff changeset
3127 Matrix
a9560cebae6e [project @ 2003-01-28 23:24:58 by jwe]
jwe
parents: 4293
diff changeset
3128 min (const Matrix& a, const Matrix& b)
a9560cebae6e [project @ 2003-01-28 23:24:58 by jwe]
jwe
parents: 4293
diff changeset
3129 {
5275
23b37da9fd5b [project @ 2005-04-08 16:07:35 by jwe]
jwe
parents: 5105
diff changeset
3130 octave_idx_type nr = a.rows ();
23b37da9fd5b [project @ 2005-04-08 16:07:35 by jwe]
jwe
parents: 5105
diff changeset
3131 octave_idx_type nc = a.columns ();
4309
a9560cebae6e [project @ 2003-01-28 23:24:58 by jwe]
jwe
parents: 4293
diff changeset
3132
a9560cebae6e [project @ 2003-01-28 23:24:58 by jwe]
jwe
parents: 4293
diff changeset
3133 if (nr != b.rows () || nc != b.columns ())
a9560cebae6e [project @ 2003-01-28 23:24:58 by jwe]
jwe
parents: 4293
diff changeset
3134 {
a9560cebae6e [project @ 2003-01-28 23:24:58 by jwe]
jwe
parents: 4293
diff changeset
3135 (*current_liboctave_error_handler)
a9560cebae6e [project @ 2003-01-28 23:24:58 by jwe]
jwe
parents: 4293
diff changeset
3136 ("two-arg min expecting args of same size");
a9560cebae6e [project @ 2003-01-28 23:24:58 by jwe]
jwe
parents: 4293
diff changeset
3137 return Matrix ();
a9560cebae6e [project @ 2003-01-28 23:24:58 by jwe]
jwe
parents: 4293
diff changeset
3138 }
a9560cebae6e [project @ 2003-01-28 23:24:58 by jwe]
jwe
parents: 4293
diff changeset
3139
a9560cebae6e [project @ 2003-01-28 23:24:58 by jwe]
jwe
parents: 4293
diff changeset
3140 EMPTY_RETURN_CHECK (Matrix);
a9560cebae6e [project @ 2003-01-28 23:24:58 by jwe]
jwe
parents: 4293
diff changeset
3141
a9560cebae6e [project @ 2003-01-28 23:24:58 by jwe]
jwe
parents: 4293
diff changeset
3142 Matrix result (nr, nc);
a9560cebae6e [project @ 2003-01-28 23:24:58 by jwe]
jwe
parents: 4293
diff changeset
3143
5275
23b37da9fd5b [project @ 2005-04-08 16:07:35 by jwe]
jwe
parents: 5105
diff changeset
3144 for (octave_idx_type j = 0; j < nc; j++)
23b37da9fd5b [project @ 2005-04-08 16:07:35 by jwe]
jwe
parents: 5105
diff changeset
3145 for (octave_idx_type i = 0; i < nr; i++)
4309
a9560cebae6e [project @ 2003-01-28 23:24:58 by jwe]
jwe
parents: 4293
diff changeset
3146 {
a9560cebae6e [project @ 2003-01-28 23:24:58 by jwe]
jwe
parents: 4293
diff changeset
3147 OCTAVE_QUIT;
a9560cebae6e [project @ 2003-01-28 23:24:58 by jwe]
jwe
parents: 4293
diff changeset
3148 result (i, j) = xmin (a (i, j), b (i, j));
a9560cebae6e [project @ 2003-01-28 23:24:58 by jwe]
jwe
parents: 4293
diff changeset
3149 }
a9560cebae6e [project @ 2003-01-28 23:24:58 by jwe]
jwe
parents: 4293
diff changeset
3150
a9560cebae6e [project @ 2003-01-28 23:24:58 by jwe]
jwe
parents: 4293
diff changeset
3151 return result;
a9560cebae6e [project @ 2003-01-28 23:24:58 by jwe]
jwe
parents: 4293
diff changeset
3152 }
a9560cebae6e [project @ 2003-01-28 23:24:58 by jwe]
jwe
parents: 4293
diff changeset
3153
a9560cebae6e [project @ 2003-01-28 23:24:58 by jwe]
jwe
parents: 4293
diff changeset
3154 Matrix
a9560cebae6e [project @ 2003-01-28 23:24:58 by jwe]
jwe
parents: 4293
diff changeset
3155 max (double d, const Matrix& m)
a9560cebae6e [project @ 2003-01-28 23:24:58 by jwe]
jwe
parents: 4293
diff changeset
3156 {
5275
23b37da9fd5b [project @ 2005-04-08 16:07:35 by jwe]
jwe
parents: 5105
diff changeset
3157 octave_idx_type nr = m.rows ();
23b37da9fd5b [project @ 2005-04-08 16:07:35 by jwe]
jwe
parents: 5105
diff changeset
3158 octave_idx_type nc = m.columns ();
4309
a9560cebae6e [project @ 2003-01-28 23:24:58 by jwe]
jwe
parents: 4293
diff changeset
3159
a9560cebae6e [project @ 2003-01-28 23:24:58 by jwe]
jwe
parents: 4293
diff changeset
3160 EMPTY_RETURN_CHECK (Matrix);
a9560cebae6e [project @ 2003-01-28 23:24:58 by jwe]
jwe
parents: 4293
diff changeset
3161
a9560cebae6e [project @ 2003-01-28 23:24:58 by jwe]
jwe
parents: 4293
diff changeset
3162 Matrix result (nr, nc);
a9560cebae6e [project @ 2003-01-28 23:24:58 by jwe]
jwe
parents: 4293
diff changeset
3163
5275
23b37da9fd5b [project @ 2005-04-08 16:07:35 by jwe]
jwe
parents: 5105
diff changeset
3164 for (octave_idx_type j = 0; j < nc; j++)
23b37da9fd5b [project @ 2005-04-08 16:07:35 by jwe]
jwe
parents: 5105
diff changeset
3165 for (octave_idx_type i = 0; i < nr; i++)
4309
a9560cebae6e [project @ 2003-01-28 23:24:58 by jwe]
jwe
parents: 4293
diff changeset
3166 {
a9560cebae6e [project @ 2003-01-28 23:24:58 by jwe]
jwe
parents: 4293
diff changeset
3167 OCTAVE_QUIT;
a9560cebae6e [project @ 2003-01-28 23:24:58 by jwe]
jwe
parents: 4293
diff changeset
3168 result (i, j) = xmax (d, m (i, j));
a9560cebae6e [project @ 2003-01-28 23:24:58 by jwe]
jwe
parents: 4293
diff changeset
3169 }
a9560cebae6e [project @ 2003-01-28 23:24:58 by jwe]
jwe
parents: 4293
diff changeset
3170
a9560cebae6e [project @ 2003-01-28 23:24:58 by jwe]
jwe
parents: 4293
diff changeset
3171 return result;
a9560cebae6e [project @ 2003-01-28 23:24:58 by jwe]
jwe
parents: 4293
diff changeset
3172 }
a9560cebae6e [project @ 2003-01-28 23:24:58 by jwe]
jwe
parents: 4293
diff changeset
3173
a9560cebae6e [project @ 2003-01-28 23:24:58 by jwe]
jwe
parents: 4293
diff changeset
3174 Matrix
a9560cebae6e [project @ 2003-01-28 23:24:58 by jwe]
jwe
parents: 4293
diff changeset
3175 max (const Matrix& m, double d)
a9560cebae6e [project @ 2003-01-28 23:24:58 by jwe]
jwe
parents: 4293
diff changeset
3176 {
5275
23b37da9fd5b [project @ 2005-04-08 16:07:35 by jwe]
jwe
parents: 5105
diff changeset
3177 octave_idx_type nr = m.rows ();
23b37da9fd5b [project @ 2005-04-08 16:07:35 by jwe]
jwe
parents: 5105
diff changeset
3178 octave_idx_type nc = m.columns ();
4309
a9560cebae6e [project @ 2003-01-28 23:24:58 by jwe]
jwe
parents: 4293
diff changeset
3179
a9560cebae6e [project @ 2003-01-28 23:24:58 by jwe]
jwe
parents: 4293
diff changeset
3180 EMPTY_RETURN_CHECK (Matrix);
a9560cebae6e [project @ 2003-01-28 23:24:58 by jwe]
jwe
parents: 4293
diff changeset
3181
a9560cebae6e [project @ 2003-01-28 23:24:58 by jwe]
jwe
parents: 4293
diff changeset
3182 Matrix result (nr, nc);
a9560cebae6e [project @ 2003-01-28 23:24:58 by jwe]
jwe
parents: 4293
diff changeset
3183
5275
23b37da9fd5b [project @ 2005-04-08 16:07:35 by jwe]
jwe
parents: 5105
diff changeset
3184 for (octave_idx_type j = 0; j < nc; j++)
23b37da9fd5b [project @ 2005-04-08 16:07:35 by jwe]
jwe
parents: 5105
diff changeset
3185 for (octave_idx_type i = 0; i < nr; i++)
4309
a9560cebae6e [project @ 2003-01-28 23:24:58 by jwe]
jwe
parents: 4293
diff changeset
3186 {
a9560cebae6e [project @ 2003-01-28 23:24:58 by jwe]
jwe
parents: 4293
diff changeset
3187 OCTAVE_QUIT;
a9560cebae6e [project @ 2003-01-28 23:24:58 by jwe]
jwe
parents: 4293
diff changeset
3188 result (i, j) = xmax (m (i, j), d);
a9560cebae6e [project @ 2003-01-28 23:24:58 by jwe]
jwe
parents: 4293
diff changeset
3189 }
a9560cebae6e [project @ 2003-01-28 23:24:58 by jwe]
jwe
parents: 4293
diff changeset
3190
a9560cebae6e [project @ 2003-01-28 23:24:58 by jwe]
jwe
parents: 4293
diff changeset
3191 return result;
a9560cebae6e [project @ 2003-01-28 23:24:58 by jwe]
jwe
parents: 4293
diff changeset
3192 }
a9560cebae6e [project @ 2003-01-28 23:24:58 by jwe]
jwe
parents: 4293
diff changeset
3193
a9560cebae6e [project @ 2003-01-28 23:24:58 by jwe]
jwe
parents: 4293
diff changeset
3194 Matrix
a9560cebae6e [project @ 2003-01-28 23:24:58 by jwe]
jwe
parents: 4293
diff changeset
3195 max (const Matrix& a, const Matrix& b)
a9560cebae6e [project @ 2003-01-28 23:24:58 by jwe]
jwe
parents: 4293
diff changeset
3196 {
5275
23b37da9fd5b [project @ 2005-04-08 16:07:35 by jwe]
jwe
parents: 5105
diff changeset
3197 octave_idx_type nr = a.rows ();
23b37da9fd5b [project @ 2005-04-08 16:07:35 by jwe]
jwe
parents: 5105
diff changeset
3198 octave_idx_type nc = a.columns ();
4309
a9560cebae6e [project @ 2003-01-28 23:24:58 by jwe]
jwe
parents: 4293
diff changeset
3199
a9560cebae6e [project @ 2003-01-28 23:24:58 by jwe]
jwe
parents: 4293
diff changeset
3200 if (nr != b.rows () || nc != b.columns ())
a9560cebae6e [project @ 2003-01-28 23:24:58 by jwe]
jwe
parents: 4293
diff changeset
3201 {
a9560cebae6e [project @ 2003-01-28 23:24:58 by jwe]
jwe
parents: 4293
diff changeset
3202 (*current_liboctave_error_handler)
a9560cebae6e [project @ 2003-01-28 23:24:58 by jwe]
jwe
parents: 4293
diff changeset
3203 ("two-arg max expecting args of same size");
a9560cebae6e [project @ 2003-01-28 23:24:58 by jwe]
jwe
parents: 4293
diff changeset
3204 return Matrix ();
a9560cebae6e [project @ 2003-01-28 23:24:58 by jwe]
jwe
parents: 4293
diff changeset
3205 }
a9560cebae6e [project @ 2003-01-28 23:24:58 by jwe]
jwe
parents: 4293
diff changeset
3206
a9560cebae6e [project @ 2003-01-28 23:24:58 by jwe]
jwe
parents: 4293
diff changeset
3207 EMPTY_RETURN_CHECK (Matrix);
a9560cebae6e [project @ 2003-01-28 23:24:58 by jwe]
jwe
parents: 4293
diff changeset
3208
a9560cebae6e [project @ 2003-01-28 23:24:58 by jwe]
jwe
parents: 4293
diff changeset
3209 Matrix result (nr, nc);
a9560cebae6e [project @ 2003-01-28 23:24:58 by jwe]
jwe
parents: 4293
diff changeset
3210
5275
23b37da9fd5b [project @ 2005-04-08 16:07:35 by jwe]
jwe
parents: 5105
diff changeset
3211 for (octave_idx_type j = 0; j < nc; j++)
23b37da9fd5b [project @ 2005-04-08 16:07:35 by jwe]
jwe
parents: 5105
diff changeset
3212 for (octave_idx_type i = 0; i < nr; i++)
4309
a9560cebae6e [project @ 2003-01-28 23:24:58 by jwe]
jwe
parents: 4293
diff changeset
3213 {
a9560cebae6e [project @ 2003-01-28 23:24:58 by jwe]
jwe
parents: 4293
diff changeset
3214 OCTAVE_QUIT;
a9560cebae6e [project @ 2003-01-28 23:24:58 by jwe]
jwe
parents: 4293
diff changeset
3215 result (i, j) = xmax (a (i, j), b (i, j));
a9560cebae6e [project @ 2003-01-28 23:24:58 by jwe]
jwe
parents: 4293
diff changeset
3216 }
a9560cebae6e [project @ 2003-01-28 23:24:58 by jwe]
jwe
parents: 4293
diff changeset
3217
a9560cebae6e [project @ 2003-01-28 23:24:58 by jwe]
jwe
parents: 4293
diff changeset
3218 return result;
a9560cebae6e [project @ 2003-01-28 23:24:58 by jwe]
jwe
parents: 4293
diff changeset
3219 }
a9560cebae6e [project @ 2003-01-28 23:24:58 by jwe]
jwe
parents: 4293
diff changeset
3220
2870
3241d0057e78 [project @ 1997-04-19 01:21:29 by jwe]
jwe
parents: 2847
diff changeset
3221 MS_CMP_OPS(Matrix, , double, )
3504
5eef8a2294bd [project @ 2000-02-01 10:06:51 by jwe]
jwe
parents: 3503
diff changeset
3222 MS_BOOL_OPS(Matrix, double, 0.0)
2870
3241d0057e78 [project @ 1997-04-19 01:21:29 by jwe]
jwe
parents: 2847
diff changeset
3223
3241d0057e78 [project @ 1997-04-19 01:21:29 by jwe]
jwe
parents: 2847
diff changeset
3224 SM_CMP_OPS(double, , Matrix, )
3504
5eef8a2294bd [project @ 2000-02-01 10:06:51 by jwe]
jwe
parents: 3503
diff changeset
3225 SM_BOOL_OPS(double, Matrix, 0.0)
2870
3241d0057e78 [project @ 1997-04-19 01:21:29 by jwe]
jwe
parents: 2847
diff changeset
3226
3241d0057e78 [project @ 1997-04-19 01:21:29 by jwe]
jwe
parents: 2847
diff changeset
3227 MM_CMP_OPS(Matrix, , Matrix, )
3504
5eef8a2294bd [project @ 2000-02-01 10:06:51 by jwe]
jwe
parents: 3503
diff changeset
3228 MM_BOOL_OPS(Matrix, Matrix, 0.0)
2870
3241d0057e78 [project @ 1997-04-19 01:21:29 by jwe]
jwe
parents: 2847
diff changeset
3229
458
38cb88095913 [project @ 1994-06-06 00:41:10 by jwe]
jwe
parents:
diff changeset
3230 /*
38cb88095913 [project @ 1994-06-06 00:41:10 by jwe]
jwe
parents:
diff changeset
3231 ;;; Local Variables: ***
38cb88095913 [project @ 1994-06-06 00:41:10 by jwe]
jwe
parents:
diff changeset
3232 ;;; mode: C++ ***
38cb88095913 [project @ 1994-06-06 00:41:10 by jwe]
jwe
parents:
diff changeset
3233 ;;; End: ***
38cb88095913 [project @ 1994-06-06 00:41:10 by jwe]
jwe
parents:
diff changeset
3234 */