GNU Octave  9.1.0
A high-level interpreted language, primarily intended for numerical computations, mostly compatible with Matlab
dColVector.cc
Go to the documentation of this file.
1 ////////////////////////////////////////////////////////////////////////
2 //
3 // Copyright (C) 1994-2024 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 
42 bool
44 {
46  if (len != a.numel ())
47  return 0;
48  return mx_inline_equal (len, data (), a.data ());
49 }
50 
51 bool
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 
77 ColumnVector::fill (double val)
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  ColumnVector retval (len + a.numel ());
119  retval.insert (*this, 0);
120  retval.insert (a, nr_insert);
121  return retval;
122 }
123 
124 RowVector
126 {
127  return MArray<double>::transpose ();
128 }
129 
132 {
133  return do_mx_unary_map<double, double, std::abs> (*this);
134 }
135 
138 {
139  return do_mx_unary_op<double, Complex> (a, mx_inline_real);
140 }
141 
144 {
145  return do_mx_unary_op<double, Complex> (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  ColumnVector 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  ColumnVector 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 
179 operator * (const Matrix& m, const ColumnVector& a)
180 {
181  ColumnVector 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  double *y = retval.fortran_vec ();
200 
201  F77_XFCN (dgemv, DGEMV, (F77_CONST_CHAR_ARG2 ("N", 1),
202  nr, nc, 1.0, m.data (), nr,
203  a.data (), 1, 0.0, 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  ColumnVector 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 
244 double
246 {
248  if (len == 0)
249  return 0.0;
250 
251  double 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 
260 double
262 {
264  if (len == 0)
265  return 0.0;
266 
267  double 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 
276 std::ostream&
277 operator << (std::ostream& os, const ColumnVector& 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 
285 std::istream&
286 operator >> (std::istream& is, ColumnVector& a)
287 {
288  octave_idx_type len = a.numel ();
289 
290  if (len > 0)
291  {
292  double 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 & elem(octave_idx_type n)
Size of the specified dimension.
Definition: Array.h:562
T * fortran_vec()
Size of the specified dimension.
Definition: Array-base.cc:1764
const double * data() const
Definition: Array.h:663
void make_unique()
Definition: Array.h:216
double & xelem(octave_idx_type n)
Definition: Array.h:524
octave_idx_type numel() const
Number of elements in the array.
Definition: Array.h:414
void resize(octave_idx_type n, const double &rfv=0)
Definition: dColVector.h:114
ColumnVector & fill(double val)
Definition: dColVector.cc:77
double min() const
Definition: dColVector.cc:245
ColumnVector stack(const ColumnVector &a) const
Definition: dColVector.cc:114
ColumnVector abs() const
Definition: dColVector.cc:131
bool operator==(const ColumnVector &a) const
Definition: dColVector.cc:43
void clear(octave_idx_type n)
Definition: dColVector.h:119
ColumnVector extract(octave_idx_type r1, octave_idx_type r2) const
Definition: dColVector.cc:151
RowVector transpose() const
Definition: dColVector.cc:125
bool operator!=(const ColumnVector &a) const
Definition: dColVector.cc:52
double max() const
Definition: dColVector.cc:261
ColumnVector extract_n(octave_idx_type r1, octave_idx_type n) const
Definition: dColVector.cc:166
ColumnVector & insert(const ColumnVector &a, octave_idx_type r)
Definition: dColVector.cc:58
MArray< T > transpose() const
Definition: MArray.h:99
Definition: dMatrix.h:42
ColumnVector operator*(const Matrix &m, const ColumnVector &a)
Definition: dColVector.cc:179
ColumnVector real(const ComplexColumnVector &a)
Definition: dColVector.cc:137
ColumnVector imag(const ComplexColumnVector &a)
Definition: dColVector.cc:143
std::ostream & operator<<(std::ostream &os, const ColumnVector &a)
Definition: dColVector.cc:277
std::istream & operator>>(std::istream &is, ColumnVector &a)
Definition: dColVector.cc:286
#define F77_XFCN(f, F, args)
Definition: f77-fcn.h:45
octave_f77_int_type F77_INT
Definition: f77-fcn.h:306
void err_nonconformant(const char *op, octave_idx_type op1_len, octave_idx_type op2_len)
bool mx_inline_equal(std::size_t n, const T1 *x, const T2 *y)
Definition: mx-inlines.cc:577
void mx_inline_real(std::size_t n, T *r, const std::complex< T > *x)
Definition: mx-inlines.cc:325
void mx_inline_imag(std::size_t n, T *r, const std::complex< T > *x)
Definition: mx-inlines.cc:333
T octave_idx_type m
Definition: mx-inlines.cc:781
octave_idx_type n
Definition: mx-inlines.cc:761
T * r
Definition: mx-inlines.cc:781
F77_RET_T len
Definition: xerbla.cc:61