TRIQS/nda 1.3.0
Multi-dimensional array library for C++
Loading...
Searching...
No Matches
matrix_functions.hpp
Go to the documentation of this file.
1// Copyright (c) 2019-2024 Simons Foundation
2//
3// Licensed under the Apache License, Version 2.0 (the "License");
4// you may not use this file except in compliance with the License.
5// You may obtain a copy of the License at
6//
7// http://www.apache.org/licenses/LICENSE-2.0.txt
8//
9// Unless required by applicable law or agreed to in writing, software
10// distributed under the License is distributed on an "AS IS" BASIS,
11// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12// See the License for the specific language governing permissions and
13// limitations under the License.
14//
15// Authors: Thomas Hahn, Olivier Parcollet, Nils Wentzell
16
22#pragma once
23
24#include "./accessors.hpp"
25#include "./concepts.hpp"
26#include "./declarations.hpp"
27#include "./layout/policies.hpp"
29#include "./macros.hpp"
31#include "./mem/policies.hpp"
32#include "./stdutil/array.hpp"
33
34#include <algorithm>
35#include <concepts>
36#include <ranges>
37#include <type_traits>
38
39namespace nda {
40
54 template <Scalar S, std::integral Int = long>
55 auto eye(Int dim) {
56 auto r = matrix<S>(dim, dim);
57 r = S{1};
58 return r;
59 }
60
69 template <ArrayOfRank<2> M>
70 auto trace(M const &m) {
71 static_assert(get_rank<M> == 2, "Error in nda::trace: Array/View must have rank 2");
72 EXPECTS(m.shape()[0] == m.shape()[1]);
73 auto r = get_value_t<M>{};
74 auto d = m.shape()[0];
75 for (int i = 0; i < d; ++i) r += m(i, i);
76 return r;
77 }
78
90 template <ArrayOfRank<2> M>
91 ArrayOfRank<2> auto dagger(M const &m) {
93 return conj(transpose(m));
94 else
95 return transpose(m);
96 }
97
105 template <MemoryArrayOfRank<2> M>
107 long dim = std::min(m.shape()[0], m.shape()[1]);
108 long stride = stdutil::sum(m.indexmap().strides());
109 using vector_view_t =
110 basic_array_view<std::remove_reference_t<decltype(*m.data())>, 1, C_stride_layout, 'V', nda::default_accessor, nda::borrowed<>>;
111 return vector_view_t{C_stride_layout::mapping<1>{{dim}, {stride}}, m.data()};
112 }
113
121 template <typename V>
122 requires(std::ranges::contiguous_range<V> or ArrayOfRank<V, 1>)
123 ArrayOfRank<2> auto diag(V const &v) {
124 if constexpr (std::ranges::contiguous_range<V>) {
125 return diag(nda::basic_array_view{v});
126 } else {
127 auto m = matrix<std::remove_const_t<typename V::value_type>>::zeros({v.size(), v.size()});
128 diagonal(m) = v;
129 return m;
130 }
131 }
132
147 template <ArrayOfRank<2> A, ArrayOfRank<2> B>
148 requires(std::same_as<get_value_t<A>, get_value_t<B>>) // NB the get_value_t gets rid of const if any
149 matrix<get_value_t<A>> vstack(A const &a, B const &b) {
150 static_assert(get_rank<A> == 2, "Error in nda::vstack: Only rank 2 arrays/views are allowed");
151 static_assert(get_rank<A> == 2, "Error in nda::vstack: Only rank 2 arrays/views are allowed");
152 EXPECTS_WITH_MESSAGE(a.shape()[1] == b.shape()[1], "Error in nda::vstack: The second dimension of the two matrices must be equal");
153
154 auto [n, q] = a.shape();
155 auto p = b.shape()[0];
156 matrix<get_value_t<A>> res(n + p, q);
157 res(range(0, n), range::all) = a;
158 res(range(n, n + p), range::all) = b;
159 return res;
160 }
161
164} // namespace nda
Defines accessors for nda::array objects (cf. std::default_accessor).
Provides utility functions for std::array.
A generic view of a multi-dimensional array.
A generic multi-dimensional array.
Layout that specifies how to map multi-dimensional indices to a linear/flat index.
Definition idx_map.hpp:103
Check if a given type is an nda::Array of a certain rank.
Definition concepts.hpp:266
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< 1 > auto diagonal(M &m)
Get a view of the diagonal of a 2-dimensional array/view.
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.
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.
Definition traits.hpp:136
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.
Definition traits.hpp:192
constexpr auto sum(std::array< T, R > const &a)
Calculate the sum of all elements in a std::array.
Definition array.hpp:329
constexpr bool is_complex_v
Constexpr variable that is true if type T is a std::complex type.
Definition traits.hpp:75
Provides definitions of various layout policies.
Provides functions to transform the memory layout of an nda::basic_array or nda::basic_array_view.
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).
Definition policies.hpp:79
Memory policy using an nda::mem::handle_borrowed.
Definition policies.hpp:108
Default accessor for various array and view types.
Definition accessors.hpp:36