From 9a3ec2805e67f8ccd8c70f5462c66cb9171c6f62 Mon Sep 17 00:00:00 2001 From: sunwen Date: Wed, 26 Apr 2023 15:57:29 +0800 Subject: [PATCH] Add union and union's unittest. --- src/Function1D.cpp | 22 ++++++++++++++++++++++ src/Function1D.h | 2 ++ test/Function1D_Test.cpp | 16 ++++++++++++++++ 3 files changed, 40 insertions(+) diff --git a/src/Function1D.cpp b/src/Function1D.cpp index e13c33c..c1f9623 100644 --- a/src/Function1D.cpp +++ b/src/Function1D.cpp @@ -550,3 +550,25 @@ Matrix Aurora::linspace(double aStart, double aEnd, int aNum) return Matrix::New(resultData,aNum); } + +Matrix Aurora::auroraUnion(const Matrix& aMatrix1, const Matrix& aMatrix2) +{ + if(aMatrix1.isNull() || aMatrix2.isNull() || aMatrix1.getValueType() == Complex || aMatrix2.getValueType() == Complex) + { + return Matrix(); + } + + size_t size1= aMatrix1.getDataSize(); + size_t size2= aMatrix2.getDataSize(); + double* resultData = Aurora::malloc(size1 + size2); + cblas_dcopy(size1, aMatrix1.getData(), 1, resultData, 1); + cblas_dcopy(size2, aMatrix2.getData(), 1, resultData + size1, 1); + std::vector vector(resultData, resultData + size1 + size2); + Aurora::free(resultData); + std::sort(vector.begin(), vector.end()); + auto last = std::unique(vector.begin(), vector.end()); + vector.erase(last, vector.end()); + + return Matrix::copyFromRawData(vector.data(),vector.size()); +} + diff --git a/src/Function1D.h b/src/Function1D.h index 238b570..5a5eb22 100644 --- a/src/Function1D.h +++ b/src/Function1D.h @@ -74,6 +74,8 @@ namespace Aurora { Matrix linspace(double aStart, double aEnd, int aNum); + Matrix auroraUnion(const Matrix& aMatrix1, const Matrix& aMatrix2); + /** * 多项式计算 * @brief 例如p[1 0 1],x[3 2 5],代表对多项式 y = x^2 + 1 求(x=3, x=2, x=5)时所有的y diff --git a/test/Function1D_Test.cpp b/test/Function1D_Test.cpp index ea7d943..0e4a693 100644 --- a/test/Function1D_Test.cpp +++ b/test/Function1D_Test.cpp @@ -439,3 +439,19 @@ TEST_F(Function1D_Test, linspace) { EXPECT_DOUBLE_AE(result.getData()[5], 3.3333); EXPECT_DOUBLE_AE(result.getData()[6], 5.0000); } + +TEST_F(Function1D_Test, auroraUnion) { + double* data1 = new double[9]{3,3,2,2,2,1,4,4,7}; + auto matrix1 = Aurora::Matrix::fromRawData(data1, 9,1,1); + double* data2 = new double[8]{6,6,7,7,8,1,2}; + auto matrix2 = Aurora::Matrix::fromRawData(data2, 7,1,1); + + auto result = Aurora::auroraUnion(matrix1, matrix2); + EXPECT_DOUBLE_AE(result.getData()[0],1); + EXPECT_DOUBLE_AE(result.getData()[1],2); + EXPECT_DOUBLE_AE(result.getData()[2],3); + EXPECT_DOUBLE_AE(result.getData()[3],4); + EXPECT_DOUBLE_AE(result.getData()[4],6); + EXPECT_DOUBLE_AE(result.getData()[5],7); + EXPECT_DOUBLE_AE(result.getData()[6],8); +}