21#ifndef JKQTPLINALGTOOLS_H_INCLUDED
22#define JKQTPLINALGTOOLS_H_INCLUDED
38#include "jkqtmath/jkqtmath_imexport.h"
39#include "jkqtmath/jkqtparraytools.h"
40#include "jkqtcommon/jkqtpmathtools.h"
41#include "jkqtcommon/jkqtpstringtools.h"
48#ifndef JKQTP_ALIGNMENT_BYTES
49#define JKQTP_ALIGNMENT_BYTES 32
53#ifdef JKQTP_STATISTICS_TOOLS_MAY_USE_EIGEN3
56# include <Eigen/Jacobi>
79#define jkqtplinalgMatIndex(l,c,C) ((l)*(C)+(c))
95 for (
long l=0; l<L; l++) {
96 for (
long c=0; c<C; c++) {
97 if (c>0) std::cout<<
", ";
98 std::cout.precision(precision);
99 std::cout.width(width);
103 std::cout<<std::endl;
121inline std::string
jkqtplinalgMatrixToString(T* matrix,
long L,
long C,
int width=9,
int precision=3,
const std::string& mode=std::string(
"g")) {
123 std::ostringstream ost;
124 for (
long l=0; l<L; l++) {
125 for (
long c=0; c<C; c++) {
153 const double fval=fabs(val);
154 if (val<0 && val>=-1) {
155 r=jkqtp_boundedRoundTo<uint8_t>(0,255.0-fval*127.0,255);
156 g=jkqtp_boundedRoundTo<uint8_t>(0,255.0-fval*127.0,255);
157 }
else if (val>0 && val<=1) {
158 b=jkqtp_boundedRoundTo<uint8_t>(0,255.0-fval*127.0,255);
159 g=jkqtp_boundedRoundTo<uint8_t>(0,255.0-fval*127.0,255);
211inline std::string
jkqtplinalgMatrixToHTMLString(T* matrix,
long L,
long C,
int width=9,
int precision=3,
const std::string& mode=std::string(
"g"),
const std::string& tableformat=std::string(),
const std::string& prenumber=std::string(),
const std::string& postnumber=std::string(),
bool colorcoding=
false,
bool zeroIsWhite=
true, std::string* colorlabel=
nullptr,
bool nonlinColors=
false,
double nonlinColorsGamma=0.25,
const std::string& colortableformat=std::string()) {
212 std::ostringstream ost;
213 ost<<
"<table "<<tableformat<<
">\n";
215 double minv=0, maxv=0;
219 for (
long l=0; l<L; l++) {
221 for (
long c=0; c<C; c++) {
226 uint8_t r=255,g=255,b=255;
228 if (val<0) valrel=-1.0*fabs(val/minv);
229 if (val>0) valrel=fabs(val/maxv);
231 valrel=((val-minv)/(maxv-minv)-0.5)*2.0;
239 snprintf(buf, 500,
" bgcolor=\"#%02X%02X%02X\"",
int(r),
int(g),
int(b));
242 ost<<
"<td align=\"center\" valign=\"middle\" width=\""<<(100.0/double(C))<<
"%\" "<<cols<<
"><nobr>";
243 ost.precision(precision);
246 snprintf(buf, 500, format.c_str(), val);
247 ost<<prenumber<<buf<<postnumber;
254 if (colorcoding && colorlabel) {
256 uint8_t rm=255,gm=255,bm=255;
257 uint8_t rmc=255,gmc=255,bmc=255;
258 uint8_t rc=255,gc=255,bc=255;
259 uint8_t rcp=255,gcp=255,bcp=255;
260 uint8_t rp=255,gp=255,bp=255;
280 snprintf(buf, 8192,
"<table %s cellpadding=\"2\" cellspacing=\"0\" border=\"1\"><tr><td><table width=\"100%%\" cellpadding=\"3\" cellspacing=\"0\" border=\"0\"><tr>"
281 "<td bgcolor=\"#%02X%02X%02X\" width=\"20%%\"><nobr> %9.3lg </nobr></td>"
282 "<td bgcolor=\"#%02X%02X%02X\" width=\"20%%\"><nobr> — </nobr></td>"
283 "<td bgcolor=\"#%02X%02X%02X\" width=\"20%%\"><nobr> %9.3lg </nobr></td>"
284 "<td bgcolor=\"#%02X%02X%02X\" width=\"20%%\"><nobr> — </nobr></td>"
285 "<td bgcolor=\"#%02X%02X%02X\" width=\"20%%\"><nobr> %9.3lg </nobr></td>"
286 "</tr></table></td></tr></table>", colortableformat.c_str(),
int(rm),
int(gm),
int(bm), vm,
int(rmc),
int(gmc),
int(bmc),
int(rc),
int(gc),
int(bc), vc,
int(rcp),
int(gcp),
int(bcp),
int(rp),
int(gp),
int(bp), vp);
287 (*colorlabel)=std::string(buf);
303 for (
long l=0; l<N; l++) {
304 res=res+vec1[l]*vec2[l];
320 for (
long l=0; l<N; l++) {
321 for (
long c=l+1; c<N; c++) {
341 for (
long l=0; l<L; l++) {
342 for (
long c=0; c<C; c++) {
359 for (
long c=0; c<C; c++) {
381 for (
long l=0; l<L1; l++) {
382 for (
long c=0; c<C2; c++) {
384 for (
long i=0; i<C1; i++) {
390 }
else if (M1==M && M2!=M) {
393 }
else if (M1!=M && M2==M) {
396 }
else if (M1==M && M2==M) {
443 for (
long k=0; k<N-1; k++) {
447 for (
long ks=k+1; ks<N; ks++) {
451 }
else if (ks==N-1) {
461 for (
long i=k+1; i<N; i++) {
463 for (
long c=k; c<C; c++) {
475 for (
long k=0; k<N; k++) {
480 if (fabs(det)<DBL_MIN*10.0)
return false;
488 for (
long k=N-1; k>0; k--) {
490 for (
long i=k-1; i>=0; i--) {
492 for (
long c=k; c<C; c++) {
500 for (
long k=0; k<N; k++) {
503 for (
long c=N; c<C; c++) {
537#ifdef JKQTP_STATISTICS_TOOLS_MAY_USE_EIGEN3
539 Eigen::Map<const Eigen::Matrix<T,2,2,Eigen::RowMajor> > eA(matrix);
540 Eigen::Map<Eigen::Matrix<T,2,2,Eigen::RowMajor> > eO(matrix_out);
543 return eO.allFinite();
545 Eigen::Map<const Eigen::Matrix<T,3,3,Eigen::RowMajor> > eA(matrix);
546 Eigen::Map<Eigen::Matrix<T,3,3,Eigen::RowMajor> > eO(matrix_out);
549 return eO.allFinite();
551 Eigen::Map<const Eigen::Matrix<T,4,4,Eigen::RowMajor> > eA(matrix);
552 Eigen::Map<Eigen::Matrix<T,4,4,Eigen::RowMajor> > eO(matrix_out);
555 return eO.allFinite();
557 Eigen::Map<const Eigen::Matrix<T,Eigen::Dynamic,Eigen::Dynamic,Eigen::RowMajor> > eA(matrix,N,N);
558 Eigen::Map<Eigen::Matrix<T,Eigen::Dynamic,Eigen::Dynamic,Eigen::RowMajor> > eO(matrix_out,N,N);
561 return eO.allFinite();
571 const long msize=N*N*2;
574 for (
long i=0; i<msize; i++) m[i]=T(0);
575 for (
long l=0; l<N; l++) {
576 for (
long c=0; c<N; c++) {
588 for (
long k=0; k<N; k++) {
589 for (
long c=N; c<2*N; c++) {
632#if defined(JKQTP_STATISTICS_TOOLS_MAY_USE_EIGEN3) && (!defined(STATISTICS_TOOLS_linalgLinSolve_EIGENMETHOD_noeigen))
634 Eigen::Map<const Eigen::Matrix<T,2,2,Eigen::RowMajor> > eA(A);
635 Eigen::Matrix<T,2,1> eB;
636 Eigen::Map<Eigen::Matrix<T,2,1> > x(result_out);
638 eB=Eigen::Map<const Eigen::Matrix<T,Eigen::Dynamic,Eigen::Dynamic,Eigen::RowMajor> >(B,2,1);
639# ifdef STATISTICS_TOOLS_linalgLinSolve_EIGENMETHOD_fullPivLu
640 x=eA.fullPivLu().solve(eB);
641# elif defined(STATISTICS_TOOLS_linalgLinSolve_EIGENMETHOD_householderQr)
642 x=eA.householderQr().solve(eB);
643# elif defined(STATISTICS_TOOLS_linalgLinSolve_EIGENMETHOD_fullPivHouseholderQr)
644 x=eA.fullPivHouseholderQr().solve(eB);
645# elif defined(STATISTICS_TOOLS_linalgLinSolve_EIGENMETHOD_jacobiSvd)
646 x=eA.jacobiSVD().solve(eB);
647# elif defined(STATISTICS_TOOLS_linalgLinSolve_EIGENMETHOD_colPivHouseholderQr)
648 x=eA.colPivHouseholderQr().solve(eB);
650 x=eA.fullPivLu().solve(eB);
652 }
else if (N==3 && C==1) {
653 Eigen::Map<const Eigen::Matrix<T,3,3,Eigen::RowMajor> > eA(A);
654 Eigen::Matrix<T,3,1> eB;
655 Eigen::Map<Eigen::Matrix<T,3,1> > x(result_out);
657 eB=Eigen::Map<const Eigen::Matrix<T,Eigen::Dynamic,Eigen::Dynamic,Eigen::RowMajor> >(B,3,1);
659# ifdef STATISTICS_TOOLS_linalgLinSolve_EIGENMETHOD_fullPivLu
660 x=eA.fullPivLu().solve(eB);
661# elif defined(STATISTICS_TOOLS_linalgLinSolve_EIGENMETHOD_householderQr)
662 x=eA.householderQr().solve(eB);
663# elif defined(STATISTICS_TOOLS_linalgLinSolve_EIGENMETHOD_fullPivHouseholderQr)
664 x=eA.fullPivHouseholderQr().solve(eB);
665# elif defined(STATISTICS_TOOLS_linalgLinSolve_EIGENMETHOD_jacobiSvd)
666 x=eA.jacobiSVD().solve(eB);
667# elif defined(STATISTICS_TOOLS_linalgLinSolve_EIGENMETHOD_colPivHouseholderQr)
668 x=eA.colPivHouseholderQr().solve(eB);
670 x=eA.fullPivLu().solve(eB);
673 Eigen::Map<const Eigen::Matrix<T,Eigen::Dynamic,Eigen::Dynamic,Eigen::RowMajor> > eA(A,N,N);
674 Eigen::Matrix<T,Eigen::Dynamic,Eigen::Dynamic,Eigen::RowMajor> eB(N,C);
675 Eigen::Map<Eigen::Matrix<T,Eigen::Dynamic,Eigen::Dynamic,Eigen::RowMajor> > x(result_out,N,C);
677 eB=Eigen::Map<const Eigen::Matrix<T,Eigen::Dynamic,Eigen::Dynamic,Eigen::RowMajor> >(B,N,C);
679# ifdef STATISTICS_TOOLS_linalgLinSolve_EIGENMETHOD_fullPivLu
680 x=eA.fullPivLu().solve(eB);
681# elif defined(STATISTICS_TOOLS_linalgLinSolve_EIGENMETHOD_householderQr)
682 x=eA.householderQr().solve(eB);
683# elif defined(STATISTICS_TOOLS_linalgLinSolve_EIGENMETHOD_fullPivHouseholderQr)
684 x=eA.fullPivHouseholderQr().solve(eB);
685# elif defined(STATISTICS_TOOLS_linalgLinSolve_EIGENMETHOD_jacobiSvd)
686 x=eA.jacobiSVD().solve(eB);
687# elif defined(STATISTICS_TOOLS_linalgLinSolve_EIGENMETHOD_colPivHouseholderQr)
688 x=eA.colPivHouseholderQr().solve(eB);
690 x=eA.fullPivLu().solve(eB);
704 const long msize=N*(N+C);
706 for (
long l=0; l<N; l++) {
707 for (
long c=0; c<N; c++) {
711 for (
long c=0; c<C; c++) {
720 for (
long k=0; k<N; k++) {
721 for (
long c=N; c<(N+C); c++) {
731 for (
long k=0; k<N; k++) {
732 for (
long c=N; c<(N+C); c++) {
809#ifdef JKQTP_STATISTICS_TOOLS_MAY_USE_EIGEN3
817 Eigen::Map<const Eigen::Matrix<T,3,3,Eigen::RowMajor> > eA(a);
818 return eA.determinant();
820 Eigen::Map<const Eigen::Matrix<T,4,4,Eigen::RowMajor> > eA(a);
821 return eA.determinant();
823 Eigen::Map<const Eigen::Matrix<T,Eigen::Dynamic,Eigen::Dynamic,Eigen::RowMajor> > eA(a,N,N);
824 return eA.determinant();
838 for (j1=0;j1<N;j1++) {
this class ensures that the given pointer is freed when the class is destroyed.
Definition jkqtparraytools.h:108
T * data() const
Definition jkqtparraytools.h:138