annotate liboctave/chMatrix.cc @ 1573:403c60daa8c7

[project @ 1995-10-19 04:34:20 by jwe] Initial revision
author jwe
date Thu, 19 Oct 1995 04:34:20 +0000
parents
children 42b4f904f1af
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
1573
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
1 // Matrix manipulations. -*- C++ -*-
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
2 /*
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
3
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
4 Copyright (C) 1992, 1993, 1994, 1995 John W. Eaton
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
5
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
6 This file is part of Octave.
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
7
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
8 Octave is free software; you can redistribute it and/or modify it
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
9 under the terms of the GNU General Public License as published by the
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
10 Free Software Foundation; either version 2, or (at your option) any
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
11 later version.
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
12
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
13 Octave is distributed in the hope that it will be useful, but WITHOUT
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
14 ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
15 FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
16 for more details.
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
17
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
18 You should have received a copy of the GNU General Public License
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
19 along with Octave; see the file COPYING. If not, write to the Free
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
20 Software Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
21
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
22 */
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
23
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
24 #if defined (__GNUG__)
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
25 #pragma implementation
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
26 #endif
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
27
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
28 #ifdef HAVE_CONFIG_H
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
29 #include <config.h>
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
30 #endif
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
31
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
32 #include <cstdio>
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
33 #include <cstring>
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
34
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
35 #include <iostream.h>
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
36
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
37 // #include <sys/types.h> // XXX FIXME XXX
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
38
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
39 #include "lo-error.h"
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
40 #include "mx-base.h"
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
41 #include "mx-inlines.cc"
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
42
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
43 // charMatrix class.
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
44
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
45 charMatrix::charMatrix (const char *s)
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
46 : MArray2<char> ((s ? 1 : 0), (s ? strlen (s) : 0))
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
47 {
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
48 int nc = cols ();
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
49 for (int i = 0; i < nc; i++)
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
50 elem (0, i) = s[i];
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
51 }
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
52
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
53 int
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
54 charMatrix::operator == (const charMatrix& a) const
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
55 {
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
56 if (rows () != a.rows () || cols () != a.cols ())
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
57 return 0;
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
58
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
59 return equal (data (), a.data (), length ());
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
60 }
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
61
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
62 int
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
63 charMatrix::operator != (const charMatrix& a) const
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
64 {
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
65 return !(*this == a);
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
66 }
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
67
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
68 charMatrix&
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
69 charMatrix::insert (const char *s, int r, int c)
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
70 {
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
71 if (s)
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
72 {
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
73 int s_len = strlen (s);
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
74
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
75 if (r < 0 || r >= rows () || c < 0 || c + s_len - 1 > cols ())
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
76 {
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
77 (*current_liboctave_error_handler) ("range error for insert");
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
78 return *this;
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
79 }
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
80
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
81 for (int i = 0; i < s_len; i++)
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
82 elem (r, c+i) = s[i];
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
83 }
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
84 return *this;
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
85 }
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
86
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
87 charMatrix&
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
88 charMatrix::insert (const charMatrix& a, int r, int c)
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
89 {
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
90 Array2<char>::insert (a, r, c);
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
91 return *this;
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
92 }
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
93
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
94 char *
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
95 charMatrix::row_as_string (int r) const
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
96 {
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
97 if (r < 0 || r >= rows ())
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
98 {
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
99 (*current_liboctave_error_handler) ("range error for row_as_string");
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
100 return 0;
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
101 }
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
102
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
103 int nc = cols ();
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
104
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
105 char *retval = new char [nc + 1];
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
106
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
107 retval[nc] = '\0';
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
108
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
109 for (int i = 0; i < nc; i++)
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
110 retval[i] = elem (r, i);
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
111
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
112 return retval;
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
113 }
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
114
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
115 #if 0
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
116 Matrix&
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
117 Matrix::insert (const RowVector& a, int r, int c)
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
118 {
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
119 int a_len = a.length ();
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
120 if (r < 0 || r >= rows () || c < 0 || c + a_len - 1 > cols ())
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
121 {
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
122 (*current_liboctave_error_handler) ("range error for insert");
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
123 return *this;
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
124 }
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
125
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
126 for (int i = 0; i < a_len; i++)
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
127 elem (r, c+i) = a.elem (i);
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
128
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
129 return *this;
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
130 }
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
131
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
132 Matrix&
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
133 Matrix::insert (const ColumnVector& a, int r, int c)
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
134 {
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
135 int a_len = a.length ();
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
136 if (r < 0 || r + a_len - 1 > rows () || c < 0 || c >= cols ())
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
137 {
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
138 (*current_liboctave_error_handler) ("range error for insert");
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
139 return *this;
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
140 }
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
141
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
142 for (int i = 0; i < a_len; i++)
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
143 elem (r+i, c) = a.elem (i);
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
144
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
145 return *this;
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
146 }
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
147
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
148 Matrix&
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
149 Matrix::insert (const DiagMatrix& a, int r, int c)
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
150 {
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
151 if (r < 0 || r + a.rows () - 1 > rows ()
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
152 || c < 0 || c + a.cols () - 1 > cols ())
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
153 {
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
154 (*current_liboctave_error_handler) ("range error for insert");
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
155 return *this;
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
156 }
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
157
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
158 for (int i = 0; i < a.length (); i++)
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
159 elem (r+i, c+i) = a.elem (i, i);
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
160
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
161 return *this;
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
162 }
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
163
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
164 Matrix&
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
165 Matrix::fill (double val)
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
166 {
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
167 int nr = rows ();
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
168 int nc = cols ();
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
169 if (nr > 0 && nc > 0)
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
170 for (int j = 0; j < nc; j++)
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
171 for (int i = 0; i < nr; i++)
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
172 elem (i, j) = val;
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
173
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
174 return *this;
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
175 }
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
176
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
177 Matrix&
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
178 Matrix::fill (double val, int r1, int c1, int r2, int c2)
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
179 {
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
180 int nr = rows ();
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
181 int nc = cols ();
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
182 if (r1 < 0 || r2 < 0 || c1 < 0 || c2 < 0
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
183 || r1 >= nr || r2 >= nr || c1 >= nc || c2 >= nc)
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
184 {
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
185 (*current_liboctave_error_handler) ("range error for fill");
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
186 return *this;
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
187 }
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
188
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
189 if (r1 > r2) { int tmp = r1; r1 = r2; r2 = tmp; }
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
190 if (c1 > c2) { int tmp = c1; c1 = c2; c2 = tmp; }
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
191
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
192 for (int j = c1; j <= c2; j++)
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
193 for (int i = r1; i <= r2; i++)
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
194 elem (i, j) = val;
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
195
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
196 return *this;
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
197 }
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
198
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
199 Matrix
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
200 Matrix::append (const Matrix& a) const
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
201 {
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
202 int nr = rows ();
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
203 int nc = cols ();
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
204 if (nr != a.rows ())
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
205 {
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
206 (*current_liboctave_error_handler) ("row dimension mismatch for append");
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
207 return Matrix ();
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
208 }
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
209
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
210 int nc_insert = nc;
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
211 Matrix retval (nr, nc + a.cols ());
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
212 retval.insert (*this, 0, 0);
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
213 retval.insert (a, 0, nc_insert);
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
214 return retval;
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
215 }
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
216
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
217 Matrix
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
218 Matrix::append (const RowVector& a) const
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
219 {
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
220 int nr = rows ();
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
221 int nc = cols ();
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
222 if (nr != 1)
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
223 {
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
224 (*current_liboctave_error_handler) ("row dimension mismatch for append");
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
225 return Matrix ();
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
226 }
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
227
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
228 int nc_insert = nc;
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
229 Matrix retval (nr, nc + a.length ());
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
230 retval.insert (*this, 0, 0);
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
231 retval.insert (a, 0, nc_insert);
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
232 return retval;
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
233 }
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
234
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
235 Matrix
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
236 Matrix::append (const ColumnVector& a) const
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
237 {
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
238 int nr = rows ();
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
239 int nc = cols ();
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
240 if (nr != a.length ())
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
241 {
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
242 (*current_liboctave_error_handler) ("row dimension mismatch for append");
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
243 return Matrix ();
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
244 }
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
245
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
246 int nc_insert = nc;
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
247 Matrix retval (nr, nc + 1);
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
248 retval.insert (*this, 0, 0);
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
249 retval.insert (a, 0, nc_insert);
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
250 return retval;
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
251 }
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
252
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
253 Matrix
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
254 Matrix::append (const DiagMatrix& a) const
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
255 {
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
256 int nr = rows ();
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
257 int nc = cols ();
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
258 if (nr != a.rows ())
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
259 {
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
260 (*current_liboctave_error_handler) ("row dimension mismatch for append");
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
261 return *this;
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
262 }
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
263
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
264 int nc_insert = nc;
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
265 Matrix retval (nr, nc + a.cols ());
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
266 retval.insert (*this, 0, 0);
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
267 retval.insert (a, 0, nc_insert);
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
268 return retval;
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
269 }
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
270
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
271 Matrix
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
272 Matrix::stack (const Matrix& a) const
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
273 {
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
274 int nr = rows ();
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
275 int nc = cols ();
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
276 if (nc != a.cols ())
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
277 {
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
278 (*current_liboctave_error_handler)
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
279 ("column dimension mismatch for stack");
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
280 return Matrix ();
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
281 }
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
282
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
283 int nr_insert = nr;
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
284 Matrix retval (nr + a.rows (), nc);
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
285 retval.insert (*this, 0, 0);
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
286 retval.insert (a, nr_insert, 0);
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
287 return retval;
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
288 }
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
289
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
290 Matrix
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
291 Matrix::stack (const RowVector& a) const
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
292 {
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
293 int nr = rows ();
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
294 int nc = cols ();
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
295 if (nc != a.length ())
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
296 {
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
297 (*current_liboctave_error_handler)
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
298 ("column dimension mismatch for stack");
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
299 return Matrix ();
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
300 }
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
301
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
302 int nr_insert = nr;
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
303 Matrix retval (nr + 1, nc);
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
304 retval.insert (*this, 0, 0);
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
305 retval.insert (a, nr_insert, 0);
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
306 return retval;
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
307 }
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
308
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
309 Matrix
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
310 Matrix::stack (const ColumnVector& a) const
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
311 {
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
312 int nr = rows ();
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
313 int nc = cols ();
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
314 if (nc != 1)
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
315 {
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
316 (*current_liboctave_error_handler)
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
317 ("column dimension mismatch for stack");
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
318 return Matrix ();
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
319 }
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
320
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
321 int nr_insert = nr;
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
322 Matrix retval (nr + a.length (), nc);
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
323 retval.insert (*this, 0, 0);
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
324 retval.insert (a, nr_insert, 0);
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
325 return retval;
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
326 }
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
327
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
328 Matrix
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
329 Matrix::stack (const DiagMatrix& a) const
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
330 {
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
331 int nr = rows ();
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
332 int nc = cols ();
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
333 if (nc != a.cols ())
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
334 {
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
335 (*current_liboctave_error_handler)
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
336 ("column dimension mismatch for stack");
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
337 return Matrix ();
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
338 }
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
339
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
340 int nr_insert = nr;
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
341 Matrix retval (nr + a.rows (), nc);
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
342 retval.insert (*this, 0, 0);
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
343 retval.insert (a, nr_insert, 0);
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
344 return retval;
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
345 }
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
346
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
347 Matrix
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
348 Matrix::transpose (void) const
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
349 {
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
350 int nr = rows ();
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
351 int nc = cols ();
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
352 Matrix result (nc, nr);
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
353 if (length () > 0)
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
354 {
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
355 for (int j = 0; j < nc; j++)
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
356 for (int i = 0; i < nr; i++)
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
357 result.elem (j, i) = elem (i, j);
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
358 }
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
359 return result;
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
360 }
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
361
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
362 Matrix
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
363 real (const ComplexMatrix& a)
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
364 {
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
365 int a_len = a.length ();
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
366 Matrix retval;
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
367 if (a_len > 0)
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
368 retval = Matrix (real_dup (a.data (), a_len), a.rows (), a.cols ());
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
369 return retval;
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
370 }
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
371
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
372 Matrix
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
373 imag (const ComplexMatrix& a)
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
374 {
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
375 int a_len = a.length ();
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
376 Matrix retval;
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
377 if (a_len > 0)
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
378 retval = Matrix (imag_dup (a.data (), a_len), a.rows (), a.cols ());
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
379 return retval;
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
380 }
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
381
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
382 Matrix
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
383 Matrix::extract (int r1, int c1, int r2, int c2) const
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
384 {
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
385 if (r1 > r2) { int tmp = r1; r1 = r2; r2 = tmp; }
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
386 if (c1 > c2) { int tmp = c1; c1 = c2; c2 = tmp; }
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
387
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
388 int new_r = r2 - r1 + 1;
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
389 int new_c = c2 - c1 + 1;
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
390
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
391 Matrix result (new_r, new_c);
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
392
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
393 for (int j = 0; j < new_c; j++)
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
394 for (int i = 0; i < new_r; i++)
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
395 result.elem (i, j) = elem (r1+i, c1+j);
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
396
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
397 return result;
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
398 }
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
399
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
400 // extract row or column i.
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
401
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
402 RowVector
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
403 Matrix::row (int i) const
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
404 {
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
405 int nc = cols ();
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
406 if (i < 0 || i >= rows ())
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
407 {
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
408 (*current_liboctave_error_handler) ("invalid row selection");
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
409 return RowVector ();
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
410 }
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
411
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
412 RowVector retval (nc);
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
413 for (int j = 0; j < nc; j++)
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
414 retval.elem (j) = elem (i, j);
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
415
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
416 return retval;
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
417 }
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
418
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
419 RowVector
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
420 Matrix::row (char *s) const
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
421 {
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
422 if (! s)
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
423 {
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
424 (*current_liboctave_error_handler) ("invalid row selection");
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
425 return RowVector ();
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
426 }
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
427
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
428 char c = *s;
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
429 if (c == 'f' || c == 'F')
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
430 return row (0);
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
431 else if (c == 'l' || c == 'L')
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
432 return row (rows () - 1);
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
433 else
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
434 {
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
435 (*current_liboctave_error_handler) ("invalid row selection");
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
436 return RowVector ();
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
437 }
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
438 }
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
439
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
440 ColumnVector
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
441 Matrix::column (int i) const
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
442 {
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
443 int nr = rows ();
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
444 if (i < 0 || i >= cols ())
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
445 {
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
446 (*current_liboctave_error_handler) ("invalid column selection");
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
447 return ColumnVector ();
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
448 }
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
449
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
450 ColumnVector retval (nr);
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
451 for (int j = 0; j < nr; j++)
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
452 retval.elem (j) = elem (j, i);
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
453
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
454 return retval;
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
455 }
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
456
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
457 ColumnVector
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
458 Matrix::column (char *s) const
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
459 {
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
460 if (! s)
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
461 {
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
462 (*current_liboctave_error_handler) ("invalid column selection");
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
463 return ColumnVector ();
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
464 }
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
465
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
466 char c = *s;
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
467 if (c == 'f' || c == 'F')
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
468 return column (0);
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
469 else if (c == 'l' || c == 'L')
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
470 return column (cols () - 1);
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
471 else
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
472 {
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
473 (*current_liboctave_error_handler) ("invalid column selection");
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
474 return ColumnVector ();
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
475 }
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
476 }
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
477
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
478 Matrix
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
479 Matrix::inverse (void) const
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
480 {
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
481 int info;
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
482 double rcond;
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
483 return inverse (info, rcond);
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
484 }
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
485
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
486 Matrix
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
487 Matrix::inverse (int& info) const
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
488 {
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
489 double rcond;
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
490 return inverse (info, rcond);
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
491 }
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
492
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
493 Matrix
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
494 Matrix::inverse (int& info, double& rcond) const
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
495 {
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
496 int nr = rows ();
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
497 int nc = cols ();
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
498 int len = length ();
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
499 if (nr != nc || nr == 0 || nc == 0)
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
500 {
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
501 (*current_liboctave_error_handler) ("inverse requires square matrix");
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
502 return Matrix ();
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
503 }
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
504
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
505 info = 0;
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
506
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
507 int *ipvt = new int [nr];
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
508 double *z = new double [nr];
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
509 double *tmp_data = dup (data (), len);
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
510
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
511 F77_FCN (dgeco, DGECO) (tmp_data, nr, nc, ipvt, rcond, z);
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
512
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
513 volatile double rcond_plus_one = rcond + 1.0;
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
514 if (rcond_plus_one == 1.0)
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
515 {
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
516 info = -1;
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
517 copy (tmp_data, data (), len); // Restore matrix contents.
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
518 }
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
519 else
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
520 {
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
521 double *dummy = 0;
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
522
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
523 F77_FCN (dgedi, DGEDI) (tmp_data, nr, nc, ipvt, dummy, z, 1);
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
524 }
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
525
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
526 delete [] ipvt;
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
527 delete [] z;
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
528
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
529 return Matrix (tmp_data, nr, nc);
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
530 }
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
531
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
532 Matrix
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
533 Matrix::pseudo_inverse (double tol)
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
534 {
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
535 SVD result (*this);
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
536
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
537 DiagMatrix S = result.singular_values ();
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
538 Matrix U = result.left_singular_matrix ();
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
539 Matrix V = result.right_singular_matrix ();
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
540
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
541 ColumnVector sigma = S.diag ();
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
542
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
543 int r = sigma.length () - 1;
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
544 int nr = rows ();
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
545 int nc = cols ();
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
546
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
547 if (tol <= 0.0)
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
548 {
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
549 if (nr > nc)
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
550 tol = nr * sigma.elem (0) * DBL_EPSILON;
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
551 else
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
552 tol = nc * sigma.elem (0) * DBL_EPSILON;
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
553 }
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
554
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
555 while (r >= 0 && sigma.elem (r) < tol)
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
556 r--;
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
557
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
558 if (r < 0)
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
559 return Matrix (nc, nr, 0.0);
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
560 else
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
561 {
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
562 Matrix Ur = U.extract (0, 0, nr-1, r);
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
563 DiagMatrix D = DiagMatrix (sigma.extract (0, r)) . inverse ();
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
564 Matrix Vr = V.extract (0, 0, nc-1, r);
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
565 return Vr * D * Ur.transpose ();
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
566 }
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
567 }
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
568
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
569 ComplexMatrix
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
570 Matrix::fourier (void) const
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
571 {
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
572 int nr = rows ();
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
573 int nc = cols ();
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
574 int npts, nsamples;
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
575 if (nr == 1 || nc == 1)
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
576 {
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
577 npts = nr > nc ? nr : nc;
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
578 nsamples = 1;
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
579 }
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
580 else
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
581 {
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
582 npts = nr;
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
583 nsamples = nc;
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
584 }
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
585
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
586 int nn = 4*npts+15;
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
587 Complex *wsave = new Complex [nn];
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
588 Complex *tmp_data = make_complex (data (), length ());
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
589
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
590 F77_FCN (cffti, CFFTI) (npts, wsave);
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
591
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
592 for (int j = 0; j < nsamples; j++)
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
593 F77_FCN (cfftf, CFFTF) (npts, &tmp_data[npts*j], wsave);
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
594
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
595 delete [] wsave;
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
596
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
597 return ComplexMatrix (tmp_data, nr, nc);
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
598 }
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
599
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
600 ComplexMatrix
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
601 Matrix::ifourier (void) const
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
602 {
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
603 int nr = rows ();
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
604 int nc = cols ();
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
605 int npts, nsamples;
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
606 if (nr == 1 || nc == 1)
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
607 {
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
608 npts = nr > nc ? nr : nc;
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
609 nsamples = 1;
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
610 }
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
611 else
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
612 {
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
613 npts = nr;
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
614 nsamples = nc;
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
615 }
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
616
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
617 int nn = 4*npts+15;
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
618 Complex *wsave = new Complex [nn];
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
619 Complex *tmp_data = make_complex (data (), length ());
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
620
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
621 F77_FCN (cffti, CFFTI) (npts, wsave);
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
622
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
623 for (int j = 0; j < nsamples; j++)
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
624 F77_FCN (cfftb, CFFTB) (npts, &tmp_data[npts*j], wsave);
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
625
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
626 for (int j = 0; j < npts*nsamples; j++)
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
627 tmp_data[j] = tmp_data[j] / (double) npts;
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
628
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
629 delete [] wsave;
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
630
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
631 return ComplexMatrix (tmp_data, nr, nc);
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
632 }
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
633
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
634 ComplexMatrix
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
635 Matrix::fourier2d (void) const
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
636 {
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
637 int nr = rows ();
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
638 int nc = cols ();
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
639 int npts, nsamples;
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
640 if (nr == 1 || nc == 1)
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
641 {
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
642 npts = nr > nc ? nr : nc;
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
643 nsamples = 1;
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
644 }
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
645 else
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
646 {
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
647 npts = nr;
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
648 nsamples = nc;
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
649 }
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
650
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
651 int nn = 4*npts+15;
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
652 Complex *wsave = new Complex [nn];
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
653 Complex *tmp_data = make_complex (data (), length ());
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
654
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
655 F77_FCN (cffti, CFFTI) (npts, wsave);
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
656
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
657 for (int j = 0; j < nsamples; j++)
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
658 F77_FCN (cfftf, CFFTF) (npts, &tmp_data[npts*j], wsave);
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
659
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
660 delete [] wsave;
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
661
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
662 npts = nc;
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
663 nsamples = nr;
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
664 nn = 4*npts+15;
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
665 wsave = new Complex [nn];
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
666 Complex *row = new Complex[npts];
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
667
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
668 F77_FCN (cffti, CFFTI) (npts, wsave);
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
669
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
670 for (int j = 0; j < nsamples; j++)
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
671 {
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
672 for (int i = 0; i < npts; i++)
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
673 row[i] = tmp_data[i*nr + j];
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
674
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
675 F77_FCN (cfftf, CFFTF) (npts, row, wsave);
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
676
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
677 for (int i = 0; i < npts; i++)
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
678 tmp_data[i*nr + j] = row[i];
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
679 }
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
680
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
681 delete [] wsave;
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
682 delete [] row;
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
683
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
684 return ComplexMatrix (tmp_data, nr, nc);
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
685 }
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
686
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
687 ComplexMatrix
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
688 Matrix::ifourier2d (void) const
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
689 {
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
690 int nr = rows ();
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
691 int nc = cols ();
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
692 int npts, nsamples;
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
693 if (nr == 1 || nc == 1)
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
694 {
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
695 npts = nr > nc ? nr : nc;
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
696 nsamples = 1;
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
697 }
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
698 else
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
699 {
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
700 npts = nr;
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
701 nsamples = nc;
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
702 }
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
703
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
704 int nn = 4*npts+15;
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
705 Complex *wsave = new Complex [nn];
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
706 Complex *tmp_data = make_complex (data (), length ());
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
707
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
708 F77_FCN (cffti, CFFTI) (npts, wsave);
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
709
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
710 for (int j = 0; j < nsamples; j++)
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
711 F77_FCN (cfftb, CFFTB) (npts, &tmp_data[npts*j], wsave);
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
712
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
713 delete [] wsave;
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
714
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
715 for (int j = 0; j < npts*nsamples; j++)
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
716 tmp_data[j] = tmp_data[j] / (double) npts;
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
717
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
718 npts = nc;
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
719 nsamples = nr;
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
720 nn = 4*npts+15;
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
721 wsave = new Complex [nn];
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
722 Complex *row = new Complex[npts];
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
723
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
724 F77_FCN (cffti, CFFTI) (npts, wsave);
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
725
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
726 for (int j = 0; j < nsamples; j++)
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
727 {
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
728 for (int i = 0; i < npts; i++)
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
729 row[i] = tmp_data[i*nr + j];
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
730
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
731 F77_FCN (cfftb, CFFTB) (npts, row, wsave);
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
732
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
733 for (int i = 0; i < npts; i++)
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
734 tmp_data[i*nr + j] = row[i] / (double) npts;
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
735 }
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
736
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
737 delete [] wsave;
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
738 delete [] row;
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
739
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
740 return ComplexMatrix (tmp_data, nr, nc);
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
741 }
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
742
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
743 DET
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
744 Matrix::determinant (void) const
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
745 {
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
746 int info;
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
747 double rcond;
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
748 return determinant (info, rcond);
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
749 }
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
750
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
751 DET
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
752 Matrix::determinant (int& info) const
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
753 {
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
754 double rcond;
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
755 return determinant (info, rcond);
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
756 }
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
757
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
758 DET
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
759 Matrix::determinant (int& info, double& rcond) const
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
760 {
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
761 DET retval;
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
762
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
763 int nr = rows ();
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
764 int nc = cols ();
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
765
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
766 if (nr == 0 || nc == 0)
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
767 {
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
768 double d[2];
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
769 d[0] = 1.0;
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
770 d[1] = 0.0;
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
771 retval = DET (d);
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
772 }
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
773 else
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
774 {
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
775 info = 0;
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
776 int *ipvt = new int [nr];
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
777
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
778 double *z = new double [nr];
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
779 double *tmp_data = dup (data (), length ());
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
780
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
781 F77_FCN (dgeco, DGECO) (tmp_data, nr, nr, ipvt, rcond, z);
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
782
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
783 volatile double rcond_plus_one = rcond + 1.0;
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
784 if (rcond_plus_one == 1.0)
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
785 {
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
786 info = -1;
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
787 retval = DET ();
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
788 }
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
789 else
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
790 {
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
791 double d[2];
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
792 F77_FCN (dgedi, DGEDI) (tmp_data, nr, nr, ipvt, d, z, 10);
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
793 retval = DET (d);
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
794 }
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
795
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
796 delete [] tmp_data;
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
797 delete [] ipvt;
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
798 delete [] z;
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
799 }
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
800
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
801 return retval;
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
802 }
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
803
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
804 Matrix
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
805 Matrix::solve (const Matrix& b) const
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
806 {
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
807 int info;
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
808 double rcond;
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
809 return solve (b, info, rcond);
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
810 }
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
811
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
812 Matrix
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
813 Matrix::solve (const Matrix& b, int& info) const
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
814 {
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
815 double rcond;
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
816 return solve (b, info, rcond);
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
817 }
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
818
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
819 Matrix
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
820 Matrix::solve (const Matrix& b, int& info, double& rcond) const
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
821 {
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
822 Matrix retval;
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
823
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
824 int nr = rows ();
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
825 int nc = cols ();
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
826 if (nr == 0 || nc == 0 || nr != nc || nr != b.rows ())
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
827 {
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
828 (*current_liboctave_error_handler)
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
829 ("matrix dimension mismatch solution of linear equations");
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
830 return Matrix ();
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
831 }
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
832
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
833 info = 0;
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
834 int *ipvt = new int [nr];
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
835
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
836 double *z = new double [nr];
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
837 double *tmp_data = dup (data (), length ());
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
838
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
839 F77_FCN (dgeco, DGECO) (tmp_data, nr, nr, ipvt, rcond, z);
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
840
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
841 volatile double rcond_plus_one = rcond + 1.0;
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
842 if (rcond_plus_one == 1.0)
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
843 {
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
844 info = -2;
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
845 }
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
846 else
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
847 {
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
848 double *result = dup (b.data (), b.length ());
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
849
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
850 int b_nc = b.cols ();
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
851 for (int j = 0; j < b_nc; j++)
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
852 F77_FCN (dgesl, DGESL) (tmp_data, nr, nr, ipvt, &result[nr*j], 0);
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
853
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
854 retval = Matrix (result, b.rows (), b_nc);
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
855 }
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
856
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
857 delete [] tmp_data;
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
858 delete [] ipvt;
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
859 delete [] z;
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
860
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
861 return retval;
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
862 }
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
863
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
864 ComplexMatrix
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
865 Matrix::solve (const ComplexMatrix& b) const
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
866 {
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
867 ComplexMatrix tmp (*this);
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
868 return tmp.solve (b);
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
869 }
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
870
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
871 ComplexMatrix
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
872 Matrix::solve (const ComplexMatrix& b, int& info) const
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
873 {
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
874 ComplexMatrix tmp (*this);
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
875 return tmp.solve (b, info);
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
876 }
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
877
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
878 ComplexMatrix
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
879 Matrix::solve (const ComplexMatrix& b, int& info, double& rcond) const
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
880 {
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
881 ComplexMatrix tmp (*this);
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
882 return tmp.solve (b, info, rcond);
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
883 }
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
884
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
885 ColumnVector
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
886 Matrix::solve (const ColumnVector& b) const
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
887 {
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
888 int info; double rcond;
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
889 return solve (b, info, rcond);
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
890 }
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
891
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
892 ColumnVector
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
893 Matrix::solve (const ColumnVector& b, int& info) const
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
894 {
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
895 double rcond;
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
896 return solve (b, info, rcond);
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
897 }
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
898
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
899 ColumnVector
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
900 Matrix::solve (const ColumnVector& b, int& info, double& rcond) const
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
901 {
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
902 ColumnVector retval;
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
903
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
904 int nr = rows ();
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
905 int nc = cols ();
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
906 if (nr == 0 || nc == 0 || nr != nc || nr != b.length ())
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
907 {
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
908 (*current_liboctave_error_handler)
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
909 ("matrix dimension mismatch solution of linear equations");
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
910 return ColumnVector ();
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
911 }
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
912
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
913 info = 0;
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
914 int *ipvt = new int [nr];
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
915
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
916 double *z = new double [nr];
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
917 double *tmp_data = dup (data (), length ());
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
918
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
919 F77_FCN (dgeco, DGECO) (tmp_data, nr, nr, ipvt, rcond, z);
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
920
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
921 volatile double rcond_plus_one = rcond + 1.0;
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
922 if (rcond_plus_one == 1.0)
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
923 {
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
924 info = -2;
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
925 }
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
926 else
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
927 {
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
928 int b_len = b.length ();
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
929
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
930 double *result = dup (b.data (), b_len);
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
931
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
932 F77_FCN (dgesl, DGESL) (tmp_data, nr, nr, ipvt, result, 0);
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
933
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
934 retval = ColumnVector (result, b_len);
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
935 }
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
936
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
937 delete [] tmp_data;
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
938 delete [] ipvt;
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
939 delete [] z;
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
940
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
941 return retval;
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
942 }
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
943
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
944 ComplexColumnVector
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
945 Matrix::solve (const ComplexColumnVector& b) const
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
946 {
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
947 ComplexMatrix tmp (*this);
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
948 return tmp.solve (b);
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
949 }
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
950
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
951 ComplexColumnVector
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
952 Matrix::solve (const ComplexColumnVector& b, int& info) const
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
953 {
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
954 ComplexMatrix tmp (*this);
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
955 return tmp.solve (b, info);
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
956 }
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
957
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
958 ComplexColumnVector
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
959 Matrix::solve (const ComplexColumnVector& b, int& info, double& rcond) const
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
960 {
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
961 ComplexMatrix tmp (*this);
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
962 return tmp.solve (b, info, rcond);
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
963 }
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
964
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
965 Matrix
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
966 Matrix::lssolve (const Matrix& b) const
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
967 {
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
968 int info;
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
969 int rank;
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
970 return lssolve (b, info, rank);
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
971 }
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
972
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
973 Matrix
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
974 Matrix::lssolve (const Matrix& b, int& info) const
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
975 {
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
976 int rank;
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
977 return lssolve (b, info, rank);
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
978 }
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
979
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
980 Matrix
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
981 Matrix::lssolve (const Matrix& b, int& info, int& rank) const
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
982 {
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
983 int nrhs = b.cols ();
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
984
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
985 int m = rows ();
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
986 int n = cols ();
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
987
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
988 if (m == 0 || n == 0 || m != b.rows ())
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
989 {
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
990 (*current_liboctave_error_handler)
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
991 ("matrix dimension mismatch in solution of least squares problem");
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
992 return Matrix ();
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
993 }
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
994
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
995 double *tmp_data = dup (data (), length ());
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
996
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
997 int nrr = m > n ? m : n;
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
998 Matrix result (nrr, nrhs);
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
999
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
1000 for (int j = 0; j < nrhs; j++)
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
1001 for (int i = 0; i < m; i++)
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
1002 result.elem (i, j) = b.elem (i, j);
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
1003
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
1004 double *presult = result.fortran_vec ();
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
1005
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
1006 int len_s = m < n ? m : n;
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
1007 double *s = new double [len_s];
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
1008 double rcond = -1.0;
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
1009 int lwork;
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
1010 if (m < n)
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
1011 lwork = 3*m + (2*m > nrhs ? (2*m > n ? 2*m : n) : (nrhs > n ? nrhs : n));
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
1012 else
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
1013 lwork = 3*n + (2*n > nrhs ? (2*n > m ? 2*n : m) : (nrhs > m ? nrhs : m));
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
1014
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
1015 double *work = new double [lwork];
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
1016
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
1017 F77_FCN (dgelss, DGELSS) (m, n, nrhs, tmp_data, m, presult, nrr, s,
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
1018 rcond, rank, work, lwork, info);
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
1019
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
1020 Matrix retval (n, nrhs);
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
1021 for (int j = 0; j < nrhs; j++)
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
1022 for (int i = 0; i < n; i++)
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
1023 retval.elem (i, j) = result.elem (i, j);
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
1024
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
1025 delete [] tmp_data;
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
1026 delete [] s;
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
1027 delete [] work;
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
1028
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
1029 return retval;
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
1030 }
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
1031
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
1032 ComplexMatrix
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
1033 Matrix::lssolve (const ComplexMatrix& b) const
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
1034 {
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
1035 ComplexMatrix tmp (*this);
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
1036 int info;
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
1037 int rank;
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
1038 return tmp.lssolve (b, info, rank);
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
1039 }
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
1040
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
1041 ComplexMatrix
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
1042 Matrix::lssolve (const ComplexMatrix& b, int& info) const
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
1043 {
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
1044 ComplexMatrix tmp (*this);
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
1045 int rank;
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
1046 return tmp.lssolve (b, info, rank);
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
1047 }
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
1048
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
1049 ComplexMatrix
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
1050 Matrix::lssolve (const ComplexMatrix& b, int& info, int& rank) const
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
1051 {
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
1052 ComplexMatrix tmp (*this);
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
1053 return tmp.lssolve (b, info, rank);
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
1054 }
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
1055
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
1056 ColumnVector
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
1057 Matrix::lssolve (const ColumnVector& b) const
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
1058 {
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
1059 int info;
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
1060 int rank;
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
1061 return lssolve (b, info, rank);
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
1062 }
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
1063
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
1064 ColumnVector
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
1065 Matrix::lssolve (const ColumnVector& b, int& info) const
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
1066 {
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
1067 int rank;
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
1068 return lssolve (b, info, rank);
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
1069 }
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
1070
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
1071 ColumnVector
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
1072 Matrix::lssolve (const ColumnVector& b, int& info, int& rank) const
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
1073 {
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
1074 int nrhs = 1;
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
1075
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
1076 int m = rows ();
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
1077 int n = cols ();
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
1078
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
1079 if (m == 0 || n == 0 || m != b.length ())
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
1080 {
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
1081 (*current_liboctave_error_handler)
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
1082 ("matrix dimension mismatch in solution of least squares problem");
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
1083 return ColumnVector ();
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
1084 }
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
1085
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
1086 double *tmp_data = dup (data (), length ());
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
1087
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
1088 int nrr = m > n ? m : n;
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
1089 ColumnVector result (nrr);
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
1090
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
1091 for (int i = 0; i < m; i++)
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
1092 result.elem (i) = b.elem (i);
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
1093
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
1094 double *presult = result.fortran_vec ();
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
1095
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
1096 int len_s = m < n ? m : n;
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
1097 double *s = new double [len_s];
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
1098 double rcond = -1.0;
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
1099 int lwork;
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
1100 if (m < n)
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
1101 lwork = 3*m + (2*m > nrhs ? (2*m > n ? 2*m : n) : (nrhs > n ? nrhs : n));
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
1102 else
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
1103 lwork = 3*n + (2*n > nrhs ? (2*n > m ? 2*n : m) : (nrhs > m ? nrhs : m));
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
1104
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
1105 double *work = new double [lwork];
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
1106
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
1107 F77_FCN (dgelss, DGELSS) (m, n, nrhs, tmp_data, m, presult, nrr, s,
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
1108 rcond, rank, work, lwork, info);
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
1109
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
1110 ColumnVector retval (n);
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
1111 for (int i = 0; i < n; i++)
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
1112 retval.elem (i) = result.elem (i);
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
1113
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
1114 delete [] tmp_data;
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
1115 delete [] s;
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
1116 delete [] work;
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
1117
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
1118 return retval;
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
1119 }
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
1120
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
1121 ComplexColumnVector
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
1122 Matrix::lssolve (const ComplexColumnVector& b) const
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
1123 {
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
1124 ComplexMatrix tmp (*this);
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
1125 return tmp.lssolve (b);
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
1126 }
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
1127
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
1128 ComplexColumnVector
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
1129 Matrix::lssolve (const ComplexColumnVector& b, int& info) const
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
1130 {
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
1131 ComplexMatrix tmp (*this);
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
1132 return tmp.lssolve (b, info);
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
1133 }
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
1134
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
1135 ComplexColumnVector
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
1136 Matrix::lssolve (const ComplexColumnVector& b, int& info, int& rank) const
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
1137 {
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
1138 ComplexMatrix tmp (*this);
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
1139 return tmp.lssolve (b, info, rank);
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
1140 }
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
1141
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
1142 Matrix&
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
1143 Matrix::operator += (const Matrix& a)
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
1144 {
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
1145 int nr = rows ();
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
1146 int nc = cols ();
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
1147 if (nr != a.rows () || nc != a.cols ())
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
1148 {
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
1149 (*current_liboctave_error_handler)
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
1150 ("nonconformant matrix += operation attempted");
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
1151 return *this;
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
1152 }
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
1153
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
1154 if (nr == 0 || nc == 0)
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
1155 return *this;
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
1156
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
1157 double *d = fortran_vec (); // Ensures only one reference to my privates!
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
1158
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
1159 add2 (d, a.data (), length ());
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
1160
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
1161 return *this;
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
1162 }
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
1163
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
1164 Matrix&
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
1165 Matrix::operator -= (const Matrix& a)
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
1166 {
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
1167 int nr = rows ();
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
1168 int nc = cols ();
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
1169 if (nr != a.rows () || nc != a.cols ())
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
1170 {
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
1171 (*current_liboctave_error_handler)
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
1172 ("nonconformant matrix -= operation attempted");
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
1173 return *this;
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
1174 }
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
1175
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
1176 if (nr == 0 || nc == 0)
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
1177 return *this;
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
1178
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
1179 double *d = fortran_vec (); // Ensures only one reference to my privates!
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
1180
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
1181 subtract2 (d, a.data (), length ());
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
1182
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
1183 return *this;
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
1184 }
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
1185
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
1186 Matrix&
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
1187 Matrix::operator += (const DiagMatrix& a)
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
1188 {
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
1189 if (rows () != a.rows () || cols () != a.cols ())
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
1190 {
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
1191 (*current_liboctave_error_handler)
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
1192 ("nonconformant matrix += operation attempted");
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
1193 return *this;
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
1194 }
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
1195
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
1196 for (int i = 0; i < a.length (); i++)
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
1197 elem (i, i) += a.elem (i, i);
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
1198
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
1199 return *this;
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
1200 }
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
1201
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
1202 Matrix&
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
1203 Matrix::operator -= (const DiagMatrix& a)
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
1204 {
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
1205 if (rows () != a.rows () || cols () != a.cols ())
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
1206 {
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
1207 (*current_liboctave_error_handler)
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
1208 ("nonconformant matrix += operation attempted");
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
1209 return *this;
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
1210 }
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
1211
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
1212 for (int i = 0; i < a.length (); i++)
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
1213 elem (i, i) -= a.elem (i, i);
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
1214
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
1215 return *this;
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
1216 }
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
1217
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
1218 // unary operations
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
1219
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
1220 Matrix
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
1221 Matrix::operator ! (void) const
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
1222 {
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
1223 int nr = rows ();
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
1224 int nc = cols ();
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
1225
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
1226 Matrix b (nr, nc);
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
1227
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
1228 for (int j = 0; j < nc; j++)
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
1229 for (int i = 0; i < nr; i++)
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
1230 b.elem (i, j) = ! elem (i, j);
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
1231
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
1232 return b;
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
1233 }
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
1234
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
1235 // column vector by row vector -> matrix operations
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
1236
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
1237 Matrix
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
1238 operator * (const ColumnVector& v, const RowVector& a)
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
1239 {
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
1240 int len = v.length ();
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
1241 int a_len = a.length ();
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
1242 if (len != a_len)
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
1243 {
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
1244 (*current_liboctave_error_handler)
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
1245 ("nonconformant vector multiplication attempted");
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
1246 return Matrix ();
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
1247 }
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
1248
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
1249 if (len == 0)
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
1250 return Matrix (len, len, 0.0);
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
1251
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
1252 double *c = new double [len * a_len];
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
1253
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
1254 F77_FCN (dgemm, DGEMM) ("N", "N", len, a_len, 1, 1.0, v.data (),
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
1255 len, a.data (), 1, 0.0, c, len, 1L, 1L);
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
1256
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
1257 return Matrix (c, len, a_len);
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
1258 }
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
1259
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
1260 // diagonal matrix by scalar -> matrix operations
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
1261
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
1262 Matrix
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
1263 operator + (const DiagMatrix& a, double s)
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
1264 {
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
1265 Matrix tmp (a.rows (), a.cols (), s);
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
1266 return a + tmp;
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
1267 }
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
1268
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
1269 Matrix
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
1270 operator - (const DiagMatrix& a, double s)
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
1271 {
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
1272 Matrix tmp (a.rows (), a.cols (), -s);
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
1273 return a + tmp;
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
1274 }
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
1275
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
1276 // scalar by diagonal matrix -> matrix operations
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
1277
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
1278 Matrix
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
1279 operator + (double s, const DiagMatrix& a)
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
1280 {
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
1281 Matrix tmp (a.rows (), a.cols (), s);
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
1282 return tmp + a;
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
1283 }
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
1284
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
1285 Matrix
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
1286 operator - (double s, const DiagMatrix& a)
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
1287 {
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
1288 Matrix tmp (a.rows (), a.cols (), s);
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
1289 return tmp - a;
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
1290 }
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
1291
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
1292 // matrix by diagonal matrix -> matrix operations
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
1293
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
1294 Matrix
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
1295 operator + (const Matrix& m, const DiagMatrix& a)
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
1296 {
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
1297 int nr = m.rows ();
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
1298 int nc = m.cols ();
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
1299 if (nr != a.rows () || nc != a.cols ())
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
1300 {
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
1301 (*current_liboctave_error_handler)
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
1302 ("nonconformant matrix addition attempted");
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
1303 return Matrix ();
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
1304 }
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
1305
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
1306 if (nr == 0 || nc == 0)
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
1307 return Matrix (nr, nc);
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
1308
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
1309 Matrix result (m);
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
1310 int a_len = a.length ();
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
1311 for (int i = 0; i < a_len; i++)
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
1312 result.elem (i, i) += a.elem (i, i);
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
1313
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
1314 return result;
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
1315 }
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
1316
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
1317 Matrix
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
1318 operator - (const Matrix& m, const DiagMatrix& a)
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
1319 {
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
1320 int nr = m.rows ();
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
1321 int nc = m.cols ();
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
1322 if (nr != a.rows () || nc != a.cols ())
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
1323 {
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
1324 (*current_liboctave_error_handler)
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
1325 ("nonconformant matrix subtraction attempted");
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
1326 return Matrix ();
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
1327 }
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
1328
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
1329 if (nr == 0 || nc == 0)
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
1330 return Matrix (nr, nc);
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
1331
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
1332 Matrix result (m);
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
1333 int a_len = a.length ();
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
1334 for (int i = 0; i < a_len; i++)
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
1335 result.elem (i, i) -= a.elem (i, i);
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
1336
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
1337 return result;
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
1338 }
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
1339
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
1340 Matrix
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
1341 operator * (const Matrix& m, const DiagMatrix& a)
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
1342 {
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
1343 int nr = m.rows ();
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
1344 int nc = m.cols ();
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
1345 int a_nr = a.rows ();
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
1346 int a_nc = a.cols ();
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
1347 if (nc != a_nr)
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
1348 {
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
1349 (*current_liboctave_error_handler)
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
1350 ("nonconformant matrix multiplication attempted");
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
1351 return Matrix ();
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
1352 }
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
1353
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
1354 if (nr == 0 || nc == 0 || a_nc == 0)
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
1355 return Matrix (nr, a_nc, 0.0);
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
1356
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
1357 double *c = new double [nr*a_nc];
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
1358 double *ctmp = 0;
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
1359
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
1360 int a_len = a.length ();
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
1361 for (int j = 0; j < a_len; j++)
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
1362 {
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
1363 int idx = j * nr;
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
1364 ctmp = c + idx;
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
1365 if (a.elem (j, j) == 1.0)
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
1366 {
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
1367 for (int i = 0; i < nr; i++)
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
1368 ctmp[i] = m.elem (i, j);
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
1369 }
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
1370 else if (a.elem (j, j) == 0.0)
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
1371 {
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
1372 for (int i = 0; i < nr; i++)
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
1373 ctmp[i] = 0.0;
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
1374 }
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
1375 else
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
1376 {
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
1377 for (int i = 0; i < nr; i++)
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
1378 ctmp[i] = a.elem (j, j) * m.elem (i, j);
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
1379 }
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
1380 }
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
1381
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
1382 if (a_nr < a_nc)
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
1383 {
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
1384 for (int i = nr * nc; i < nr * a_nc; i++)
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
1385 ctmp[i] = 0.0;
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
1386 }
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
1387
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
1388 return Matrix (c, nr, a_nc);
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
1389 }
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
1390
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
1391 // diagonal matrix by matrix -> matrix operations
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
1392
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
1393 Matrix
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
1394 operator + (const DiagMatrix& m, const Matrix& a)
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
1395 {
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
1396 int nr = m.rows ();
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
1397 int nc = m.cols ();
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
1398 if (nr != a.rows () || nc != a.cols ())
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
1399 {
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
1400 (*current_liboctave_error_handler)
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
1401 ("nonconformant matrix addition attempted");
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
1402 return Matrix ();
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
1403 }
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
1404
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
1405 if (nr == 0 || nc == 0)
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
1406 return Matrix (nr, nc);
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
1407
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
1408 Matrix result (a);
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
1409 for (int i = 0; i < m.length (); i++)
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
1410 result.elem (i, i) += m.elem (i, i);
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
1411
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
1412 return result;
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
1413 }
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
1414
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
1415 Matrix
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
1416 operator - (const DiagMatrix& m, const Matrix& a)
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
1417 {
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
1418 int nr = m.rows ();
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
1419 int nc = m.cols ();
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
1420 if (nr != a.rows () || nc != a.cols ())
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
1421 {
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
1422 (*current_liboctave_error_handler)
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
1423 ("nonconformant matrix subtraction attempted");
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
1424 return Matrix ();
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
1425 }
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
1426
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
1427 if (nr == 0 || nc == 0)
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
1428 return Matrix (nr, nc);
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
1429
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
1430 Matrix result (-a);
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
1431 for (int i = 0; i < m.length (); i++)
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
1432 result.elem (i, i) += m.elem (i, i);
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
1433
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
1434 return result;
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
1435 }
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
1436
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
1437 Matrix
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
1438 operator * (const DiagMatrix& m, const Matrix& a)
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
1439 {
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
1440 int nr = m.rows ();
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
1441 int nc = m.cols ();
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
1442 int a_nr = a.rows ();
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
1443 int a_nc = a.cols ();
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
1444 if (nc != a_nr)
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
1445 {
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
1446 (*current_liboctave_error_handler)
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
1447 ("nonconformant matrix multiplication attempted");
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
1448 return Matrix ();
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
1449 }
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
1450
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
1451 if (nr == 0 || nc == 0 || a_nc == 0)
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
1452 return Matrix (nr, a_nc, 0.0);
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
1453
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
1454 Matrix c (nr, a_nc);
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
1455
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
1456 for (int i = 0; i < m.length (); i++)
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
1457 {
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
1458 if (m.elem (i, i) == 1.0)
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
1459 {
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
1460 for (int j = 0; j < a_nc; j++)
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
1461 c.elem (i, j) = a.elem (i, j);
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
1462 }
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
1463 else if (m.elem (i, i) == 0.0)
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
1464 {
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
1465 for (int j = 0; j < a_nc; j++)
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
1466 c.elem (i, j) = 0.0;
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
1467 }
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
1468 else
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
1469 {
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
1470 for (int j = 0; j < a_nc; j++)
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
1471 c.elem (i, j) = m.elem (i, i) * a.elem (i, j);
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
1472 }
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
1473 }
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
1474
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
1475 if (nr > nc)
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
1476 {
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
1477 for (int j = 0; j < a_nc; j++)
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
1478 for (int i = a_nr; i < nr; i++)
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
1479 c.elem (i, j) = 0.0;
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
1480 }
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
1481
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
1482 return c;
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
1483 }
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
1484
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
1485 // matrix by matrix -> matrix operations
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
1486
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
1487 Matrix
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
1488 operator * (const Matrix& m, const Matrix& a)
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
1489 {
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
1490 int nr = m.rows ();
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
1491 int nc = m.cols ();
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
1492 int a_nr = a.rows ();
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
1493 int a_nc = a.cols ();
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
1494 if (nc != a_nr)
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
1495 {
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
1496 (*current_liboctave_error_handler)
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
1497 ("nonconformant matrix multiplication attempted");
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
1498 return Matrix ();
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
1499 }
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
1500
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
1501 if (nr == 0 || nc == 0 || a_nc == 0)
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
1502 return Matrix (nr, a_nc, 0.0);
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
1503
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
1504 int ld = nr;
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
1505 int lda = a_nr;
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
1506
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
1507 double *c = new double [nr*a_nc];
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
1508
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
1509 F77_FCN (dgemm, DGEMM) ("N", "N", nr, a_nc, nc, 1.0, m.data (),
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
1510 ld, a.data (), lda, 0.0, c, nr, 1L, 1L);
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
1511
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
1512 return Matrix (c, nr, a_nc);
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
1513 }
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
1514
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
1515 // other operations.
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
1516
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
1517 Matrix
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
1518 map (d_d_Mapper f, const Matrix& a)
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
1519 {
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
1520 Matrix b (a);
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
1521 b.map (f);
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
1522 return b;
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
1523 }
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
1524
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
1525 Matrix
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
1526 map (d_c_Mapper f, const ComplexMatrix& a)
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
1527 {
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
1528 int a_nc = a.cols ();
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
1529 int a_nr = a.rows ();
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
1530 Matrix b (a_nr, a_nc);
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
1531 for (int j = 0; j < a_nc; j++)
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
1532 for (int i = 0; i < a_nr; i++)
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
1533 b.elem (i, j) = f (a.elem (i, j));
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
1534 return b;
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
1535 }
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
1536
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
1537 void
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
1538 Matrix::map (d_d_Mapper f)
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
1539 {
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
1540 double *d = fortran_vec (); // Ensures only one reference to my privates!
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
1541
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
1542 for (int i = 0; i < length (); i++)
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
1543 d[i] = f (d[i]);
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
1544 }
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
1545
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
1546 // XXX FIXME XXX Do these really belong here? They should maybe be
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
1547 // cleaned up a bit, no? What about corresponding functions for the
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
1548 // Vectors?
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
1549
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
1550 Matrix
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
1551 Matrix::all (void) const
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
1552 {
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
1553 int nr = rows ();
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
1554 int nc = cols ();
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
1555 Matrix retval;
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
1556 if (nr > 0 && nc > 0)
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
1557 {
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
1558 if (nr == 1)
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
1559 {
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
1560 retval.resize (1, 1);
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
1561 retval.elem (0, 0) = 1.0;
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
1562 for (int j = 0; j < nc; j++)
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
1563 {
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
1564 if (elem (0, j) == 0.0)
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
1565 {
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
1566 retval.elem (0, 0) = 0.0;
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
1567 break;
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
1568 }
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
1569 }
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
1570 }
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
1571 else if (nc == 1)
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
1572 {
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
1573 retval.resize (1, 1);
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
1574 retval.elem (0, 0) = 1.0;
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
1575 for (int i = 0; i < nr; i++)
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
1576 {
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
1577 if (elem (i, 0) == 0.0)
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
1578 {
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
1579 retval.elem (0, 0) = 0.0;
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
1580 break;
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
1581 }
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
1582 }
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
1583 }
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
1584 else
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
1585 {
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
1586 retval.resize (1, nc);
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
1587 for (int j = 0; j < nc; j++)
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
1588 {
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
1589 retval.elem (0, j) = 1.0;
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
1590 for (int i = 0; i < nr; i++)
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
1591 {
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
1592 if (elem (i, j) == 0.0)
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
1593 {
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
1594 retval.elem (0, j) = 0.0;
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
1595 break;
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
1596 }
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
1597 }
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
1598 }
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
1599 }
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
1600 }
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
1601 return retval;
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
1602 }
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
1603
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
1604 Matrix
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
1605 Matrix::any (void) const
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
1606 {
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
1607 int nr = rows ();
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
1608 int nc = cols ();
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
1609 Matrix retval;
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
1610 if (nr > 0 && nc > 0)
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
1611 {
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
1612 if (nr == 1)
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
1613 {
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
1614 retval.resize (1, 1);
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
1615 retval.elem (0, 0) = 0.0;
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
1616 for (int j = 0; j < nc; j++)
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
1617 {
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
1618 if (elem (0, j) != 0.0)
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
1619 {
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
1620 retval.elem (0, 0) = 1.0;
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
1621 break;
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
1622 }
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
1623 }
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
1624 }
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
1625 else if (nc == 1)
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
1626 {
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
1627 retval.resize (1, 1);
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
1628 retval.elem (0, 0) = 0.0;
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
1629 for (int i = 0; i < nr; i++)
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
1630 {
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
1631 if (elem (i, 0) != 0.0)
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
1632 {
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
1633 retval.elem (0, 0) = 1.0;
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
1634 break;
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
1635 }
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
1636 }
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
1637 }
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
1638 else
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
1639 {
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
1640 retval.resize (1, nc);
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
1641 for (int j = 0; j < nc; j++)
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
1642 {
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
1643 retval.elem (0, j) = 0.0;
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
1644 for (int i = 0; i < nr; i++)
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
1645 {
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
1646 if (elem (i, j) != 0.0)
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
1647 {
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
1648 retval.elem (0, j) = 1.0;
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
1649 break;
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
1650 }
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
1651 }
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
1652 }
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
1653 }
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
1654 }
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
1655 return retval;
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
1656 }
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
1657
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
1658 Matrix
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
1659 Matrix::cumprod (void) const
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
1660 {
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
1661 Matrix retval;
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
1662
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
1663 int nr = rows ();
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
1664 int nc = cols ();
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
1665
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
1666 if (nr == 1)
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
1667 {
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
1668 retval.resize (1, nc);
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
1669 if (nc > 0)
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
1670 {
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
1671 double prod = elem (0, 0);
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
1672 for (int j = 0; j < nc; j++)
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
1673 {
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
1674 retval.elem (0, j) = prod;
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
1675 if (j < nc - 1)
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
1676 prod *= elem (0, j+1);
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
1677 }
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
1678 }
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
1679 }
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
1680 else if (nc == 1)
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
1681 {
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
1682 retval.resize (nr, 1);
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
1683 if (nr > 0)
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
1684 {
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
1685 double prod = elem (0, 0);
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
1686 for (int i = 0; i < nr; i++)
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
1687 {
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
1688 retval.elem (i, 0) = prod;
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
1689 if (i < nr - 1)
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
1690 prod *= elem (i+1, 0);
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
1691 }
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
1692 }
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
1693 }
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
1694 else
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
1695 {
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
1696 retval.resize (nr, nc);
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
1697 if (nr > 0 && nc > 0)
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
1698 {
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
1699 for (int j = 0; j < nc; j++)
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
1700 {
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
1701 double prod = elem (0, j);
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
1702 for (int i = 0; i < nr; i++)
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
1703 {
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
1704 retval.elem (i, j) = prod;
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
1705 if (i < nr - 1)
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
1706 prod *= elem (i+1, j);
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
1707 }
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
1708 }
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
1709 }
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
1710 }
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
1711 return retval;
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
1712 }
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
1713
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
1714 Matrix
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
1715 Matrix::cumsum (void) const
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
1716 {
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
1717 Matrix retval;
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
1718
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
1719 int nr = rows ();
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
1720 int nc = cols ();
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
1721
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
1722 if (nr == 1)
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
1723 {
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
1724 retval.resize (1, nc);
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
1725 if (nc > 0)
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
1726 {
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
1727 double sum = elem (0, 0);
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
1728 for (int j = 0; j < nc; j++)
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
1729 {
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
1730 retval.elem (0, j) = sum;
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
1731 if (j < nc - 1)
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
1732 sum += elem (0, j+1);
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
1733 }
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
1734 }
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
1735 }
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
1736 else if (nc == 1)
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
1737 {
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
1738 retval.resize (nr, 1);
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
1739 if (nr > 0)
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
1740 {
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
1741 double sum = elem (0, 0);
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
1742 for (int i = 0; i < nr; i++)
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
1743 {
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
1744 retval.elem (i, 0) = sum;
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
1745 if (i < nr - 1)
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
1746 sum += elem (i+1, 0);
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
1747 }
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
1748 }
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
1749 }
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
1750 else
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
1751 {
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
1752 retval.resize (nr, nc);
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
1753 if (nr > 0 && nc > 0)
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
1754 {
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
1755 for (int j = 0; j < nc; j++)
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
1756 {
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
1757 double sum = elem (0, j);
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
1758 for (int i = 0; i < nr; i++)
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
1759 {
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
1760 retval.elem (i, j) = sum;
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
1761 if (i < nr - 1)
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
1762 sum += elem (i+1, j);
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
1763 }
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
1764 }
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
1765 }
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
1766 }
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
1767 return retval;
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
1768 }
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
1769
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
1770 Matrix
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
1771 Matrix::prod (void) const
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
1772 {
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
1773 Matrix retval;
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
1774
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
1775 int nr = rows ();
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
1776 int nc = cols ();
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
1777
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
1778 if (nr == 1)
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
1779 {
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
1780 retval.resize (1, 1);
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
1781 retval.elem (0, 0) = 1.0;
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
1782 for (int j = 0; j < nc; j++)
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
1783 retval.elem (0, 0) *= elem (0, j);
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
1784 }
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
1785 else if (nc == 1)
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
1786 {
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
1787 retval.resize (1, 1);
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
1788 retval.elem (0, 0) = 1.0;
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
1789 for (int i = 0; i < nr; i++)
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
1790 retval.elem (0, 0) *= elem (i, 0);
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
1791 }
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
1792 else
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
1793 {
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
1794 if (nc == 0)
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
1795 {
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
1796 retval.resize (1, 1);
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
1797 retval.elem (0, 0) = 1.0;
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
1798 }
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
1799 else
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
1800 retval.resize (1, nc);
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
1801
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
1802 for (int j = 0; j < nc; j++)
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
1803 {
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
1804 retval.elem (0, j) = 1.0;
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
1805 for (int i = 0; i < nr; i++)
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
1806 retval.elem (0, j) *= elem (i, j);
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
1807 }
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
1808 }
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
1809 return retval;
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
1810 }
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
1811
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
1812 Matrix
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
1813 Matrix::sum (void) const
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
1814 {
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
1815 Matrix retval;
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
1816
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
1817 int nr = rows ();
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
1818 int nc = cols ();
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
1819
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
1820 if (nr == 1)
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
1821 {
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
1822 retval.resize (1, 1);
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
1823 retval.elem (0, 0) = 0.0;
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
1824 for (int j = 0; j < nc; j++)
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
1825 retval.elem (0, 0) += elem (0, j);
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
1826 }
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
1827 else if (nc == 1)
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
1828 {
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
1829 retval.resize (1, 1);
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
1830 retval.elem (0, 0) = 0.0;
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
1831 for (int i = 0; i < nr; i++)
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
1832 retval.elem (0, 0) += elem (i, 0);
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
1833 }
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
1834 else
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
1835 {
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
1836 if (nc == 0)
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
1837 {
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
1838 retval.resize (1, 1);
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
1839 retval.elem (0, 0) = 0.0;
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
1840 }
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
1841 else
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
1842 retval.resize (1, nc);
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
1843
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
1844 for (int j = 0; j < nc; j++)
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
1845 {
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
1846 retval.elem (0, j) = 0.0;
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
1847 for (int i = 0; i < nr; i++)
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
1848 retval.elem (0, j) += elem (i, j);
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
1849 }
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
1850 }
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
1851 return retval;
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
1852 }
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
1853
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
1854 Matrix
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
1855 Matrix::sumsq (void) const
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
1856 {
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
1857 Matrix retval;
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
1858
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
1859 int nr = rows ();
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
1860 int nc = cols ();
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
1861
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
1862 if (nr == 1)
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
1863 {
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
1864 retval.resize (1, 1);
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
1865 retval.elem (0, 0) = 0.0;
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
1866 for (int j = 0; j < nc; j++)
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
1867 {
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
1868 double d = elem (0, j);
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
1869 retval.elem (0, 0) += d * d;
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
1870 }
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
1871 }
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
1872 else if (nc == 1)
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
1873 {
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
1874 retval.resize (1, 1);
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
1875 retval.elem (0, 0) = 0.0;
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
1876 for (int i = 0; i < nr; i++)
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
1877 {
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
1878 double d = elem (i, 0);
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
1879 retval.elem (0, 0) += d * d;
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
1880 }
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
1881 }
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
1882 else
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
1883 {
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
1884 retval.resize (1, nc);
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
1885 for (int j = 0; j < nc; j++)
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
1886 {
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
1887 retval.elem (0, j) = 0.0;
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
1888 for (int i = 0; i < nr; i++)
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
1889 {
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
1890 double d = elem (i, j);
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
1891 retval.elem (0, j) += d * d;
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
1892 }
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
1893 }
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
1894 }
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
1895 return retval;
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
1896 }
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
1897
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
1898 ColumnVector
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
1899 Matrix::diag (void) const
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
1900 {
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
1901 return diag (0);
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
1902 }
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
1903
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
1904 ColumnVector
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
1905 Matrix::diag (int k) const
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
1906 {
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
1907 int nnr = rows ();
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
1908 int nnc = cols ();
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
1909 if (k > 0)
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
1910 nnc -= k;
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
1911 else if (k < 0)
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
1912 nnr += k;
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
1913
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
1914 ColumnVector d;
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
1915
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
1916 if (nnr > 0 && nnc > 0)
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
1917 {
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
1918 int ndiag = (nnr < nnc) ? nnr : nnc;
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
1919
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
1920 d.resize (ndiag);
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
1921
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
1922 if (k > 0)
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
1923 {
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
1924 for (int i = 0; i < ndiag; i++)
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
1925 d.elem (i) = elem (i, i+k);
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
1926 }
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
1927 else if ( k < 0)
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
1928 {
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
1929 for (int i = 0; i < ndiag; i++)
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
1930 d.elem (i) = elem (i-k, i);
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
1931 }
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
1932 else
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
1933 {
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
1934 for (int i = 0; i < ndiag; i++)
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
1935 d.elem (i) = elem (i, i);
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
1936 }
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
1937 }
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
1938 else
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
1939 cerr << "diag: requested diagonal out of range\n";
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
1940
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
1941 return d;
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
1942 }
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
1943
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
1944 ColumnVector
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
1945 Matrix::row_min (void) const
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
1946 {
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
1947 ColumnVector result;
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
1948
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
1949 int nr = rows ();
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
1950 int nc = cols ();
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
1951
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
1952 if (nr > 0 && nc > 0)
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
1953 {
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
1954 result.resize (nr);
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
1955
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
1956 for (int i = 0; i < nr; i++)
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
1957 {
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
1958 double res = elem (i, 0);
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
1959 for (int j = 1; j < nc; j++)
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
1960 if (elem (i, j) < res)
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
1961 res = elem (i, j);
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
1962 result.elem (i) = res;
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
1963 }
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
1964 }
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
1965
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
1966 return result;
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
1967 }
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
1968
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
1969 ColumnVector
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
1970 Matrix::row_min_loc (void) const
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
1971 {
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
1972 ColumnVector result;
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
1973
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
1974 int nr = rows ();
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
1975 int nc = cols ();
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
1976
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
1977 if (nr > 0 && nc > 0)
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
1978 {
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
1979 result.resize (nr);
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
1980
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
1981 for (int i = 0; i < nr; i++)
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
1982 {
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
1983 int res = 0;
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
1984 for (int j = 0; j < nc; j++)
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
1985 if (elem (i, j) < elem (i, res))
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
1986 res = j;
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
1987 result.elem (i) = (double) (res + 1);
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
1988 }
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
1989 }
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
1990
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
1991 return result;
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
1992 }
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
1993
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
1994 ColumnVector
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
1995 Matrix::row_max (void) const
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
1996 {
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
1997 ColumnVector result;
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
1998
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
1999 int nr = rows ();
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
2000 int nc = cols ();
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
2001
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
2002 if (nr > 0 && nc > 0)
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
2003 {
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
2004 result.resize (nr);
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
2005
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
2006 for (int i = 0; i < nr; i++)
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
2007 {
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
2008 double res = elem (i, 0);
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
2009 for (int j = 1; j < nc; j++)
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
2010 if (elem (i, j) > res)
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
2011 res = elem (i, j);
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
2012 result.elem (i) = res;
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
2013 }
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
2014 }
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
2015
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
2016 return result;
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
2017 }
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
2018
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
2019 ColumnVector
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
2020 Matrix::row_max_loc (void) const
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
2021 {
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
2022 ColumnVector result;
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
2023
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
2024 int nr = rows ();
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
2025 int nc = cols ();
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
2026
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
2027 if (nr > 0 && nc > 0)
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
2028 {
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
2029 result.resize (nr);
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
2030
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
2031 for (int i = 0; i < nr; i++)
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
2032 {
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
2033 int res = 0;
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
2034 for (int j = 0; j < nc; j++)
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
2035 if (elem (i, j) > elem (i, res))
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
2036 res = j;
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
2037 result.elem (i) = (double) (res + 1);
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
2038 }
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
2039 }
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
2040
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
2041 return result;
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
2042 }
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
2043
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
2044 RowVector
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
2045 Matrix::column_min (void) const
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
2046 {
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
2047 RowVector result;
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
2048
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
2049 int nr = rows ();
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
2050 int nc = cols ();
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
2051
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
2052 if (nr > 0 && nc > 0)
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
2053 {
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
2054 result.resize (nc);
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
2055
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
2056 for (int j = 0; j < nc; j++)
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
2057 {
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
2058 double res = elem (0, j);
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
2059 for (int i = 1; i < nr; i++)
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
2060 if (elem (i, j) < res)
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
2061 res = elem (i, j);
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
2062 result.elem (j) = res;
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
2063 }
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
2064 }
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
2065
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
2066 return result;
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
2067 }
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
2068 RowVector
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
2069 Matrix::column_min_loc (void) const
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
2070 {
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
2071 RowVector result;
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
2072
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
2073 int nr = rows ();
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
2074 int nc = cols ();
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
2075
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
2076 if (nr > 0 && nc > 0)
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
2077 {
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
2078 result.resize (nc);
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
2079
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
2080 for (int j = 0; j < nc; j++)
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
2081 {
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
2082 int res = 0;
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
2083 for (int i = 0; i < nr; i++)
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
2084 if (elem (i, j) < elem (res, j))
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
2085 res = i;
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
2086 result.elem (j) = (double) (res + 1);
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
2087 }
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
2088 }
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
2089
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
2090 return result;
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
2091 }
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
2092
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
2093
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
2094 RowVector
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
2095 Matrix::column_max (void) const
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
2096 {
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
2097 RowVector result;
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
2098
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
2099 int nr = rows ();
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
2100 int nc = cols ();
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
2101
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
2102 if (nr > 0 && nc > 0)
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
2103 {
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
2104 result.resize (nc);
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
2105
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
2106 for (int j = 0; j < nc; j++)
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
2107 {
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
2108 double res = elem (0, j);
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
2109 for (int i = 1; i < nr; i++)
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
2110 if (elem (i, j) > res)
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
2111 res = elem (i, j);
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
2112 result.elem (j) = res;
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
2113 }
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
2114 }
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
2115
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
2116 return result;
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
2117 }
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
2118
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
2119 RowVector
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
2120 Matrix::column_max_loc (void) const
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
2121 {
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
2122 RowVector result;
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
2123
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
2124 int nr = rows ();
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
2125 int nc = cols ();
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
2126
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
2127 if (nr > 0 && nc > 0)
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
2128 {
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
2129 result.resize (nc);
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
2130
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
2131 for (int j = 0; j < nc; j++)
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
2132 {
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
2133 int res = 0;
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
2134 for (int i = 0; i < nr; i++)
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
2135 if (elem (i, j) > elem (res, j))
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
2136 res = i;
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
2137 result.elem (j) = (double) (res + 1);
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
2138 }
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
2139 }
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
2140
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
2141 return result;
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
2142 }
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
2143
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
2144 ostream&
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
2145 operator << (ostream& os, const Matrix& a)
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
2146 {
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
2147 // int field_width = os.precision () + 7;
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
2148
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
2149 for (int i = 0; i < a.rows (); i++)
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
2150 {
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
2151 for (int j = 0; j < a.cols (); j++)
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
2152 os << " " /* setw (field_width) */ << a.elem (i, j);
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
2153 os << "\n";
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
2154 }
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
2155 return os;
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
2156 }
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
2157
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
2158 istream&
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
2159 operator >> (istream& is, Matrix& a)
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
2160 {
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
2161 int nr = a.rows ();
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
2162 int nc = a.cols ();
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
2163
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
2164 if (nr < 1 || nc < 1)
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
2165 is.clear (ios::badbit);
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
2166 else
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
2167 {
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
2168 double tmp;
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
2169 for (int i = 0; i < nr; i++)
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
2170 for (int j = 0; j < nc; j++)
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
2171 {
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
2172 is >> tmp;
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
2173 if (is)
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
2174 a.elem (i, j) = tmp;
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
2175 else
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
2176 break;
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
2177 }
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
2178 }
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
2179
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
2180 return is;
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
2181 }
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
2182
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
2183 // Read an array of data from a file in binary format.
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
2184
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
2185 int
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
2186 Matrix::read (FILE *fptr, const char *type)
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
2187 {
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
2188 // Allocate buffer pointers.
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
2189
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
2190 union
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
2191 {
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
2192 void *vd;
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
2193 char *ch;
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
2194 u_char *uc;
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
2195 short *sh;
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
2196 u_short *us;
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
2197 int *in;
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
2198 u_int *ui;
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
2199 long *ln;
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
2200 u_long *ul;
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
2201 float *fl;
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
2202 double *db;
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
2203 }
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
2204 buf;
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
2205
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
2206 // Convert data to double.
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
2207
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
2208 if (! type)
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
2209 {
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
2210 (*current_liboctave_error_handler)
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
2211 ("fread: invalid NULL type parameter");
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
2212 return 0;
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
2213 }
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
2214
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
2215 int count;
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
2216 int nitems = length ();
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
2217
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
2218 double *d = fortran_vec (); // Ensures only one reference to my privates!
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
2219
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
2220 #define DO_FREAD(TYPE,ELEM) \
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
2221 do \
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
2222 { \
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
2223 size_t size = sizeof (TYPE); \
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
2224 buf.ch = new char [size * nitems]; \
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
2225 count = fread (buf.ch, size, nitems, fptr); \
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
2226 for (int k = 0; k < count; k++) \
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
2227 d[k] = buf.ELEM[k]; \
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
2228 delete [] buf.ch; \
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
2229 } \
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
2230 while (0)
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
2231
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
2232 if (strcasecmp (type, "double") == 0)
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
2233 DO_FREAD (double, db);
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
2234 else if (strcasecmp (type, "char") == 0)
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
2235 DO_FREAD (char, ch);
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
2236 else if (strcasecmp (type, "uchar") == 0)
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
2237 DO_FREAD (u_char, uc);
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
2238 else if (strcasecmp (type, "short") == 0)
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
2239 DO_FREAD (short, sh);
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
2240 else if (strcasecmp (type, "ushort") == 0)
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
2241 DO_FREAD (u_short, us);
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
2242 else if (strcasecmp (type, "int") == 0)
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
2243 DO_FREAD (int, in);
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
2244 else if (strcasecmp (type, "uint") == 0)
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
2245 DO_FREAD (u_int, ui);
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
2246 else if (strcasecmp (type, "long") == 0)
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
2247 DO_FREAD (long, ul);
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
2248 else if (strcasecmp (type, "float") == 0)
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
2249 DO_FREAD (float, fl);
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
2250 else
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
2251 {
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
2252 (*current_liboctave_error_handler)
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
2253 ("fread: invalid NULL type parameter");
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
2254 return 0;
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
2255 }
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
2256
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
2257 return count;
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
2258 }
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
2259
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
2260 // Write the data array to a file in binary format.
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
2261
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
2262 int
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
2263 Matrix::write (FILE *fptr, const char *type)
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
2264 {
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
2265 // Allocate buffer pointers.
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
2266
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
2267 union
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
2268 {
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
2269 void *vd;
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
2270 char *ch;
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
2271 u_char *uc;
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
2272 short *sh;
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
2273 u_short *us;
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
2274 int *in;
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
2275 u_int *ui;
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
2276 long *ln;
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
2277 u_long *ul;
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
2278 float *fl;
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
2279 double *db;
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
2280 }
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
2281 buf;
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
2282
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
2283 int nitems = length ();
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
2284
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
2285 double *d = fortran_vec ();
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
2286
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
2287 // Convert from double to correct size.
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
2288
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
2289 if (! type)
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
2290 {
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
2291 (*current_liboctave_error_handler)
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
2292 ("fwrite: invalid NULL type parameter");
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
2293 return 0;
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
2294 }
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
2295
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
2296 size_t size;
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
2297 int count;
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
2298
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
2299 #define DO_FWRITE(TYPE,ELEM) \
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
2300 do \
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
2301 { \
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
2302 size = sizeof (TYPE); \
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
2303 buf.ELEM = new TYPE [nitems]; \
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
2304 for (int k = 0; k < nitems; k++) \
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
2305 buf.ELEM[k] = (TYPE) d[k]; \
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
2306 count = fwrite (buf.ELEM, size, nitems, fptr); \
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
2307 delete [] buf.ELEM; \
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
2308 } \
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
2309 while (0)
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
2310
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
2311 if (strcasecmp (type, "double") == 0)
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
2312 DO_FWRITE (double, db);
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
2313 else if (strcasecmp (type, "char") == 0)
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
2314 DO_FWRITE (char, ch);
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
2315 else if (strcasecmp (type, "uchar") == 0)
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
2316 DO_FWRITE (u_char, uc);
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
2317 else if (strcasecmp (type, "short") == 0)
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
2318 DO_FWRITE (short, sh);
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
2319 else if (strcasecmp (type, "ushort") == 0)
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
2320 DO_FWRITE (u_short, us);
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
2321 else if (strcasecmp (type, "int") == 0)
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
2322 DO_FWRITE (int, in);
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
2323 else if (strcasecmp (type, "uint") == 0)
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
2324 DO_FWRITE (u_int, ui);
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
2325 else if (strcasecmp (type, "long") == 0)
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
2326 DO_FWRITE (long, ln);
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
2327 else if (strcasecmp (type, "ulong") == 0)
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
2328 DO_FWRITE (u_long, ul);
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
2329 else if (strcasecmp (type, "float") == 0)
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
2330 DO_FWRITE (float, fl);
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
2331 else
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
2332 {
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
2333 (*current_liboctave_error_handler)
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
2334 ("fwrite: unrecognized type parameter %s", type);
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
2335 return 0;
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
2336 }
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
2337
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
2338 return count;
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
2339 }
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
2340 #endif
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
2341
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
2342 /*
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
2343 ;;; Local Variables: ***
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
2344 ;;; mode: C++ ***
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
2345 ;;; page-delimiter: "^/\\*" ***
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
2346 ;;; End: ***
403c60daa8c7 [project @ 1995-10-19 04:34:20 by jwe]
jwe
parents:
diff changeset
2347 */