GNU Octave 7.1.0
A high-level interpreted language, primarily intended for numerical computations, mostly compatible with Matlab
DiagArray2.cc
Go to the documentation of this file.
1////////////////////////////////////////////////////////////////////////
2//
3// Copyright (C) 1996-2022 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// This file should not include config.h. It is only included in other
27// C++ source files that should have included config.h before including
28// this file.
29
30#include <cassert>
31
32#include <algorithm>
33
34#include "DiagArray2.h"
35
36#include "lo-error.h"
37
38template <typename T>
41 : Array<T> (a.as_column ()), m_d1 (r), m_d2 (c)
42{
43 octave_idx_type rcmin = std::min (r, c);
44 if (rcmin != a.numel ())
45 Array<T>::resize (dim_vector (rcmin, 1));
46}
47
48template <typename T>
51{
52 Array<T> d;
53
54 if (k == 0)
55 // The main diagonal is shallow-copied.
56 d = *this;
57 else if (k > 0 && k < cols ())
58 d = Array<T> (dim_vector (std::min (cols () - k, rows ()), 1), T ());
59 else if (k < 0 && -k < rows ())
60 d = Array<T> (dim_vector (std::min (rows () + k, cols ()), 1), T ());
61 else // Matlab returns [] 0x1 for out-of-range diagonal
62 d.resize (dim_vector (0, 1));
64 return d;
65}
66
67template <typename T>
70{
71 return DiagArray2<T> (*this, m_d2, m_d1);
72}
73
74template <typename T>
76DiagArray2<T>::hermitian (T (* fcn) (const T&)) const
77{
78 return DiagArray2<T> (Array<T>::template map<T> (fcn), m_d2, m_d1);
79}
80
81// A two-dimensional array with diagonal elements only.
82
83template <typename T>
84T&
86{
87 static T zero (0);
88 return (r == c) ? Array<T>::elem (r) : zero;
89}
90
91template <typename T>
92T&
94{
95 static T zero (0);
96 return check_idx (r, c) ? elem (r, c) : zero;
97}
98
99template <typename T>
100void
102 const T& rfv)
103{
104 if (r < 0 || c < 0)
105 (*current_liboctave_error_handler) ("can't resize to negative dimensions");
106
107 if (r != dim1 () || c != dim2 ())
108 {
109 Array<T>::resize (dim_vector (std::min (r, c), 1), rfv);
110 m_d1 = r; m_d2 = c;
111 }
112}
113
114template <typename T>
117{
118 Array<T> result (dims (), T (0));
119
120 for (octave_idx_type i = 0, len = length (); i < len; i++)
121 result.xelem (i, i) = dgelem (i);
123 return result;
124}
125
126template <typename T>
127bool
129{
130 bool ok = true;
131
132 if (r < 0 || r >= dim1 ())
133 octave::err_index_out_of_range (2, 1, r+1, dim1 (), dims ());
134
135 if (c < 0 || c >= dim2 ())
136 octave::err_index_out_of_range (2, 2, c+1, dim2 (), dims ());
137
138 return ok;
139}
static int elem
Definition: __contourc__.cc:54
charNDArray min(char d, const charNDArray &m)
Definition: chNDArray.cc:207
T & xelem(octave_idx_type n)
Size of the specified dimension.
Definition: Array.h:504
octave_idx_type numel(void) const
Number of elements in the array.
Definition: Array.h:411
T & elem(octave_idx_type n)
Size of the specified dimension.
Definition: Array.h:534
OCTARRAY_API void resize(const dim_vector &dv, const T &rfv)
Size of the specified dimension.
Definition: Array.cc:1010
OCTAVE_API void resize(octave_idx_type n, octave_idx_type m, const T &rfv)
Definition: DiagArray2.cc:101
OCTAVE_API Array< T > extract_diag(octave_idx_type k=0) const
Definition: DiagArray2.cc:50
DiagArray2(void)
Definition: DiagArray2.h:51
T elem(octave_idx_type r, octave_idx_type c) const
Definition: DiagArray2.h:117
T checkelem(octave_idx_type r, octave_idx_type c) const
Definition: DiagArray2.h:130
OCTAVE_API DiagArray2< T > hermitian(T(*fcn)(const T &)=nullptr) const
Definition: DiagArray2.cc:76
OCTAVE_API Array< T > array_value(void) const
Definition: DiagArray2.cc:116
OCTAVE_API DiagArray2< T > transpose(void) const
Definition: DiagArray2.cc:69
bool check_idx(octave_idx_type r, octave_idx_type c) const
Definition: DiagArray2.cc:128
Vector representing the dimensions (size) of an Array.
Definition: dim-vector.h:94
F77_RET_T const F77_DBLE const F77_DBLE F77_DBLE * d
static OCTAVE_NORETURN void err_index_out_of_range(void)
Definition: idx-vector.cc:52
F77_RET_T len
Definition: xerbla.cc:61