From 795617f3fdd06fdd67edb15603406e37371c20be Mon Sep 17 00:00:00 2001 From: Bausager Date: Fri, 29 Aug 2025 18:02:31 +0200 Subject: [PATCH] testing --- .gitattributes | 2 - .gitignore | 34 ------- bin/abc_lab | Bin 0 -> 26744 bytes include/utils/matrix.h | 226 ++++++++++++++++++++++++++++++----------- include/utils/utils.h | 5 + include/utils/vector.h | 31 ++++++ obj/main.o | Bin 0 -> 39216 bytes src/main.cpp | 43 ++++---- 8 files changed, 230 insertions(+), 111 deletions(-) delete mode 100644 .gitattributes delete mode 100644 .gitignore create mode 100755 bin/abc_lab create mode 100644 include/utils/utils.h create mode 100644 obj/main.o diff --git a/.gitattributes b/.gitattributes deleted file mode 100644 index a1ffb1c..0000000 --- a/.gitattributes +++ /dev/null @@ -1,2 +0,0 @@ -*.psd filter=lfs diff=lfs merge=lfs -text -*.zip filter=lfs diff=lfs merge=lfs -text diff --git a/.gitignore b/.gitignore deleted file mode 100644 index e257658..0000000 --- a/.gitignore +++ /dev/null @@ -1,34 +0,0 @@ -# ---> C++ -# Prerequisites -*.d - -# Compiled Object files -*.slo -*.lo -*.o -*.obj - -# Precompiled Headers -*.gch -*.pch - -# Compiled Dynamic libraries -*.so -*.dylib -*.dll - -# Fortran module files -*.mod -*.smod - -# Compiled Static libraries -*.lai -*.la -*.a -*.lib - -# Executables -*.exe -*.out -*.app - diff --git a/bin/abc_lab b/bin/abc_lab new file mode 100755 index 0000000000000000000000000000000000000000..b3f8948c929b83deae3b72953880b44b6488ff01 GIT binary patch literal 26744 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Ð%InarDj4S@6U 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 struct Matrix{ - utils::vector m; + utils::Vector m; + using vector_type = typename decltype(std::declval().v)::value_type; - void fill(uint64_t rows, uint64_t cols, const vector_type num){ + // Constructor to initialize matrix with rows × cols and a fill value + Matrix(uint64_t rows, uint64_t cols, typename T::value_type value = {}) { + fill(rows, cols, value); + } + + Matrix() = default; // Default constructor + + T& operator[](uint64_t idx) { return m[idx]; } // Makes it able to do matr[1][1] + const T& operator[](uint64_t idx) const { return m[idx]; } // Makes it able to do matr[1][1] + + + void fill(uint64_t rows, uint64_t cols, const vector_type num=0){ m.clear(); for (uint64_t i = 0; i < rows; i++){ T temp_vec; @@ -30,22 +42,7 @@ namespace utils{ } } - void disturbance(const double min, const double max){ - - uint64_t rows = m.size(); - uint64_t cols = m[0].v.size(); - - std::mt19937_64 rng{}; - rng.seed( std::random_device{}()); - - for (uint64_t i = 0; i < rows; i++){ - for (uint64_t j = 0; j < cols; j++){ - m[i].v[j] *= std::uniform_real_distribution<>{min, max}(rng); - } - } - } - - void fill_RNG(const uint64_t rows, const uint64_t cols, const double min, const double max){ + void fill_RNG(const uint64_t rows, const uint64_t cols, const vector_type min = 0, const vector_type max = 1){ m.clear(); std::mt19937_64 rng{}; @@ -60,6 +57,7 @@ namespace utils{ } } + inline friend std::ostream& operator << (std::ostream& out, const Matrix& mat){ out << "["; for (uint64_t i = 0; i < mat.m.size(); i++){ @@ -79,9 +77,12 @@ namespace utils{ out << "]"; return out; } + void print() const{ + std::cout << *this << std::endl; + } - void transpose(){ - std::vector temp_m = m; + void inplace_transpose(){ + utils::Vector temp_m = m; m.clear(); uint64_t rows = temp_m.size(); @@ -95,47 +96,158 @@ namespace utils{ m.push_back(temp_vec); } } - }; + Matrix transpose()const{ + Matrix copy = *this; + copy.inplace_transpose(); + return copy; + } + + void inplace_inverse(std::string method = "Gauss-Jordan"){ + //Matrix temp_m = *this; // Copies the m into temp_m correctly (Before: utils::Vector temp_m = m;) + if (method == "Gauss-Jordan"){ + Matrix temp_m(m.v.size(),m[0].v.size(),0); + + //std::cout << temp_m.m.v[0].size() << std::endl; + //std::cout << m.v.size() << std::endl; + + uint64_t icol,irow,N=m.v.size(),M=temp_m.m.v[0].size(); + double big,dum,pivinv; + Vi indxc(N,0),indxr(N,0),ipiv(N,0); + + //for (uint64_t j = 0; j < N; ++j){ ipiv[j] = 0;} + for (uint64_t i = 0; i < N; i++){ + big=0.0; + for (uint64_t j = 0; j < N; j++){ + if (ipiv[j] != 1){ + for (uint64_t k = 0; k < N; k++){ + if (ipiv[k] == 0){ + if (abs(m[j].v[k]) >= big){ + big = abs(m[j].v[k]); + irow = j; + icol = k; + } + } + } + } + } + ipiv[icol]++; + if (irow != icol){ + for (uint64_t l = 0; l < N; l++){ // SWAP + double temp = m[irow].v[l]; + m[irow].v[l] = m[icol].v[l]; + m[icol].v[l] = temp; + } + for (uint64_t l = 0; l < M; l++){ // SWAP temp matrix + double temp = temp_m.m[irow].v[l]; + temp_m.m[irow].v[l] = temp_m.m[icol].v[l]; + temp_m.m[icol].v[l] = temp; + } + } + + indxr[i] = irow; + indxc[i] = icol; + if (m[icol].v[icol] == 0.0){ + throw std::runtime_error("utill:Matrix.Gauss-Jordan - Singular Matrix"); + } + pivinv= 1.0/m[icol].v[icol]; + m[icol].v[icol]=1.0; + for (uint64_t l = 0; l < N; l++){ + m[icol].v[l] *= pivinv; + } + for (uint64_t l = 0; l < M; l++){ + temp_m.m[icol].v[l] *= pivinv; + } + for (uint64_t ll = 0; ll < N; ll++){ + if (ll != icol){ + dum = m[ll].v[icol]; + m[ll].v[icol] = 0; + for (uint64_t l = 0; l < N; l++){ + m[ll].v[l] -= m[icol].v[l]*dum; + } + for (uint64_t l = 0; l < N; l++){ + temp_m.m[ll].v[l] -= temp_m.m[icol].v[l]*dum; + } + } + } + + } + //m = temp_m; + for (int64_t l = N-1; l >= 0; l--){ + if (indxr[l] != indxc[l]){ + for (uint64_t k = 0; k < N; k++){ + double temp = m[k].v[indxr[l]]; + m[k].v[indxr[l]] = m[k].v[indxc[l]]; + m[k].v[indxc[l]] = temp; + } + } + } + } + else{ + throw std::runtime_error("utill:Matrix." + method + " - Not implemented yet \r \nImplemented: 'Gauss-Jordan',"); + } + } + Matrix inverse(std::string method = "Gauss-Jordan")const{ + Matrix copy = *this; + copy.inplace_inverse(method); + return copy; + } + + utils::Vector vecmult(const utils::Vector& Vec)const{ + + if (m[0].size() != Vec.size()){ + throw std::runtime_error("utill:Matrix.vecmult - Dimentions does not fit"); + } + + // Create a temporary result vector + utils::Vector copy(Vec.size(), 0); + + + for (uint64_t i = 0; i < m.size(); ++i) { + for (uint64_t j = 0; j < m[0].size(); ++j) { + copy[i] += m[i][j] * Vec[j]; + } + } + return copy; + } + + + void inplace_matmult(const Matrix& Mat){ + + if (m.v[0].size() != Mat.m.v.size()){ + throw std::runtime_error("utill:Matrix.matmult - Dimentions does not fit"); + } + + // Dimensions of the result + uint64_t rows = m.v.size(); // rows in *this + uint64_t cols = Mat.m[0].v.size(); // columns in Mat + uint64_t inner = m.v[0].size(); // shared dimension + + // Create a temporary result matrix + Matrix temp_m(rows, cols, 0); + + // Perform matrix multiplication + for (uint64_t i = 0; i < rows; i++){ + for (uint64_t j = 0; j < cols; j++){ + for (uint64_t k = 0; k < inner; k++){ + temp_m.m[i].v[j] += m[i].v[k] * Mat.m[k].v[j]; + } + } + } + *this = temp_m; + } + Matrix matmult(const Matrix& Mat)const{ + Matrix copy = *this; + copy.inplace_matmult(Mat); + return copy; + } + + + }; typedef Matrix Mi; typedef Matrix Mf; typedef Matrix Md; - - //####################################### - //# UTILITY FUNCTIONS FOR MATRIX # - //####################################### - Md matrix_dot(const Md& M, const Md& N); - Md matrix_add_vector(const Md& M, const Vd& vect, bool axis); - Md matrix_add_matrix(const Md& M, const Md& N); - Md matrix_sub_vector(const Md& M, const Vd& vect, bool axis); - - Md matrix_max_cap(const Md& M, const double value); - Md matrix_min_cap(const Md& M, const double value); - - Md matrix_clip(const Md& M, const double min_value, const double max_value); - Vd matrix_get_max(const Md& M, bool axis); - Vd matrix_get_min(const Md& M, bool axis); - - Vd matrix_get_sum(const Md& M, bool axis); - - Md matrix_normalize(const Md& M, bool axis); - Md matrix_exp(const Md& M); - Vd matrix_argmax(const Md& M); - Md matrix_transpose(const Md& M); - double matrix_determinant(const Md& M); - Md matrix_cofactor(const Md& M); - Md matrix_inverse(const Md& M); - Md matrix_scalar_element_wise_division(const Md& M, const double& C); - Md matrix_element_wise_division(const Md& M, const Md& N); - Md matrix_sign(const Md& M); - - - - - - - - double random(const double& min, const double& max); + } diff --git a/include/utils/utils.h b/include/utils/utils.h new file mode 100644 index 0000000..cfd11c5 --- /dev/null +++ b/include/utils/utils.h @@ -0,0 +1,5 @@ +// "./utils/utils.h" +#pragma once + +#include "./utils/vector.h" +#include "./utils/matrix.h" diff --git a/include/utils/vector.h b/include/utils/vector.h index 6107fc7..80ad505 100644 --- a/include/utils/vector.h +++ b/include/utils/vector.h @@ -12,8 +12,23 @@ namespace utils{ //####################################### template struct Vector{ + + using value_type = T; std::vector v; + Vector() = default; + + Vector(uint64_t size, T value = T()) { + v.resize(size, value); + } + + + void clear(){v.clear();} + void push_back(const T& val) { v.push_back(val); } + T& operator[](uint64_t idx) { return v[idx]; } + const T& operator[](uint64_t idx) const { return v[idx]; } + uint64_t size() const { return v.size(); } + void fill(const uint64_t size, const T num){ v.clear(); for (uint64_t i = 0; i < size; i++) @@ -93,6 +108,22 @@ namespace utils{ void print() const{ std::cout << *this << std::endl; } + + void linspace(const T start, const T stop, const T num){ + v.clear(); + + if (num > 1){ + + double delta = (stop - start)/(num - 1); + + for (uint64_t i = 0; i < num; i++){ + v.push_back(static_cast(start + delta * i)); + } + //v.push_back(static_cast(stop)); + } + + + } }; typedef Vector Vi; diff --git a/obj/main.o b/obj/main.o new file mode 100644 index 0000000000000000000000000000000000000000..c3f0dab3fa0817fcceaeb67f7302ef2165fca2d1 GIT binary patch literal 39216 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 q?hCFQ9*C^ zOT@Nb;Bx;XoCb|ECB4 zSAk3W<+>*4vH2eQKNh%*TeE*8J0&jtNnc-0yQKfO3H$;fpS~&^dbz$!e3794ilCSK zqQ?YYDd@KgT-x)vz@>lwT;M+c$o1k0L7zpL68UEbF4L~N2}B}X_RA85YMf%j&@U7C zlLD9Wzb5dD1pQ8d%k@{{Ne{hTm!A@HpFc(*65-N6(-a!Vuk+xtAD;(}k)ILtF9=-vfxfyM zdWnBq;7vk~^k=ugza!{nf6*LeA6S+*;2$u;ziOZB7<}%@JTvizwjzlno4;c{oRDqu?@RYz$ z5%`S)Cpo8bU5CI8MpbF zpsx}5WPvvd{0xEj2>eWe4-5Q{1ink)W~@>5et~~P(2olIY=KvBkWsaHwxa480yi;C z_%eZ;wTbY8z&}a=r-uc8o&k}+An;0o|6Jhb3;h2Iyh`AcX~IAv`#+{i`p*o3PZ9Vv z0;f1JzPnA}7YKT@pCS1d3VgeuH*-E!j|hCKpg$<^iv=DWr*BC9B?7M$_@x4`6S&y} zP<2+|mkav!0zb3RqSCGc87KanRRvfs?rR6RxDW^E#Tp1{o>gYc}t zXA;0^lfcayN>w`rZk~k+-zV_d1aLYe@HqxVK8Ytyvj5`(pDOUH1fCN3)dF87@M{FV zS>Wawld7KG<3aB=Ri>mY8x+&v2^*5!5EE> zLoMdO$}vdPxfffx>tlHAAW$e&%_HMH3uBm?3Z8S935Qx zX_T?_e<0^{LW@g3DT29GA4@GZG=8W8Q)lc1O)*bwJcNg7is>RFKj?Ec#d^HUnRUd* z=CT4wonOElua7AeotFvy{yvWA6ls6|$8U? zI#yFe3Bo`4gpF~G>zqwg2bVdI%GhT7r=6OKOe^tlOp(QK@dtlSrbvT2ggoA(G8QK} zJvtvlhf4myQ!}>Q@g1NsE>=S(9*E``jUm%-ddUKu?NPs-`8dqxx9Caj0(X?(EEU;mH$cc5~JE7xOMx zKU?5?{A8xOC*O@9Mikca{E}OhZp&xz1BU9A`R=|R`H1^|%72BIlk)wckyXb9eyk3@ zkNcZ&@#~>5_wlEg-@HR5{u@f*H{UZP|H2aZTR=-m@;Bgqy!Lk}?qdE$CGht<_!pPJ zzuv)5-weiU|FDC}5Y4*nZU;NR)sUs(b_efyv!`)?KQ$J_o9Vn&kjyA=21<=>~c zi}~rB%6R$rGrzQ-zP*f>|5pzE`4afwa_BFVz(4BX?<;}-T?hY~68I*?)AtXT1Cs4*su{z<;iTe|ri1Q<-1-@39j2YaIIN zoYZ*Rf3<`E@e=q`4*up6_?J2OpD2O9h54obc9g)s%E7<01pXd}{dB%*y#D`;L;p8Q z;9u|1|8xob!w&vuO5oq-;D5FR{+$l~T_y0p!2GiRpDTg?We5MaO5oq?u>biI`1d>X z(=*L@>_h4O1D!80@np`^TnLP0vO1J>I%)%q+xjm9PBLxs@$%P# zSGAx0#cBe>FV9#}ovokFWDsVt2j<^buS1-A>`cFvjDjAzg3Z% zuNjP=$^Z4ZjDCaDGl5IL`FGpT(_+HEmYQH4YFzqT9Qx_~k*%NRB$xh2x&345H*|)_>5Wf7S__QJ#q-#BTpDJ^J^t{uV7pwf{DhZT$%dgowb7 zzdY-o#{4F;^lIJB#^?&Y(gT$cxfnd+e`s*xw3H+kRTOUHY$QLV3oM6x;g$pGW_4)-T6z z&Y}NukN!2Re=jK&iENc=D)?Rfw~6(e{S)=yN?a^9JWovjpA}d8uR2j{k!O7gvGq53 z^!L+Zk0j%#9rw2WyFL2bSpRAzCHiCgf3-*dFzc88ztf@r>mL2TV*Pgf+U@_}9{&Hs z{BK95tCDU1n;!c|*#4c&PyN@0%l6;7=zLfI9pE2FT*Uk)v-N+%!ykM|b4)ReoZI|a z5C0VApEU-58vOV#sIvsGqK}10GJf*7x7+`)M?d}htdu^iv+%Foe?Ro_cQXH2{XYro ztjquFn7=X9tP55%g9P|p?O(_3m+?zu!ES%GNB@40|Lyi)?9so=p`X@bTmNky{m1i* zJA3`I^*`g`Ka=^*zh7+JX#4LekNpSP{uYccN;H1%#%0@2`xICIZL1(I{M+L?3;){s zZ}#wipZU$dgKPxY{7b>_>i;_WSd3)8gOUCB(mjDlW?T$;^zS)M)6w&tOt$`w9{nkL zSU{5Tw+{EV{^vdVPvwC#pM;1M>wk~_euw`1A;;EF|Gu}Y|CX_SdghYJZvUC!clm!O z>o%Y;X|8drD&wqCN8$9|)9Qrpp^l$X&KfwAq3teEh|EC`QUo+#)A*U|b z_Wz~F{sU}(iuuWZgSc$}(Z74{>c8uG;=YjiO=jEw5%9bEud-2d$oL&{=udj|uVVdI z7{#31?Qiq&Kf?TD^?$}=eHd|F-?#_2^&a@ZYdQe>wI! zuKxSTWNoLtf423X1b$clJ?d!xLk|5pkN(B1|2}O-_}A9o;?cj$(f)@W`oHMWzn}Gw zHU9p}!~Z7p-w|4_3wHef#AE+Kwm-%EH2xmJWyjBPC%OBt;S9~VlKD+$`;UHv>*~L$ z{Nkg98A(6=I|#P^Yd!j3VEvafzsc{+gv)agETw)1iN>NB>={pPpG| zvh@#p^tZ77erBfje;t?I{?|PE53zn8#-R!J{PB+-{(oowvBuBjQ{4Su&J)jA@mCIh zm;VoN`{n%gjHCVYJ^JgIk%vLpe%t?f5C2W$w7=71|ER)#Ywt_!yP zJ3RU)HEDVozt21LpLD9H|M(vz7;FD`9Qa-RH=Fg#{(I4(|4!CV?~!GyWBn%HO`Uz; z=F#8i(El9>G5p4^M_9k{lhKo6{g)YlbK`%LZ)bjsEGRI)jT=6L?*cy_A!6@U`L7%`4xwRg9`re^9I@{lkNZi0N{Gq A(f|Me literal 0 HcmV?d00001 diff --git a/src/main.cpp b/src/main.cpp index aff6e42..dd0c4b5 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -1,4 +1,4 @@ -#include "./utils/vector.h" +#include "./utils/utils.h" #include #include @@ -8,26 +8,33 @@ int main(int argc, char const *argv[]) { - utils::Vd vect; - vect.fill_RNG(3, 0, 42); - vect.print(); + utils::Vd vect1, vect2; + vect1.linspace(1, 3.14159, 11); + vect1.print(); + //std::cout << vect[1] << std::endl; - utils::Md matr; - /*matrix2.fill(2, 2, 0); - matrix2.m[0].v[0] = 3; - matrix2.m[0].v[1] = 3.5; + /* + utils::Md matr1, matr2, matr3; + matr1.fill_RNG(3,3); + matr2 = matr1.inverse("Gauss-Jordan"); + matr3 = matr1.matmult(matr2); + // + matr1.print(); + std::cout << "======" << std::endl; + matr2.print(); + std::cout << "======" << std::endl; + matr3.print(); + std::cout << "======" << std::endl; + matr1.matmult(matr2).print(); - matrix2.m[1].v[0] = 3.2; - matrix2.m[1].v[1] = 3.6; - - - std::cout << matrix2 << std::endl << std::endl; - numeric::Md det; - det = numeric::matrix_inverse(matrix2); - std::cout << det << std::endl << std::endl; - -*/ + std::cout << "---------" << std::endl; + utils::Md matr4(2,3,2); + vect2 = matr4.vecmult(vect1); + matr4.inplace_transpose(); + matr4.transpose(); + //result.print(); + */ return 0;