diff --git a/src/Function1D.cpp b/src/Function1D.cpp index 68284a0..3cfaa27 100644 --- a/src/Function1D.cpp +++ b/src/Function1D.cpp @@ -4,6 +4,7 @@ //必须在Eigen之前 #include "AuroraDefs.h" +#include "Function3D.h" #include "Matrix.h" #include @@ -747,6 +748,22 @@ void Aurora::nantoval(Matrix& aMatrix, double val2) { srcV = srcV.array().isNaN().select(val2,srcV); } +Matrix Aurora::isnan(Matrix& aMatrix){ + Eigen::Map srcV(aMatrix.getData(),aMatrix.getDataSize()); + auto result = zeros(aMatrix.getDimSize(0),aMatrix.getDimSize(1),aMatrix.getDimSize(2)); + Eigen::Map resultV(result.getData(),result.getDataSize()); + resultV = srcV.array().isNaN().select(1.0,resultV); + return result; +} + +Matrix Aurora::isfinite(Matrix& aMatrix){ + Eigen::Map srcV(aMatrix.getData(),aMatrix.getDataSize()); + auto result = zeros(aMatrix.getDimSize(0),aMatrix.getDimSize(1),aMatrix.getDimSize(2)); + Eigen::Map resultV(result.getData(),result.getDataSize()); + resultV = srcV.array().isFinite().select(1.0,resultV); + return result; +} + void Aurora::padding(Matrix &aMatrix, int aIndex, double aValue) { if(aMatrix.isNull() || !aMatrix.isVector()) diff --git a/src/Function1D.h b/src/Function1D.h index 2926d23..9cb1a38 100644 --- a/src/Function1D.h +++ b/src/Function1D.h @@ -2,6 +2,7 @@ #define AURORA_FUNCTION1D_H #include "Matrix.h" +#include namespace Aurora { @@ -104,6 +105,11 @@ namespace Aurora { */ void nantoval(Matrix& aMatrix,double val); + + Matrix isnan(Matrix& aMatrix); + + Matrix isfinite(Matrix& aMatrix); + /** * 使用特定值补齐矩阵,默认为设置原数据矩阵数据到制定长度索引的所有值为制定值 * @attention 直接在原数据上进行修改! diff --git a/test/Function1D_Test.cpp b/test/Function1D_Test.cpp index 3aca3b7..b6f8ad8 100644 --- a/test/Function1D_Test.cpp +++ b/test/Function1D_Test.cpp @@ -1,5 +1,6 @@ #include #include +#include #include #include "MatlabReader.h" @@ -522,5 +523,24 @@ TEST_F(Function1D_Test, convertfp16tofloat) { for (size_t i = 0; i::infinity(); + + double* data = new double[9]{infinite,3,n,2,2,1,4,4,7}; + auto matrix = Aurora::Matrix::fromRawData(data, 9,1,1); + auto r = Aurora::isnan(matrix); + EXPECT_DOUBLE_EQ(r.getData()[0],0); + EXPECT_DOUBLE_EQ(r.getData()[1],0); + EXPECT_DOUBLE_EQ(r.getData()[2],1); + + r = Aurora::isfinite(matrix); + EXPECT_DOUBLE_EQ(r.getData()[0],0); + EXPECT_DOUBLE_EQ(r.getData()[1],1); + EXPECT_DOUBLE_EQ(r.getData()[2],0); + + Aurora::nantoval(matrix,1); + EXPECT_DOUBLE_EQ(matrix.getData()[2],1); }