More reworks.

This commit is contained in:
Relintai 2023-02-07 22:10:16 +01:00
parent 3a297ae5d4
commit b39e0acdf8
3 changed files with 30 additions and 12 deletions

View File

@ -1073,7 +1073,7 @@ std::tuple<std::vector<std::vector<real_t>>, std::vector<std::vector<real_t>>> M
return { eigenvectors, a_new };
}
MLPPLinAlg::EigenResult MLPPLinAlg::eigen(std::vector<std::vector<real_t>> A) {
MLPPLinAlg::EigenResultOld MLPPLinAlg::eigen_old(std::vector<std::vector<real_t>> A) {
/*
A (the entered parameter) in most use cases will be X'X, XX', etc. and must be symmetric.
That simply means that 1) X' = X and 2) X is a square matrix. This function that computes the
@ -1191,7 +1191,7 @@ MLPPLinAlg::EigenResult MLPPLinAlg::eigen(std::vector<std::vector<real_t>> A) {
}
}
EigenResult res;
EigenResultOld res;
res.eigen_vectors = eigenvectors;
res.eigen_values = a_new;
@ -1199,8 +1199,8 @@ MLPPLinAlg::EigenResult MLPPLinAlg::eigen(std::vector<std::vector<real_t>> A) {
}
MLPPLinAlg::SDVResultOld MLPPLinAlg::SVD(std::vector<std::vector<real_t>> A) {
EigenResult left_eigen = eigen(matmult(A, transpose(A)));
EigenResult right_eigen = eigen(matmult(transpose(A), A));
EigenResultOld left_eigen = eigen_old(matmult(A, transpose(A)));
EigenResultOld right_eigen = eigen_old(matmult(transpose(A), A));
std::vector<std::vector<real_t>> singularvals = sqrt(left_eigen.eigen_values);
std::vector<std::vector<real_t>> sigma = zeromat(A.size(), A[0].size());
@ -1218,9 +1218,10 @@ MLPPLinAlg::SDVResultOld MLPPLinAlg::SVD(std::vector<std::vector<real_t>> A) {
return res;
}
MLPPLinAlg::SDVResultOld MLPPLinAlg::svd(std::vector<std::vector<real_t>> A) {
EigenResult left_eigen = eigen(matmult(A, transpose(A)));
EigenResult right_eigen = eigen(matmult(transpose(A), A));
MLPPLinAlg::SDVResult MLPPLinAlg::svd(const Ref<MLPPMatrix> &A) {
/*
EigenResultOld left_eigen = eigen(matmult(A, transpose(A)));
EigenResultOld right_eigen = eigen(matmult(transpose(A), A));
std::vector<std::vector<real_t>> singularvals = sqrt(left_eigen.eigen_values);
std::vector<std::vector<real_t>> sigma = zeromat(A.size(), A[0].size());
@ -1230,12 +1231,15 @@ MLPPLinAlg::SDVResultOld MLPPLinAlg::svd(std::vector<std::vector<real_t>> A) {
}
}
SDVResultOld res;
SDVResult res;
res.U = left_eigen.eigen_vectors;
res.S = sigma;
res.Vt = right_eigen.eigen_vectors;
return res;
*/
return SDVResult();
}
std::vector<real_t> MLPPLinAlg::vectorProjection(std::vector<real_t> a, std::vector<real_t> b) {

View File

@ -114,13 +114,21 @@ public:
std::tuple<std::vector<std::vector<real_t>>, std::vector<std::vector<real_t>>> eig(std::vector<std::vector<real_t>> A);
struct EigenResult {
struct EigenResultOld {
std::vector<std::vector<real_t>> eigen_vectors;
std::vector<std::vector<real_t>> eigen_values;
};
EigenResult eigen(std::vector<std::vector<real_t>> A);
EigenResultOld eigen_old(std::vector<std::vector<real_t>> A);
/*
struct EigenResult {
Ref<MLPPMatrix> eigen_vectors;
Ref<MLPPMatrix> eigen_values;
};
EigenResult eigen(const Ref<MLPPMatrix> &A);
*/
struct SDVResultOld {
std::vector<std::vector<real_t>> U;
std::vector<std::vector<real_t>> S;
@ -129,7 +137,13 @@ public:
SDVResultOld SVD(std::vector<std::vector<real_t>> A);
SDVResultOld svd(std::vector<std::vector<real_t>> A);
struct SDVResult {
Ref<MLPPMatrix> U;
Ref<MLPPMatrix> S;
Ref<MLPPMatrix> Vt;
};
SDVResult svd(const Ref<MLPPMatrix> &A);
std::vector<real_t> vectorProjection(std::vector<real_t> a, std::vector<real_t> b);

View File

@ -711,7 +711,7 @@ void MLPPTests::test_pca_svd_eigenvalues_eigenvectors(bool ui) {
// PCA, SVD, eigenvalues & eigenvectors
std::vector<std::vector<real_t>> inputSet = { { 1, 1 }, { 1, 1 } };
MLPPLinAlg::EigenResult eigen = alg.eigen(inputSet);
MLPPLinAlg::EigenResultOld eigen = alg.eigen_old(inputSet);
std::cout << "Eigenvectors:" << std::endl;
alg.printMatrix(eigen.eigen_vectors);