Add eigs function.
This commit is contained in:
@@ -11,8 +11,48 @@
|
|||||||
#include <iostream>
|
#include <iostream>
|
||||||
#include <vector>
|
#include <vector>
|
||||||
|
|
||||||
|
#include <Eigen/Sparse>
|
||||||
|
#include <Spectra/GenEigsSolver.h>
|
||||||
|
#include <Spectra/MatOp/SparseGenMatProd.h>
|
||||||
|
#include <Eigen/Core>
|
||||||
|
#include <Eigen/SparseCore>
|
||||||
namespace Recon
|
namespace Recon
|
||||||
{
|
{
|
||||||
|
|
||||||
|
double eigs(Aurora::Sparse& aM)
|
||||||
|
{
|
||||||
|
double result = NAN;
|
||||||
|
size_t size = aM.getM();
|
||||||
|
if(size < aM.getN())
|
||||||
|
{
|
||||||
|
size = aM.getN();
|
||||||
|
}
|
||||||
|
Eigen::SparseMatrix<double> M(size, size);
|
||||||
|
std::vector<Eigen::Triplet<double>> triplets;
|
||||||
|
Aurora::Matrix rows = aM.getRowVector();
|
||||||
|
Aurora::Matrix columns = aM.getColVector();
|
||||||
|
Aurora::Matrix values = aM.getValVector();
|
||||||
|
for (int i = 0; i < rows.getDataSize(); ++i)
|
||||||
|
{
|
||||||
|
triplets.push_back(Eigen::Triplet<double>(rows[i], columns[i], values[i]));
|
||||||
|
}
|
||||||
|
|
||||||
|
M.setFromTriplets(triplets.begin(), triplets.end());
|
||||||
|
Spectra::SparseGenMatProd<double> op(M);
|
||||||
|
Spectra::GenEigsSolver<Spectra::SparseGenMatProd<double>> eigs(op, 1, 6);
|
||||||
|
eigs.init();
|
||||||
|
int nconv = eigs.compute(Spectra::SortRule::LargestMagn);
|
||||||
|
Eigen::VectorXcd evalues;
|
||||||
|
if(eigs.info() == Spectra::CompInfo::Successful)
|
||||||
|
{
|
||||||
|
evalues = eigs.eigenvalues();
|
||||||
|
std::complex<double> complex = evalues[0];
|
||||||
|
result = complex.real();
|
||||||
|
}
|
||||||
|
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
void checkAndScale(Aurora::Sparse& M, Aurora::Matrix& b,size_t n){
|
void checkAndScale(Aurora::Sparse& M, Aurora::Matrix& b,size_t n){
|
||||||
return;
|
return;
|
||||||
//TODO:暂时啥都没做
|
//TODO:暂时啥都没做
|
||||||
|
|||||||
@@ -7,6 +7,8 @@ namespace Recon {
|
|||||||
|
|
||||||
void checkAndScale(Aurora::Sparse& M, Aurora::Matrix& b,size_t n);
|
void checkAndScale(Aurora::Sparse& M, Aurora::Matrix& b,size_t n);
|
||||||
|
|
||||||
|
double eigs(Aurora::Sparse& aM);
|
||||||
|
|
||||||
Aurora::Matrix callTval3(Aurora::Sparse &M, Aurora::Matrix &b,
|
Aurora::Matrix callTval3(Aurora::Sparse &M, Aurora::Matrix &b,
|
||||||
const Aurora::Matrix &dims, int device,
|
const Aurora::Matrix &dims, int device,
|
||||||
struct TVALOptions &options);
|
struct TVALOptions &options);
|
||||||
|
|||||||
Reference in New Issue
Block a user