annotate src/f-fill.cc @ 1246:35950c102ac3

[project @ 1995-04-11 00:49:24 by jwe]
author jwe
date Tue, 11 Apr 1995 00:49:24 +0000
parents e078f05f4aac
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
515
e078f05f4aac [project @ 1994-07-13 02:31:31 by jwe]
jwe
parents:
diff changeset
1 // f-fill.cc -*- C++ -*-
e078f05f4aac [project @ 1994-07-13 02:31:31 by jwe]
jwe
parents:
diff changeset
2 /*
e078f05f4aac [project @ 1994-07-13 02:31:31 by jwe]
jwe
parents:
diff changeset
3
e078f05f4aac [project @ 1994-07-13 02:31:31 by jwe]
jwe
parents:
diff changeset
4 Copyright (C) 1994 John W. Eaton
e078f05f4aac [project @ 1994-07-13 02:31:31 by jwe]
jwe
parents:
diff changeset
5
e078f05f4aac [project @ 1994-07-13 02:31:31 by jwe]
jwe
parents:
diff changeset
6 This file is part of Octave.
e078f05f4aac [project @ 1994-07-13 02:31:31 by jwe]
jwe
parents:
diff changeset
7
e078f05f4aac [project @ 1994-07-13 02:31:31 by jwe]
jwe
parents:
diff changeset
8 Octave is free software; you can redistribute it and/or modify it
e078f05f4aac [project @ 1994-07-13 02:31:31 by jwe]
jwe
parents:
diff changeset
9 under the terms of the GNU General Public License as published by the
e078f05f4aac [project @ 1994-07-13 02:31:31 by jwe]
jwe
parents:
diff changeset
10 Free Software Foundation; either version 2, or (at your option) any
e078f05f4aac [project @ 1994-07-13 02:31:31 by jwe]
jwe
parents:
diff changeset
11 later version.
e078f05f4aac [project @ 1994-07-13 02:31:31 by jwe]
jwe
parents:
diff changeset
12
e078f05f4aac [project @ 1994-07-13 02:31:31 by jwe]
jwe
parents:
diff changeset
13 Octave is distributed in the hope that it will be useful, but WITHOUT
e078f05f4aac [project @ 1994-07-13 02:31:31 by jwe]
jwe
parents:
diff changeset
14 ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
e078f05f4aac [project @ 1994-07-13 02:31:31 by jwe]
jwe
parents:
diff changeset
15 FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
e078f05f4aac [project @ 1994-07-13 02:31:31 by jwe]
jwe
parents:
diff changeset
16 for more details.
e078f05f4aac [project @ 1994-07-13 02:31:31 by jwe]
jwe
parents:
diff changeset
17
e078f05f4aac [project @ 1994-07-13 02:31:31 by jwe]
jwe
parents:
diff changeset
18 You should have received a copy of the GNU General Public License
e078f05f4aac [project @ 1994-07-13 02:31:31 by jwe]
jwe
parents:
diff changeset
19 along with Octave; see the file COPYING. If not, write to the Free
e078f05f4aac [project @ 1994-07-13 02:31:31 by jwe]
jwe
parents:
diff changeset
20 Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA.
e078f05f4aac [project @ 1994-07-13 02:31:31 by jwe]
jwe
parents:
diff changeset
21
e078f05f4aac [project @ 1994-07-13 02:31:31 by jwe]
jwe
parents:
diff changeset
22 */
e078f05f4aac [project @ 1994-07-13 02:31:31 by jwe]
jwe
parents:
diff changeset
23
e078f05f4aac [project @ 1994-07-13 02:31:31 by jwe]
jwe
parents:
diff changeset
24 #ifdef HAVE_CONFIG_H
e078f05f4aac [project @ 1994-07-13 02:31:31 by jwe]
jwe
parents:
diff changeset
25 #include "config.h"
e078f05f4aac [project @ 1994-07-13 02:31:31 by jwe]
jwe
parents:
diff changeset
26 #endif
e078f05f4aac [project @ 1994-07-13 02:31:31 by jwe]
jwe
parents:
diff changeset
27
e078f05f4aac [project @ 1994-07-13 02:31:31 by jwe]
jwe
parents:
diff changeset
28 #include "tree-const.h"
e078f05f4aac [project @ 1994-07-13 02:31:31 by jwe]
jwe
parents:
diff changeset
29 #include "user-prefs.h"
e078f05f4aac [project @ 1994-07-13 02:31:31 by jwe]
jwe
parents:
diff changeset
30 #include "utils.h"
e078f05f4aac [project @ 1994-07-13 02:31:31 by jwe]
jwe
parents:
diff changeset
31 #include "error.h"
e078f05f4aac [project @ 1994-07-13 02:31:31 by jwe]
jwe
parents:
diff changeset
32 #include "f-fill.h"
e078f05f4aac [project @ 1994-07-13 02:31:31 by jwe]
jwe
parents:
diff changeset
33
e078f05f4aac [project @ 1994-07-13 02:31:31 by jwe]
jwe
parents:
diff changeset
34 #ifndef MIN
e078f05f4aac [project @ 1994-07-13 02:31:31 by jwe]
jwe
parents:
diff changeset
35 #define MIN(a,b) ((a) < (b) ? (a) : (b))
e078f05f4aac [project @ 1994-07-13 02:31:31 by jwe]
jwe
parents:
diff changeset
36 #endif
e078f05f4aac [project @ 1994-07-13 02:31:31 by jwe]
jwe
parents:
diff changeset
37
e078f05f4aac [project @ 1994-07-13 02:31:31 by jwe]
jwe
parents:
diff changeset
38 static void
e078f05f4aac [project @ 1994-07-13 02:31:31 by jwe]
jwe
parents:
diff changeset
39 check_dimensions (int& nr, int& nc, const char *warnfor)
e078f05f4aac [project @ 1994-07-13 02:31:31 by jwe]
jwe
parents:
diff changeset
40 {
e078f05f4aac [project @ 1994-07-13 02:31:31 by jwe]
jwe
parents:
diff changeset
41 if (nr < 0 || nc < 0)
e078f05f4aac [project @ 1994-07-13 02:31:31 by jwe]
jwe
parents:
diff changeset
42 {
e078f05f4aac [project @ 1994-07-13 02:31:31 by jwe]
jwe
parents:
diff changeset
43 if (user_pref.treat_neg_dim_as_zero)
e078f05f4aac [project @ 1994-07-13 02:31:31 by jwe]
jwe
parents:
diff changeset
44 nr = nc = 0;
e078f05f4aac [project @ 1994-07-13 02:31:31 by jwe]
jwe
parents:
diff changeset
45 else
e078f05f4aac [project @ 1994-07-13 02:31:31 by jwe]
jwe
parents:
diff changeset
46 error ("%s: can't create a matrix with negative dimensions",
e078f05f4aac [project @ 1994-07-13 02:31:31 by jwe]
jwe
parents:
diff changeset
47 warnfor);
e078f05f4aac [project @ 1994-07-13 02:31:31 by jwe]
jwe
parents:
diff changeset
48 }
e078f05f4aac [project @ 1994-07-13 02:31:31 by jwe]
jwe
parents:
diff changeset
49 }
e078f05f4aac [project @ 1994-07-13 02:31:31 by jwe]
jwe
parents:
diff changeset
50
e078f05f4aac [project @ 1994-07-13 02:31:31 by jwe]
jwe
parents:
diff changeset
51 static void
e078f05f4aac [project @ 1994-07-13 02:31:31 by jwe]
jwe
parents:
diff changeset
52 get_dimensions (const tree_constant& a, const char *warn_for,
e078f05f4aac [project @ 1994-07-13 02:31:31 by jwe]
jwe
parents:
diff changeset
53 int& nr, int& nc)
e078f05f4aac [project @ 1994-07-13 02:31:31 by jwe]
jwe
parents:
diff changeset
54 {
e078f05f4aac [project @ 1994-07-13 02:31:31 by jwe]
jwe
parents:
diff changeset
55 tree_constant tmpa = a.make_numeric ();
e078f05f4aac [project @ 1994-07-13 02:31:31 by jwe]
jwe
parents:
diff changeset
56
e078f05f4aac [project @ 1994-07-13 02:31:31 by jwe]
jwe
parents:
diff changeset
57 if (tmpa.is_scalar_type ())
e078f05f4aac [project @ 1994-07-13 02:31:31 by jwe]
jwe
parents:
diff changeset
58 {
e078f05f4aac [project @ 1994-07-13 02:31:31 by jwe]
jwe
parents:
diff changeset
59 double tmp = tmpa.double_value ();
e078f05f4aac [project @ 1994-07-13 02:31:31 by jwe]
jwe
parents:
diff changeset
60 nr = nc = NINT (tmp);
e078f05f4aac [project @ 1994-07-13 02:31:31 by jwe]
jwe
parents:
diff changeset
61 }
e078f05f4aac [project @ 1994-07-13 02:31:31 by jwe]
jwe
parents:
diff changeset
62 else
e078f05f4aac [project @ 1994-07-13 02:31:31 by jwe]
jwe
parents:
diff changeset
63 {
e078f05f4aac [project @ 1994-07-13 02:31:31 by jwe]
jwe
parents:
diff changeset
64 nr = tmpa.rows ();
e078f05f4aac [project @ 1994-07-13 02:31:31 by jwe]
jwe
parents:
diff changeset
65 nc = tmpa.columns ();
e078f05f4aac [project @ 1994-07-13 02:31:31 by jwe]
jwe
parents:
diff changeset
66
e078f05f4aac [project @ 1994-07-13 02:31:31 by jwe]
jwe
parents:
diff changeset
67 if ((nr == 1 && nc == 2) || (nr == 2 && nc == 1))
e078f05f4aac [project @ 1994-07-13 02:31:31 by jwe]
jwe
parents:
diff changeset
68 {
e078f05f4aac [project @ 1994-07-13 02:31:31 by jwe]
jwe
parents:
diff changeset
69 ColumnVector v = tmpa.to_vector ();
e078f05f4aac [project @ 1994-07-13 02:31:31 by jwe]
jwe
parents:
diff changeset
70
e078f05f4aac [project @ 1994-07-13 02:31:31 by jwe]
jwe
parents:
diff changeset
71 nr = NINT (v.elem (0));
e078f05f4aac [project @ 1994-07-13 02:31:31 by jwe]
jwe
parents:
diff changeset
72 nc = NINT (v.elem (1));
e078f05f4aac [project @ 1994-07-13 02:31:31 by jwe]
jwe
parents:
diff changeset
73 }
e078f05f4aac [project @ 1994-07-13 02:31:31 by jwe]
jwe
parents:
diff changeset
74 else
e078f05f4aac [project @ 1994-07-13 02:31:31 by jwe]
jwe
parents:
diff changeset
75 warning ("%s (A): use %s (size (A)) instead", warn_for, warn_for);
e078f05f4aac [project @ 1994-07-13 02:31:31 by jwe]
jwe
parents:
diff changeset
76 }
e078f05f4aac [project @ 1994-07-13 02:31:31 by jwe]
jwe
parents:
diff changeset
77
e078f05f4aac [project @ 1994-07-13 02:31:31 by jwe]
jwe
parents:
diff changeset
78 check_dimensions (nr, nc, warn_for); // May set error_state.
e078f05f4aac [project @ 1994-07-13 02:31:31 by jwe]
jwe
parents:
diff changeset
79 }
e078f05f4aac [project @ 1994-07-13 02:31:31 by jwe]
jwe
parents:
diff changeset
80
e078f05f4aac [project @ 1994-07-13 02:31:31 by jwe]
jwe
parents:
diff changeset
81 static void
e078f05f4aac [project @ 1994-07-13 02:31:31 by jwe]
jwe
parents:
diff changeset
82 get_dimensions (const tree_constant& a, const tree_constant& b,
e078f05f4aac [project @ 1994-07-13 02:31:31 by jwe]
jwe
parents:
diff changeset
83 const char *warn_for, int& nr, int& nc)
e078f05f4aac [project @ 1994-07-13 02:31:31 by jwe]
jwe
parents:
diff changeset
84 {
e078f05f4aac [project @ 1994-07-13 02:31:31 by jwe]
jwe
parents:
diff changeset
85 tree_constant tmpa = a.make_numeric ();
e078f05f4aac [project @ 1994-07-13 02:31:31 by jwe]
jwe
parents:
diff changeset
86 tree_constant tmpb = b.make_numeric ();
e078f05f4aac [project @ 1994-07-13 02:31:31 by jwe]
jwe
parents:
diff changeset
87
e078f05f4aac [project @ 1994-07-13 02:31:31 by jwe]
jwe
parents:
diff changeset
88 if (tmpa.is_scalar_type () && tmpb.is_scalar_type ())
e078f05f4aac [project @ 1994-07-13 02:31:31 by jwe]
jwe
parents:
diff changeset
89 {
e078f05f4aac [project @ 1994-07-13 02:31:31 by jwe]
jwe
parents:
diff changeset
90 nr = NINT (tmpa.double_value ());
e078f05f4aac [project @ 1994-07-13 02:31:31 by jwe]
jwe
parents:
diff changeset
91 nc = NINT (tmpb.double_value ());
e078f05f4aac [project @ 1994-07-13 02:31:31 by jwe]
jwe
parents:
diff changeset
92
e078f05f4aac [project @ 1994-07-13 02:31:31 by jwe]
jwe
parents:
diff changeset
93 check_dimensions (nr, nc, warn_for); // May set error_state.
e078f05f4aac [project @ 1994-07-13 02:31:31 by jwe]
jwe
parents:
diff changeset
94 }
e078f05f4aac [project @ 1994-07-13 02:31:31 by jwe]
jwe
parents:
diff changeset
95 else
e078f05f4aac [project @ 1994-07-13 02:31:31 by jwe]
jwe
parents:
diff changeset
96 error ("%s: expecting two scalar arguments", warn_for);
e078f05f4aac [project @ 1994-07-13 02:31:31 by jwe]
jwe
parents:
diff changeset
97 }
e078f05f4aac [project @ 1994-07-13 02:31:31 by jwe]
jwe
parents:
diff changeset
98
e078f05f4aac [project @ 1994-07-13 02:31:31 by jwe]
jwe
parents:
diff changeset
99 tree_constant
e078f05f4aac [project @ 1994-07-13 02:31:31 by jwe]
jwe
parents:
diff changeset
100 fill_matrix (const tree_constant& a, double val, const char *warn_for)
e078f05f4aac [project @ 1994-07-13 02:31:31 by jwe]
jwe
parents:
diff changeset
101 {
e078f05f4aac [project @ 1994-07-13 02:31:31 by jwe]
jwe
parents:
diff changeset
102 int nr, nc;
e078f05f4aac [project @ 1994-07-13 02:31:31 by jwe]
jwe
parents:
diff changeset
103 get_dimensions (a, warn_for, nr, nc);
e078f05f4aac [project @ 1994-07-13 02:31:31 by jwe]
jwe
parents:
diff changeset
104
e078f05f4aac [project @ 1994-07-13 02:31:31 by jwe]
jwe
parents:
diff changeset
105 if (error_state)
e078f05f4aac [project @ 1994-07-13 02:31:31 by jwe]
jwe
parents:
diff changeset
106 return tree_constant ();
e078f05f4aac [project @ 1994-07-13 02:31:31 by jwe]
jwe
parents:
diff changeset
107
e078f05f4aac [project @ 1994-07-13 02:31:31 by jwe]
jwe
parents:
diff changeset
108 Matrix m (nr, nc, val);
e078f05f4aac [project @ 1994-07-13 02:31:31 by jwe]
jwe
parents:
diff changeset
109
e078f05f4aac [project @ 1994-07-13 02:31:31 by jwe]
jwe
parents:
diff changeset
110 return m;
e078f05f4aac [project @ 1994-07-13 02:31:31 by jwe]
jwe
parents:
diff changeset
111 }
e078f05f4aac [project @ 1994-07-13 02:31:31 by jwe]
jwe
parents:
diff changeset
112
e078f05f4aac [project @ 1994-07-13 02:31:31 by jwe]
jwe
parents:
diff changeset
113 tree_constant
e078f05f4aac [project @ 1994-07-13 02:31:31 by jwe]
jwe
parents:
diff changeset
114 fill_matrix (const tree_constant& a, const tree_constant& b,
e078f05f4aac [project @ 1994-07-13 02:31:31 by jwe]
jwe
parents:
diff changeset
115 double val, const char *warn_for)
e078f05f4aac [project @ 1994-07-13 02:31:31 by jwe]
jwe
parents:
diff changeset
116 {
e078f05f4aac [project @ 1994-07-13 02:31:31 by jwe]
jwe
parents:
diff changeset
117 int nr, nc;
e078f05f4aac [project @ 1994-07-13 02:31:31 by jwe]
jwe
parents:
diff changeset
118 get_dimensions (a, b, warn_for, nr, nc); // May set error_state.
e078f05f4aac [project @ 1994-07-13 02:31:31 by jwe]
jwe
parents:
diff changeset
119
e078f05f4aac [project @ 1994-07-13 02:31:31 by jwe]
jwe
parents:
diff changeset
120 if (error_state)
e078f05f4aac [project @ 1994-07-13 02:31:31 by jwe]
jwe
parents:
diff changeset
121 return tree_constant ();
e078f05f4aac [project @ 1994-07-13 02:31:31 by jwe]
jwe
parents:
diff changeset
122
e078f05f4aac [project @ 1994-07-13 02:31:31 by jwe]
jwe
parents:
diff changeset
123 Matrix m (nr, nc, val);
e078f05f4aac [project @ 1994-07-13 02:31:31 by jwe]
jwe
parents:
diff changeset
124
e078f05f4aac [project @ 1994-07-13 02:31:31 by jwe]
jwe
parents:
diff changeset
125 return m;
e078f05f4aac [project @ 1994-07-13 02:31:31 by jwe]
jwe
parents:
diff changeset
126 }
e078f05f4aac [project @ 1994-07-13 02:31:31 by jwe]
jwe
parents:
diff changeset
127
e078f05f4aac [project @ 1994-07-13 02:31:31 by jwe]
jwe
parents:
diff changeset
128 tree_constant
e078f05f4aac [project @ 1994-07-13 02:31:31 by jwe]
jwe
parents:
diff changeset
129 identity_matrix (const tree_constant& a)
e078f05f4aac [project @ 1994-07-13 02:31:31 by jwe]
jwe
parents:
diff changeset
130 {
e078f05f4aac [project @ 1994-07-13 02:31:31 by jwe]
jwe
parents:
diff changeset
131 int nr, nc;
e078f05f4aac [project @ 1994-07-13 02:31:31 by jwe]
jwe
parents:
diff changeset
132 get_dimensions (a, "eye", nr, nc); // May set error_state.
e078f05f4aac [project @ 1994-07-13 02:31:31 by jwe]
jwe
parents:
diff changeset
133
e078f05f4aac [project @ 1994-07-13 02:31:31 by jwe]
jwe
parents:
diff changeset
134 if (error_state)
e078f05f4aac [project @ 1994-07-13 02:31:31 by jwe]
jwe
parents:
diff changeset
135 return tree_constant ();
e078f05f4aac [project @ 1994-07-13 02:31:31 by jwe]
jwe
parents:
diff changeset
136
e078f05f4aac [project @ 1994-07-13 02:31:31 by jwe]
jwe
parents:
diff changeset
137 Matrix m (nr, nc, 0.0);
e078f05f4aac [project @ 1994-07-13 02:31:31 by jwe]
jwe
parents:
diff changeset
138
e078f05f4aac [project @ 1994-07-13 02:31:31 by jwe]
jwe
parents:
diff changeset
139 if (nr > 0 && nc > 0)
e078f05f4aac [project @ 1994-07-13 02:31:31 by jwe]
jwe
parents:
diff changeset
140 {
e078f05f4aac [project @ 1994-07-13 02:31:31 by jwe]
jwe
parents:
diff changeset
141 int n = MIN (nr, nc);
e078f05f4aac [project @ 1994-07-13 02:31:31 by jwe]
jwe
parents:
diff changeset
142 for (int i = 0; i < n; i++)
e078f05f4aac [project @ 1994-07-13 02:31:31 by jwe]
jwe
parents:
diff changeset
143 m.elem (i, i) = 1.0;
e078f05f4aac [project @ 1994-07-13 02:31:31 by jwe]
jwe
parents:
diff changeset
144 }
e078f05f4aac [project @ 1994-07-13 02:31:31 by jwe]
jwe
parents:
diff changeset
145
e078f05f4aac [project @ 1994-07-13 02:31:31 by jwe]
jwe
parents:
diff changeset
146 return m;
e078f05f4aac [project @ 1994-07-13 02:31:31 by jwe]
jwe
parents:
diff changeset
147 }
e078f05f4aac [project @ 1994-07-13 02:31:31 by jwe]
jwe
parents:
diff changeset
148
e078f05f4aac [project @ 1994-07-13 02:31:31 by jwe]
jwe
parents:
diff changeset
149 tree_constant
e078f05f4aac [project @ 1994-07-13 02:31:31 by jwe]
jwe
parents:
diff changeset
150 identity_matrix (const tree_constant& a, const tree_constant& b)
e078f05f4aac [project @ 1994-07-13 02:31:31 by jwe]
jwe
parents:
diff changeset
151 {
e078f05f4aac [project @ 1994-07-13 02:31:31 by jwe]
jwe
parents:
diff changeset
152 int nr, nc;
e078f05f4aac [project @ 1994-07-13 02:31:31 by jwe]
jwe
parents:
diff changeset
153 get_dimensions (a, b, "eye", nr, nc); // May set error_state.
e078f05f4aac [project @ 1994-07-13 02:31:31 by jwe]
jwe
parents:
diff changeset
154
e078f05f4aac [project @ 1994-07-13 02:31:31 by jwe]
jwe
parents:
diff changeset
155 if (error_state)
e078f05f4aac [project @ 1994-07-13 02:31:31 by jwe]
jwe
parents:
diff changeset
156 return tree_constant ();
e078f05f4aac [project @ 1994-07-13 02:31:31 by jwe]
jwe
parents:
diff changeset
157
e078f05f4aac [project @ 1994-07-13 02:31:31 by jwe]
jwe
parents:
diff changeset
158 Matrix m (nr, nc, 0.0);
e078f05f4aac [project @ 1994-07-13 02:31:31 by jwe]
jwe
parents:
diff changeset
159
e078f05f4aac [project @ 1994-07-13 02:31:31 by jwe]
jwe
parents:
diff changeset
160 if (nr > 0 && nc > 0)
e078f05f4aac [project @ 1994-07-13 02:31:31 by jwe]
jwe
parents:
diff changeset
161 {
e078f05f4aac [project @ 1994-07-13 02:31:31 by jwe]
jwe
parents:
diff changeset
162 int n = MIN (nr, nc);
e078f05f4aac [project @ 1994-07-13 02:31:31 by jwe]
jwe
parents:
diff changeset
163 for (int i = 0; i < n; i++)
e078f05f4aac [project @ 1994-07-13 02:31:31 by jwe]
jwe
parents:
diff changeset
164 m.elem (i, i) = 1.0;
e078f05f4aac [project @ 1994-07-13 02:31:31 by jwe]
jwe
parents:
diff changeset
165 }
e078f05f4aac [project @ 1994-07-13 02:31:31 by jwe]
jwe
parents:
diff changeset
166
e078f05f4aac [project @ 1994-07-13 02:31:31 by jwe]
jwe
parents:
diff changeset
167 return m;
e078f05f4aac [project @ 1994-07-13 02:31:31 by jwe]
jwe
parents:
diff changeset
168 }
e078f05f4aac [project @ 1994-07-13 02:31:31 by jwe]
jwe
parents:
diff changeset
169
e078f05f4aac [project @ 1994-07-13 02:31:31 by jwe]
jwe
parents:
diff changeset
170 /*
e078f05f4aac [project @ 1994-07-13 02:31:31 by jwe]
jwe
parents:
diff changeset
171 ;;; Local Variables: ***
e078f05f4aac [project @ 1994-07-13 02:31:31 by jwe]
jwe
parents:
diff changeset
172 ;;; mode: C++ ***
e078f05f4aac [project @ 1994-07-13 02:31:31 by jwe]
jwe
parents:
diff changeset
173 ;;; page-delimiter: "^/\\*" ***
e078f05f4aac [project @ 1994-07-13 02:31:31 by jwe]
jwe
parents:
diff changeset
174 ;;; End: ***
e078f05f4aac [project @ 1994-07-13 02:31:31 by jwe]
jwe
parents:
diff changeset
175 */