Add norm and norm's unittest.
This commit is contained in:
@@ -11,6 +11,8 @@
|
||||
#include <Eigen/Core>
|
||||
#include <Eigen/Eigen>
|
||||
#include <Eigen/Dense>
|
||||
#include <Eigen/SVD>
|
||||
#include <mkl_lapack.h>
|
||||
|
||||
using namespace Aurora;
|
||||
|
||||
@@ -415,3 +417,48 @@ Matrix Aurora::conj(const Matrix& aMatrix)
|
||||
vzConj(size,(MKL_Complex16*)aMatrix.getData(), (MKL_Complex16*)data);
|
||||
return Matrix::New(data, aMatrix);
|
||||
}
|
||||
|
||||
double Aurora::norm(const Matrix& aMatrix, NormMethod aNormMethod)
|
||||
{
|
||||
if(aMatrix.isComplex() || aMatrix.isNull())
|
||||
{
|
||||
return NAN;
|
||||
}
|
||||
|
||||
size_t size = aMatrix.getDataSize();
|
||||
int column = aMatrix.getDimSize(1);
|
||||
int row = aMatrix.getDimSize(0);
|
||||
if (aNormMethod == NormMethod::Norm1)
|
||||
{
|
||||
double value = 0;
|
||||
for(int i=0; i<column; ++i)
|
||||
{
|
||||
double temp = cblas_dasum(row, aMatrix($,i,$).toMatrix().getData(), 1);
|
||||
if(temp > value)
|
||||
{
|
||||
value = temp;
|
||||
}
|
||||
}
|
||||
return value;
|
||||
}
|
||||
else if(aNormMethod == NormMethod::NormF)
|
||||
{
|
||||
return cblas_dnrm2(size, aMatrix.getData(), 1);
|
||||
}
|
||||
else if(aNormMethod == NormMethod::Norm2)
|
||||
{
|
||||
//columns > 1
|
||||
if(aMatrix.getDimSize(1) > 1)
|
||||
{
|
||||
Eigen::Map<Eigen::MatrixXd> eMatrix(aMatrix.getData(),aMatrix.getDimSize(0),aMatrix.getDimSize(1));
|
||||
Eigen::JacobiSVD<Eigen::MatrixXd> svd(eMatrix, Eigen::ComputeThinU | Eigen::ComputeThinV);
|
||||
return svd.singularValues()(0);
|
||||
}
|
||||
else
|
||||
{
|
||||
return cblas_dnrm2(size, aMatrix.getData(), 1);
|
||||
}
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user