Add index to min and max.

This commit is contained in:
Krad
2023-04-24 16:02:15 +08:00
parent a895785319
commit 37ffe9b51b
3 changed files with 67 additions and 28 deletions

View File

@@ -131,7 +131,7 @@ Matrix Aurora::std(const Matrix &aMatrix) {
return Matrix::New(std,1,aMatrix.getDimSize(1), aMatrix.getDimSize(2));
}
Matrix Aurora::min(const Matrix &aMatrix, FunctionDirection direction) {
Matrix Aurora::min(const Matrix &aMatrix, FunctionDirection direction, long& rowIdx, long& colIdx) {
if (aMatrix.getDimSize(2)>1 || aMatrix.isComplex()) {
std::cerr
<< (aMatrix.getDimSize(2) > 1 ? "min() not support 3D data!" : "min() not support complex value type!")
@@ -140,33 +140,49 @@ Matrix Aurora::min(const Matrix &aMatrix, FunctionDirection direction) {
}
switch (direction)
{
case All:
{
Eigen::Map<Eigen::VectorXd> retV(aMatrix.getData(),aMatrix.getDataSize());
double * ret = malloc(1);
ret[0] = retV.array().minCoeff();
return Matrix::New(ret,1);
case All: {
Eigen::Map<Eigen::MatrixXd> retV(aMatrix.getData(), aMatrix.getDimSize(0), aMatrix.getDimSize(1));
double *ret = malloc(1);
ret[0] = retV.array().minCoeff(&rowIdx, &colIdx);
return Matrix::New(ret, 1);
}
case Row:
{
Eigen::Map<Eigen::MatrixXd> srcMatrix(aMatrix.getData(),aMatrix.getDimSize(0),aMatrix.getDimSize(1));
double * ret = malloc(aMatrix.getDimSize(0));
Eigen::Map<Eigen::MatrixXd> retMatrix(ret,aMatrix.getDimSize(0),1);
retMatrix = srcMatrix.rowwise().minCoeff();
if (aMatrix.getDimSize(0) == 1){
ret[0] = srcMatrix.topRows(0).minCoeff(&rowIdx, &colIdx);
}
else{
Eigen::Map<Eigen::MatrixXd> retMatrix(ret,aMatrix.getDimSize(0),1);
retMatrix = srcMatrix.rowwise().minCoeff();
}
return Matrix::New(ret,aMatrix.getDimSize(0),1);
}
case Column:
default:
{
Eigen::Map<Eigen::MatrixXd> srcMatrix(aMatrix.getData(),aMatrix.getDimSize(0),aMatrix.getDimSize(1));
double * ret = malloc(aMatrix.getDimSize(0));
Eigen::Map<Eigen::MatrixXd> retMatrix(ret,1,aMatrix.getDimSize(1));
retMatrix = srcMatrix.colwise().minCoeff();
double * ret = malloc(aMatrix.getDimSize(1));
if (aMatrix.getDimSize(1) == 1){
ret[0] = srcMatrix.col(0).minCoeff(&rowIdx, &colIdx);
}
else {
Eigen::Map<Eigen::MatrixXd> retMatrix(ret,1,aMatrix.getDimSize(1));
retMatrix = srcMatrix.colwise().minCoeff();
}
return Matrix::New(ret,1,aMatrix.getDimSize(1));
}
}
}
Matrix Aurora::min(const Matrix &aMatrix, FunctionDirection direction) {
long a,b;
return min(aMatrix,direction,a,b);
}
Matrix Aurora::min(const Matrix &aMatrix, const Matrix &aOther) {
if (aMatrix.getDimSize(2)>1 || aMatrix.isComplex()) {
std::cerr
@@ -221,6 +237,11 @@ Matrix Aurora::min(const Matrix &aMatrix, const Matrix &aOther) {
}
Matrix Aurora::max(const Matrix &aMatrix, FunctionDirection direction) {
long a,b;
return max(aMatrix,direction,a,b);
}
Matrix Aurora::max(const Matrix &aMatrix, FunctionDirection direction, long& rowIdx, long& colIdx) {
if (aMatrix.getDimSize(2)>1 || aMatrix.isComplex()) {
std::cerr
<< (aMatrix.getDimSize(2) > 1 ? "max() not support 3D data!" : "max() not support complex value type!")
@@ -231,17 +252,22 @@ Matrix Aurora::max(const Matrix &aMatrix, FunctionDirection direction) {
{
case All:
{
Eigen::Map<Eigen::VectorXd> retV(aMatrix.getData(),aMatrix.getDataSize());
double * ret = malloc(1);
ret[0] = retV.array().maxCoeff();
Eigen::Map<Eigen::MatrixXd> retV(aMatrix.getData(), aMatrix.getDimSize(0), aMatrix.getDimSize(1));
double *ret = malloc(1);
ret[0] = retV.array().maxCoeff(&rowIdx, &colIdx);
return Matrix::New(ret,1);
}
case Row:
{
Eigen::Map<Eigen::MatrixXd> srcMatrix(aMatrix.getData(),aMatrix.getDimSize(0),aMatrix.getDimSize(1));
double * ret = malloc(aMatrix.getDimSize(0));
Eigen::Map<Eigen::MatrixXd> retMatrix(ret,aMatrix.getDimSize(0),1);
retMatrix = srcMatrix.rowwise().maxCoeff();
if (aMatrix.getDimSize(0) == 1){
ret[0] = srcMatrix.topRows(0).maxCoeff(&rowIdx, &colIdx);
}
else{
Eigen::Map<Eigen::MatrixXd> retMatrix(ret,aMatrix.getDimSize(0),1);
retMatrix = srcMatrix.rowwise().maxCoeff();
}
return Matrix::New(ret,aMatrix.getDimSize(0),1);
}
case Column:
@@ -249,8 +275,13 @@ Matrix Aurora::max(const Matrix &aMatrix, FunctionDirection direction) {
{
Eigen::Map<Eigen::MatrixXd> srcMatrix(aMatrix.getData(),aMatrix.getDimSize(0),aMatrix.getDimSize(1));
double * ret = malloc(aMatrix.getDimSize(0));
Eigen::Map<Eigen::MatrixXd> retMatrix(ret,1,aMatrix.getDimSize(1));
retMatrix = srcMatrix.colwise().maxCoeff();
if (aMatrix.getDimSize(1) == 1){
ret[0] = srcMatrix.col(0).maxCoeff(&rowIdx, &colIdx);
}
else {
Eigen::Map<Eigen::MatrixXd> retMatrix(ret,1,aMatrix.getDimSize(1));
retMatrix = srcMatrix.colwise().maxCoeff();
}
return Matrix::New(ret,1,aMatrix.getDimSize(1));
}
}
@@ -292,15 +323,6 @@ Matrix Aurora::sum(const Matrix &aMatrix, FunctionDirection direction) {
}
}
void excludeNan(double * aInput, int aInputSize,double* aOutput,int& aOutputSize){
aOutputSize = 0;
for (int i = 0; i < aInputSize; ++i) {
if (std::isnan(aInput[i])) continue;
aOutput[aOutputSize]=aInput[i];
aOutputSize++;
}
}
Matrix Aurora::mean(const Matrix &aMatrix, FunctionDirection direction, bool aIncludeNan) {
if (aMatrix.getDimSize(2)>1 || aMatrix.isComplex()) {
std::cerr

View File

@@ -26,6 +26,8 @@ namespace Aurora {
*/
Matrix min(const Matrix& aMatrix,FunctionDirection direction = Column);
Matrix min(const Matrix& aMatrix,FunctionDirection direction, long& rowIdx, long& colIdx);
/**
* 求矩阵最小值,可按行、列、单元, 目前不支持三维,不支持复数
* @param aMatrix 矩阵
@@ -34,6 +36,8 @@ namespace Aurora {
*/
Matrix max(const Matrix& aMatrix,FunctionDirection direction = Column);
Matrix max(const Matrix& aMatrix,FunctionDirection direction , long& rowIdx, long& colIdx);
/**
* 比较两个矩阵,求对应位置的最小值,不支持三维
* @attention 矩阵形状不一样时如A为[MxN],则B应为标量或[1xN]的行向量