10#include <ellalgo/arr.hpp>
29 Arr out(a.cols(), a.rows());
30 for (
size_t i = 0; i < a.rows(); ++i)
31 for (
size_t j = 0; j < a.cols(); ++j) out(j, i) = a(i, j);
42 for (
size_t i = 0; i < a.size(); ++i) out(i) = a(i);
52 assert(a.is_2d() && a.rows() == a.cols());
55 for (
size_t i = 0; i < n; ++i) out(i) = a(i, i);
77inline double norm(
const Arr& a) {
return std::sqrt(sum(a * a)); }
107inline Arr
matmul(
const Arr& A,
const Arr& B) {
108 assert(A.is_2d() && B.is_2d() && A.cols() == B.rows());
113 for (
size_t i = 0; i < m; ++i)
114 for (
size_t j = 0; j < n; ++j) {
116 for (
size_t t = 0; t < k; ++t) s += A(i, t) * B(t, j);
155 assert(A.is_2d() && A.cols() == n);
157 for (
size_t j = 0; j < n; ++j) {
159 for (
size_t k = 0; k < j; ++k) s += L(j, k) * L(j, k);
160 L(j, j) = std::sqrt(A(j, j) - s);
161 for (
size_t i = j + 1; i < n; ++i) {
163 for (
size_t k = 0; k < j; ++k) s += L(i, k) * L(j, k);
164 L(i, j) = (A(i, j) - s) / L(j, j);
196inline Arr
inv(
const Arr& A) {
201 for (
size_t j = 0; j < n; ++j) {
202 for (
size_t i = 0; i < n; ++i) {
203 double s = (i == j) ? 1.0 : 0.0;
204 for (
size_t k = 0; k < i; ++k) s -= L(i, k) * Y(k, j);
205 Y(i, j) = s / L(i, i);
210 for (
size_t j = 0; j < n; ++j) {
211 for (
size_t i = n; i-- > 0;) {
213 for (
size_t k = i + 1; k < n; ++k) s -= L(k, i) * X(k, j);
214 X(i, j) = s / L(i, i);
229 static std::mt19937_64 rng(std::random_device{}());
246 std::normal_distribution<double> dist(0.0, 1.0);
248 for (
size_t i = 0; i < n; ++i) out(i) = dist(rng);
262inline std::pair<Arr, Arr>
meshgrid(
const Arr& x,
const Arr& y) {
267 for (
size_t i = 0; i < ny; ++i) {
268 for (
size_t j = 0; j < nx; ++j) {
286inline Arr
stack(
const Arr& a,
const Arr& b,
int = 0) {
287 assert(!a.is_2d() && !b.is_2d() && a.size() == b.size());
288 Arr out(2, a.size());
289 for (
size_t j = 0; j < a.size(); ++j) {
void random_seed(unsigned seed)
Seed the global random number generator.
Definition linalg.hpp:237
double norm(const Arr &a)
Compute the Frobenius norm of an array.
Definition linalg.hpp:77
double trace(const Arr &a)
Compute the trace of a square matrix (sum of diagonal elements).
Definition linalg.hpp:67
Arr flatten(const Arr &a)
Flatten a matrix or vector into a 1D array.
Definition linalg.hpp:40
Arr diagonal(const Arr &a)
Extract the diagonal of a square matrix.
Definition linalg.hpp:51
Arr cholesky(const Arr &A)
Cholesky decomposition: A = L * L^T for SPD matrices.
Definition linalg.hpp:153
std::pair< Arr, Arr > meshgrid(const Arr &x, const Arr &y)
Create 2D meshgrid arrays from 1D coordinate vectors.
Definition linalg.hpp:262
Arr matmul(const Arr &A, const Arr &B)
Multiply two matrices: A * B.
Definition linalg.hpp:107
Arr inv(const Arr &A)
Compute the inverse of a symmetric positive definite matrix via Cholesky.
Definition linalg.hpp:196
Arr transpose(const Arr &a)
Transpose a 2D matrix.
Definition linalg.hpp:27
std::mt19937_64 & global_rng()
Get the global Mersenne Twister random number generator.
Definition linalg.hpp:228
Arr randn(size_t n)
Generate a vector of standard normal random numbers.
Definition linalg.hpp:244
Arr stack(const Arr &a, const Arr &b, int=0)
Stack two 1D arrays as rows into a 2D matrix.
Definition linalg.hpp:286