GNU Octave 10.1.0
A high-level interpreted language, primarily intended for numerical computations, mostly compatible with Matlab
 
Loading...
Searching...
No Matches
fColVector.cc
Go to the documentation of this file.
1////////////////////////////////////////////////////////////////////////
2//
3// Copyright (C) 1994-2025 The Octave Project Developers
4//
5// See the file COPYRIGHT.md in the top-level directory of this
6// distribution or <https://octave.org/copyright/>.
7//
8// This file is part of Octave.
9//
10// Octave is free software: you can redistribute it and/or modify it
11// under the terms of the GNU General Public License as published by
12// the Free Software Foundation, either version 3 of the License, or
13// (at your option) any later version.
14//
15// Octave is distributed in the hope that it will be useful, but
16// WITHOUT ANY WARRANTY; without even the implied warranty of
17// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
18// GNU General Public License for more details.
19//
20// You should have received a copy of the GNU General Public License
21// along with Octave; see the file COPYING. If not, see
22// <https://www.gnu.org/licenses/>.
23//
24////////////////////////////////////////////////////////////////////////
25
26#if defined (HAVE_CONFIG_H)
27# include "config.h"
28#endif
29
30#include <istream>
31#include <ostream>
32
33#include "Array-util.h"
34#include "lo-blas-proto.h"
35#include "lo-error.h"
36#include "mx-base.h"
37#include "mx-inlines.cc"
38#include "oct-cmplx.h"
39
40// Column Vector class.
41
42bool
44{
46 if (len != a.numel ())
47 return 0;
48 return mx_inline_equal (len, data (), a.data ());
49}
50
51bool
53{
54 return !(*this == a);
55}
56
59{
60 octave_idx_type a_len = a.numel ();
61
62 if (r < 0 || r + a_len > numel ())
63 (*current_liboctave_error_handler) ("range error for insert");
64
65 if (a_len > 0)
66 {
67 make_unique ();
68
69 for (octave_idx_type i = 0; i < a_len; i++)
70 xelem (r+i) = a.elem (i);
71 }
72
73 return *this;
74}
75
78{
80
81 if (len > 0)
82 {
83 make_unique ();
84
85 for (octave_idx_type i = 0; i < len; i++)
86 xelem (i) = val;
87 }
88
89 return *this;
90}
91
94{
96
97 if (r1 < 0 || r2 < 0 || r1 >= len || r2 >= len)
98 (*current_liboctave_error_handler) ("range error for fill");
99
100 if (r1 > r2) { std::swap (r1, r2); }
101
102 if (r2 >= r1)
103 {
104 make_unique ();
105
106 for (octave_idx_type i = r1; i <= r2; i++)
107 xelem (i) = val;
108 }
109
110 return *this;
111}
112
115{
117 octave_idx_type nr_insert = len;
118 FloatColumnVector retval (len + a.numel ());
119 retval.insert (*this, 0);
120 retval.insert (a, nr_insert);
121 return retval;
122}
123
129
132{
133 return do_mx_unary_map<float, float, std::abs> (*this);
134}
135
138{
139 return do_mx_unary_op<float, FloatComplex> (a, mx_inline_real);
140}
141
144{
145 return do_mx_unary_op<float, FloatComplex> (a, mx_inline_imag);
146}
147
148// resize is the destructive equivalent for this one
149
152{
153 if (r1 > r2) { std::swap (r1, r2); }
154
155 octave_idx_type new_r = r2 - r1 + 1;
156
157 FloatColumnVector result (new_r);
158
159 for (octave_idx_type i = 0; i < new_r; i++)
160 result.xelem (i) = elem (r1+i);
161
162 return result;
163}
164
167{
168 FloatColumnVector result (n);
169
170 for (octave_idx_type i = 0; i < n; i++)
171 result.xelem (i) = elem (r1+i);
172
173 return result;
174}
175
176// matrix by column vector -> column vector operations
177
180{
181 FloatColumnVector retval;
182
183 F77_INT nr = octave::to_f77_int (m.rows ());
184 F77_INT nc = octave::to_f77_int (m.cols ());
185
186 F77_INT a_len = octave::to_f77_int (a.numel ());
187
188 if (nc != a_len)
189 octave::err_nonconformant ("operator *", nr, nc, a_len, 1);
190
191 retval.clear (nr);
192
193 if (nr != 0)
194 {
195 if (nc == 0)
196 retval.fill (0.0);
197 else
198 {
199 float *y = retval.rwdata ();
200
201 F77_XFCN (sgemv, SGEMV, (F77_CONST_CHAR_ARG2 ("N", 1),
202 nr, nc, 1.0f, m.data (), nr,
203 a.data (), 1, 0.0f, y, 1
204 F77_CHAR_ARG_LEN (1)));
205 }
206 }
207
208 return retval;
209}
210
211// diagonal matrix by column vector -> column vector operations
212
215{
216 FloatColumnVector retval;
217
218 F77_INT nr = octave::to_f77_int (m.rows ());
219 F77_INT nc = octave::to_f77_int (m.cols ());
220
221 F77_INT a_len = octave::to_f77_int (a.numel ());
222
223 if (nc != a_len)
224 octave::err_nonconformant ("operator *", nr, nc, a_len, 1);
225
226 if (nr == 0 || nc == 0)
227 retval.resize (nr, 0.0);
228 else
229 {
230 retval.resize (nr);
231
232 for (octave_idx_type i = 0; i < a_len; i++)
233 retval.elem (i) = a.elem (i) * m.elem (i, i);
234
235 for (octave_idx_type i = a_len; i < nr; i++)
236 retval.elem (i) = 0.0;
237 }
238
239 return retval;
240}
241
242// other operations
243
244float
246{
248 if (len == 0)
249 return 0.0;
250
251 float res = elem (0);
252
253 for (octave_idx_type i = 1; i < len; i++)
254 if (elem (i) < res)
255 res = elem (i);
256
257 return res;
258}
259
260float
262{
264 if (len == 0)
265 return 0.0;
266
267 float res = elem (0);
268
269 for (octave_idx_type i = 1; i < len; i++)
270 if (elem (i) > res)
271 res = elem (i);
272
273 return res;
274}
275
276std::ostream&
277operator << (std::ostream& os, const FloatColumnVector& a)
278{
279// int field_width = os.precision () + 7;
280 for (octave_idx_type i = 0; i < a.numel (); i++)
281 os << /* setw (field_width) << */ a.elem (i) << "\n";
282 return os;
283}
284
285std::istream&
286operator >> (std::istream& is, FloatColumnVector& a)
287{
289
290 if (len > 0)
291 {
292 float tmp;
293 for (octave_idx_type i = 0; i < len; i++)
294 {
295 is >> tmp;
296 if (is)
297 a.elem (i) = tmp;
298 else
299 break;
300 }
301 }
302 return is;
303}
T & xelem(octave_idx_type n)
Size of the specified dimension.
Definition Array.h:525
T & elem(octave_idx_type n)
Size of the specified dimension.
Definition Array.h:563
octave_idx_type rows() const
Definition Array.h:463
octave_idx_type cols() const
Definition Array.h:473
void make_unique()
Definition Array.h:220
const T * data() const
Size of the specified dimension.
Definition Array.h:665
T * rwdata()
Size of the specified dimension.
octave_idx_type numel() const
Number of elements in the array.
Definition Array.h:418
octave_idx_type rows() const
Definition DiagArray2.h:86
T elem(octave_idx_type r, octave_idx_type c) const
Definition DiagArray2.h:114
octave_idx_type cols() const
Definition DiagArray2.h:87
bool operator!=(const FloatColumnVector &a) const
Definition fColVector.cc:52
void clear(octave_idx_type n)
Definition fColVector.h:121
FloatColumnVector stack(const FloatColumnVector &a) const
FloatColumnVector & insert(const FloatColumnVector &a, octave_idx_type r)
Definition fColVector.cc:58
FloatColumnVector extract_n(octave_idx_type r1, octave_idx_type n) const
float max() const
void resize(octave_idx_type n, const float &rfv=0)
Definition fColVector.h:116
FloatRowVector transpose() const
bool operator==(const FloatColumnVector &a) const
Definition fColVector.cc:43
FloatColumnVector extract(octave_idx_type r1, octave_idx_type r2) const
float min() const
FloatColumnVector & fill(float val)
Definition fColVector.cc:77
FloatColumnVector abs() const
MArray< T > transpose() const
Definition MArray.h:97
#define F77_XFCN(f, F, args)
Definition f77-fcn.h:45
octave_f77_int_type F77_INT
Definition f77-fcn.h:306
FloatColumnVector operator*(const FloatMatrix &m, const FloatColumnVector &a)
std::istream & operator>>(std::istream &is, FloatColumnVector &a)
FloatColumnVector real(const FloatComplexColumnVector &a)
FloatColumnVector imag(const FloatComplexColumnVector &a)
std::ostream & operator<<(std::ostream &os, const FloatColumnVector &a)
bool mx_inline_equal(std::size_t n, const T1 *x, const T2 *y)
void mx_inline_real(std::size_t n, T *r, const std::complex< T > *x)
void mx_inline_imag(std::size_t n, T *r, const std::complex< T > *x)
F77_RET_T len
Definition xerbla.cc:61