From 37ffe9b51b93bb07684fef5beb0fd90f5127344d Mon Sep 17 00:00:00 2001 From: Krad Date: Mon, 24 Apr 2023 16:02:15 +0800 Subject: [PATCH] Add index to min and max. --- src/Function2D.cpp | 78 +++++++++++++++++++++++++--------------- src/Function2D.h | 4 +++ test/Function2D_Test.cpp | 13 +++++++ 3 files changed, 67 insertions(+), 28 deletions(-) diff --git a/src/Function2D.cpp b/src/Function2D.cpp index d4aec69..21cfee8 100644 --- a/src/Function2D.cpp +++ b/src/Function2D.cpp @@ -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 retV(aMatrix.getData(),aMatrix.getDataSize()); - double * ret = malloc(1); - ret[0] = retV.array().minCoeff(); - return Matrix::New(ret,1); + case All: { + Eigen::Map 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 srcMatrix(aMatrix.getData(),aMatrix.getDimSize(0),aMatrix.getDimSize(1)); double * ret = malloc(aMatrix.getDimSize(0)); - Eigen::Map 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 retMatrix(ret,aMatrix.getDimSize(0),1); + retMatrix = srcMatrix.rowwise().minCoeff(); + } return Matrix::New(ret,aMatrix.getDimSize(0),1); } case Column: default: { Eigen::Map srcMatrix(aMatrix.getData(),aMatrix.getDimSize(0),aMatrix.getDimSize(1)); - double * ret = malloc(aMatrix.getDimSize(0)); - Eigen::Map 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 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 retV(aMatrix.getData(),aMatrix.getDataSize()); - double * ret = malloc(1); - ret[0] = retV.array().maxCoeff(); + Eigen::Map 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 srcMatrix(aMatrix.getData(),aMatrix.getDimSize(0),aMatrix.getDimSize(1)); double * ret = malloc(aMatrix.getDimSize(0)); - Eigen::Map 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 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 srcMatrix(aMatrix.getData(),aMatrix.getDimSize(0),aMatrix.getDimSize(1)); double * ret = malloc(aMatrix.getDimSize(0)); - Eigen::Map 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 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 diff --git a/src/Function2D.h b/src/Function2D.h index 9830463..10f2e9d 100644 --- a/src/Function2D.h +++ b/src/Function2D.h @@ -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]的行向量 diff --git a/test/Function2D_Test.cpp b/test/Function2D_Test.cpp index 66647ec..a929cae 100644 --- a/test/Function2D_Test.cpp +++ b/test/Function2D_Test.cpp @@ -96,6 +96,12 @@ TEST_F(Function2D_Test, min) { EXPECT_DOUBLE_EQ(2, ret.getData()[0]); EXPECT_DOUBLE_EQ(2, ret.getData()[1]); EXPECT_DOUBLE_EQ(-1, ret.getData()[2]); + long r,c; + ret = Aurora::min(A, Aurora::Column,r,c); + EXPECT_DOUBLE_EQ(1, ret.getDataSize()); + EXPECT_DOUBLE_EQ(1, ret.getData()[0]); + EXPECT_EQ(0, r); + EXPECT_EQ(0, c); ret = Aurora::min(A, C); EXPECT_DOUBLE_EQ(3, ret.getDataSize()); EXPECT_DOUBLE_EQ(1, ret.getData()[0]); @@ -129,6 +135,12 @@ TEST_F(Function2D_Test, max) { EXPECT_DOUBLE_EQ(3, ret.getData()[0]); EXPECT_DOUBLE_EQ(3, ret.getData()[1]); EXPECT_DOUBLE_EQ(3, ret.getData()[2]); + long r,c; + ret = Aurora::max(A, Aurora::Column,r,c); + EXPECT_DOUBLE_EQ(1, ret.getDataSize()); + EXPECT_DOUBLE_EQ(3, ret.getData()[0]); + EXPECT_EQ(2, r); + EXPECT_EQ(0, c); } TEST_F(Function2D_Test, sum) { @@ -153,6 +165,7 @@ TEST_F(Function2D_Test, sum) { } TEST_F(Function2D_Test, mean) { + { double *dataB = new double[16]{1.1, 2.6, 3.8, 6.2, 4.3, 5.7, 6.9, 10.6,