digiKam
Loading...
Searching...
No Matches
matrixoperations.h
Go to the documentation of this file.
1/* ============================================================
2 *
3 * This file is a part of digiKam project
4 * https://www.digikam.org
5 *
6 * Date : 17-8-2016
7 * Description : Some matrix utility functions including singular value
8 * decomposition, inverse, and pseudo-inverse.
9 *
10 * SPDX-FileCopyrightText: 2016 by Omar Amin <Omar dot moh dot amin at gmail dot com>
11 * SPDX-FileCopyrightText: 2019 by Thanh Trung Dinh <dinhthanhtrung1996 at gmail dot com>
12 * SPDX-FileCopyrightText: 2016-2024 by Gilles Caulier <caulier dot gilles at gmail dot com>
13 *
14 * SPDX-License-Identifier: GPL-2.0-or-later
15 *
16 * ============================================================ */
17
18#pragma once
19
20// C++ includes
21
22#include <vector>
23#include <iostream>
24
25// Local includes
26
27#include "digikam_opencv.h"
28
29namespace Digikam
30{
31
32namespace MatrixOperations
33{
34
35std::vector<std::vector<float> > inv2(const std::vector<std::vector<float> >& mat);
36
37std::vector<std::vector<float> > pinv(const std::vector<std::vector<float> >& mat);
38
39void stdmattocvmat(const std::vector<std::vector<float> >& src, cv::Mat& dst);
40
41void cvmattostdmat(const cv::Mat& dst, std::vector<std::vector<float> >& src);
42
43template <typename T>
44inline T signdlib(const T& a, const T& b)
45{
46 if (b < 0)
47 {
48 return -std::abs(a);
49 }
50 else
51 {
52 return std::abs(a);
53 }
54}
55
56template <typename T>
57inline T pythag(const T& a, const T& b)
58{
59 T absa = std::abs(a);
60 T absb = std::abs(b);
61
62 if (absa > absb)
63 {
64 T val = absb/absa;
65 val *= val;
66
67 return (absa * std::sqrt(1.0F + val));
68 }
69 else
70 {
71 if (absb == 0.0)
72 {
73 return 0.0;
74 }
75 else
76 {
77 T val = absa/absb;
78 val *= val;
79
80 return (absb * std::sqrt(1.0F + val));
81 }
82 }
83}
84
85void transpose(const std::vector<std::vector<float> >& src,
86 std::vector<std::vector<float> >& dst);
87
88float trace(const std::vector<std::vector<float> >& src);
89
90bool svd3(std::vector<std::vector<float> >& a,
91 std::vector<float >& w,
92 std::vector<std::vector<float> >& v,
93 std::vector<float >& rv1);
94
95void svd(const std::vector<std::vector<float> >& m,
96 std::vector<std::vector<float> >& u,
97 std::vector<std::vector<float> >& w,
98 std::vector<std::vector<float> >& v);
99
100float determinant(const std::vector<std::vector<float> >& u);
101
102} // namespace MatrixOperations
103
104} // namespace Digikam
#define T
std::vector< std::vector< float > > pinv(const std::vector< std::vector< float > > &mat)
Definition matrixoperations.cpp:49
std::vector< std::vector< float > > inv2(const std::vector< std::vector< float > > &mat)
Definition matrixoperations.cpp:30
void cvmattostdmat(const cv::Mat &dst, std::vector< std::vector< float > > &src)
Definition matrixoperations.cpp:87
T pythag(const T &a, const T &b)
Definition matrixoperations.h:57
float trace(const std::vector< std::vector< float > > &src)
Definition matrixoperations.cpp:111
T signdlib(const T &a, const T &b)
Definition matrixoperations.h:44
float determinant(const std::vector< std::vector< float > > &u)
Definition matrixoperations.cpp:542
void stdmattocvmat(const std::vector< std::vector< float > > &src, cv::Mat &dst)
Definition matrixoperations.cpp:76
bool svd3(std::vector< std::vector< float > > &a, std::vector< float > &w, std::vector< std::vector< float > > &v, std::vector< float > &rv1)
Definition matrixoperations.cpp:129
void transpose(const std::vector< std::vector< float > > &src, std::vector< std::vector< float > > &dst)
Definition matrixoperations.cpp:98
void svd(const std::vector< std::vector< float > > &m, std::vector< std::vector< float > > &u, std::vector< std::vector< float > > &w, std::vector< std::vector< float > > &v)
Definition matrixoperations.cpp:495
Definition datefolderview.cpp:34