44 template <Scalar S =
double, std::
integral Int =
long>
59 template <ArrayOfRank<2> M>
61 static_assert(
get_rank<M> == 2,
"Error in nda::trace: Array/View must have rank 2");
62 EXPECTS(m.shape()[0] == m.shape()[1]);
64 auto d = m.shape()[0];
65 for (
int i = 0; i < d; ++i) r += m(i, i);
80 template <ArrayOfRank<2> M>
95 template <MemoryArrayOfRank<2> M>
97 long dim = std::min(m.shape()[0], m.shape()[1]);
111 template <
typename V>
112 requires(std::ranges::contiguous_range<V> or ArrayOfRank<V, 1>)
114 if constexpr (std::ranges::contiguous_range<V>) {
137 template <ArrayOfRank<2> A, ArrayOfRank<2> B>
140 static_assert(
get_rank<A> == 2,
"Error in nda::vstack: Only rank 2 arrays/views are allowed");
141 static_assert(
get_rank<A> == 2,
"Error in nda::vstack: Only rank 2 arrays/views are allowed");
142 EXPECTS_WITH_MESSAGE(a.shape()[1] == b.shape()[1],
"Error in nda::vstack: The second dimension of the two matrices must be equal");
144 auto [n, q] = a.shape();
145 auto p = b.shape()[0];
147 res(range(0, n), range::all) = a;
148 res(range(n, n + p), range::all) = b;
163 auto const [m, n] = a.shape();
164 if (m != n and print_error) std::cerr <<
"Error in nda::is_matrix_square: Dimensions are: (" << m <<
"," << n <<
")\n" << std::endl;
180 if (not r and print_error) std::cerr <<
"Error in nda::is_matrix_diagonal: Non-diagonal matrix: " << a << std::endl;
Defines accessors for nda::array objects (cf. std::default_accessor).
Provides utility functions for std::array.
A generic view of a multi-dimensional array.
Check if a given type is an nda::Array of a certain rank.
Provides concepts for the nda library.
Provides various convenient aliases and helper functions for nda::basic_array and nda::basic_array_vi...
auto eye(Int dim)
Create an identity nda::matrix with ones on the diagonal.
ArrayOfRank< 2 > auto diag(V const &v)
Get a new nda::matrix with the given values on the diagonal.
auto zeros(std::array< Int, Rank > const &shape)
Make an array of the given shape on the given address space and zero-initialize it.
auto transpose(A &&a)
Transpose the memory layout of an nda::MemoryArray or an nda::expr_call.
bool is_matrix_diagonal(A const &a, bool print_error=false)
Check if a given matrix is diagonal, i.e. if it is square (see nda::is_matrix_square) and all the the...
ArrayOfRank< 1 > auto diagonal(M &&m)
Get a view of the diagonal of a 2-dimensional array/view.
bool is_matrix_square(A const &a, bool print_error=false)
Check if a given matrix is square, i.e. if the first dimension has the same extent as the second dime...
matrix< get_value_t< A > > vstack(A const &a, B const &b)
Stack two 2-dimensional arrays/views vertically.
auto trace(M const &m)
Get the trace of a 2-dimensional square array/view.
ArrayOfRank< 2 > auto dagger(M const &m)
Get the conjugate transpose of 2-dimensional array/view.
decltype(auto) conj(A &&a)
Function conj for nda::ArrayOrScalar types (lazy and coefficient-wise for nda::Array types with a com...
basic_array< ValueType, 2, Layout, 'M', ContainerPolicy > matrix
Alias template of an nda::basic_array with rank 2 and an 'M' algebra.
constexpr int get_rank
Constexpr variable that specifies the rank of an nda::Array or of a contiguous 1-dimensional range.
std::decay_t< decltype(get_first_element(std::declval< A const >()))> get_value_t
Get the value type of an array/view or a scalar type.
constexpr auto sum(std::array< T, R > const &a)
Calculate the sum of all elements in a std::array.
constexpr bool is_complex_v
Constexpr variable that is true if type T is a std::complex type.
Provides definitions of various layout policies.
Macros used in the nda library.
Provides some custom implementations of standard mathematical functions used for lazy,...
Defines various memory handling policies.
Strided (non-contiguous) layout policy with C-order (row-major order).
idx_map< Rank, 0, C_stride_order< Rank >, layout_prop_e::none > mapping
Multi-dimensional to flat index mapping.
Memory policy using an nda::mem::handle_borrowed.
Default accessor for various array and view types.