Add sort, sortrows, median and their unit test.
This commit is contained in:
@@ -424,4 +424,95 @@ Matrix Aurora::mean(const Matrix &aMatrix, FunctionDirection direction, bool aIn
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Matrix Aurora::sort(const Matrix &aMatrix) {
|
||||
if (aMatrix.getDimSize(2)>1 || aMatrix.isComplex()) {
|
||||
std::cerr
|
||||
<< (aMatrix.getDimSize(2) > 1 ? "sort() not support 3D data!" : "sort() not support complex value type!")
|
||||
<< std::endl;
|
||||
return Matrix();
|
||||
}
|
||||
return sort(std::forward<Matrix &&>(aMatrix.deepCopy()));
|
||||
}
|
||||
Matrix Aurora::sort(Matrix &&aMatrix) {
|
||||
if (aMatrix.getDimSize(2)>1 || aMatrix.isComplex()) {
|
||||
std::cerr
|
||||
<< (aMatrix.getDimSize(2) > 1 ? "sort() not support 3D data!" : "sort() not support complex value type!")
|
||||
<< std::endl;
|
||||
return Matrix();
|
||||
}
|
||||
if (aMatrix.getDimSize(0)>=100000){
|
||||
#pragma omp parallel for
|
||||
for (int i = 0; i < aMatrix.getDimSize(1); ++i) {
|
||||
Eigen::Map<Eigen::VectorXd> srcV(aMatrix.getData()+i*aMatrix.getDimSize(0),aMatrix.getDimSize(0));
|
||||
std::sort(srcV.array().begin(),srcV.array().end());
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
for (int i = 0; i < aMatrix.getDimSize(1); ++i) {
|
||||
Eigen::Map<Eigen::VectorXd> srcV(aMatrix.getData()+i*aMatrix.getDimSize(0),aMatrix.getDimSize(0));
|
||||
std::sort(srcV.array().begin(),srcV.array().end());
|
||||
}
|
||||
}
|
||||
|
||||
return aMatrix;
|
||||
}
|
||||
|
||||
Matrix Aurora::sortrows(const Matrix &aMatrix) {
|
||||
if (aMatrix.getDimSize(2)>1 || aMatrix.isComplex()) {
|
||||
std::cerr
|
||||
<< (aMatrix.getDimSize(2) > 1 ? "sortrows() not support 3D data!" : "sortrows() not support complex value type!")
|
||||
<< std::endl;
|
||||
return Matrix();
|
||||
}
|
||||
return sortrows(std::forward<Matrix &&>(aMatrix.deepCopy()));
|
||||
}
|
||||
|
||||
Matrix Aurora::sortrows(Matrix &&aMatrix) {
|
||||
if (aMatrix.getDimSize(2)>1 || aMatrix.isComplex()) {
|
||||
std::cerr
|
||||
<< (aMatrix.getDimSize(2) > 1 ? "sortrows() not support 3D data!" : "sortrows() not support complex value type!")
|
||||
<< std::endl;
|
||||
return Matrix();
|
||||
}
|
||||
Eigen::Map<Eigen::MatrixXd> srcM(aMatrix.getData(),aMatrix.getDimSize(0),aMatrix.getDimSize(1));
|
||||
if (aMatrix.getDimSize(1)>=100000){
|
||||
#pragma omp parallel for
|
||||
for (int i = 0; i < aMatrix.getDimSize(0); ++i) {
|
||||
std::sort(srcM.row(i).array().begin(),srcM.row(i).array().end());
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
for (int i = 0; i < aMatrix.getDimSize(0); ++i) {
|
||||
std::sort(srcM.row(i).array().begin(),srcM.row(i).array().end());
|
||||
}
|
||||
}
|
||||
|
||||
return aMatrix;
|
||||
}
|
||||
|
||||
Matrix Aurora::median(const Matrix &aMatrix) {
|
||||
if (aMatrix.getDimSize(2) > 1 || aMatrix.isComplex()) {
|
||||
std::cerr
|
||||
<< (aMatrix.getDimSize(2) > 1 ? "median() not support 3D data!"
|
||||
: "median() not support complex value type!")
|
||||
<< std::endl;
|
||||
return Matrix();
|
||||
}
|
||||
Matrix sorted = sort(aMatrix);
|
||||
Eigen::Map<Eigen::MatrixXd> srcM(sorted.getData(),sorted.getDimSize(0),sorted.getDimSize(1));
|
||||
bool flag = aMatrix.getDimSize(0) % 2 == 1;
|
||||
double* ret = malloc(aMatrix.getDimSize(1));
|
||||
Eigen::Map<Eigen::VectorXd> retV(ret,aMatrix.getDimSize(1));
|
||||
if (flag) {
|
||||
retV = srcM.row(aMatrix.getDimSize(0)/2);
|
||||
return Matrix::New(ret,1,aMatrix.getDimSize(1));
|
||||
} else {
|
||||
retV = (srcM.row(aMatrix.getDimSize(0)/2-1).array()+srcM.row(aMatrix.getDimSize(0)/2).array())/2;
|
||||
return Matrix::New(ret,1,aMatrix.getDimSize(1));
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -64,6 +64,13 @@ namespace Aurora {
|
||||
*/
|
||||
Matrix mean(const Matrix& aMatrix,FunctionDirection direction = Column, bool aIncludeNan = true);
|
||||
|
||||
Matrix sort(const Matrix& aMatrix);
|
||||
Matrix sort(Matrix&& aMatrix);
|
||||
|
||||
Matrix sortrows(const Matrix& aMatrix);
|
||||
Matrix sortrows(Matrix&& aMatrix);
|
||||
|
||||
Matrix median(const Matrix& aMatrix);
|
||||
};
|
||||
|
||||
|
||||
|
||||
Reference in New Issue
Block a user