From 5e85d0f361dfe70b3964d9f5218da49b2c2f13d0 Mon Sep 17 00:00:00 2001 From: Krad Date: Sun, 23 Apr 2023 10:39:26 +0800 Subject: [PATCH] Function1D bug fix and unit test. --- src/Function1D.cpp | 24 +++++----- src/Function1D.h | 6 +-- test/Function1D_Test.cpp | 97 ++++++++++++++++++++++++++++++++++++++++ 3 files changed, 112 insertions(+), 15 deletions(-) diff --git a/src/Function1D.cpp b/src/Function1D.cpp index 8366b75..985939b 100644 --- a/src/Function1D.cpp +++ b/src/Function1D.cpp @@ -26,7 +26,7 @@ Aurora::Matrix Aurora::complex(const Aurora::Matrix &matrix) { std::cerr<<"complex not support complex value type"< *) mkl_malloc(matrix.getDataSize() * sizeof(std::complex), 64); + auto output = malloc(matrix.getDataSize() ,true); memset(output, 0, (matrix.getDataSize() * sizeof(std::complex))); cblas_dcopy(matrix.getDataSize(), matrix.getData(), REAL_STRIDE, (double *) output, COMPLEX_STRIDE); return Aurora::Matrix::New((double *) output, matrix.getDimSize(0), matrix.getDimSize(1), matrix.getDimSize(2), @@ -38,7 +38,7 @@ Aurora::Matrix Aurora::real(const Aurora::Matrix &matrix) { std::cerr<<"real only support complex value type"< *)matrix.getData(), SAME_STRIDE,output, SAME_STRIDE); return Aurora::Matrix::New(output, matrix); } @@ -155,7 +155,7 @@ Aurora::Matrix Aurora::sign(const Aurora::Matrix &matrix) { } else{ //sign(x) = x./abs(x),前提是 x 为复数。 - auto output = (double *) mkl_malloc(matrix.getDataSize() * sizeof(std::complex), 64); + auto output = malloc(matrix.getDataSize(),true); Matrix absMatrix = abs(matrix); vdDivI(matrix.getDataSize(), matrix.getData(),COMPLEX_STRIDE, absMatrix.getData(), REAL_STRIDE,output,COMPLEX_STRIDE); @@ -165,7 +165,7 @@ Aurora::Matrix Aurora::sign(const Aurora::Matrix &matrix) { } } -Aurora::Matrix Aurora::sign(const Aurora::Matrix&& matrix) { +Aurora::Matrix Aurora::sign(Aurora::Matrix&& matrix) { std::cout<<"RR sign"< retV(matrix.getData(),matrix.getDataSize()); diff --git a/src/Function1D.h b/src/Function1D.h index a0eb900..79a5ed0 100644 --- a/src/Function1D.h +++ b/src/Function1D.h @@ -31,15 +31,15 @@ namespace Aurora { */ Matrix sqrt(const Matrix& matrix); - Matrix sqrt(const Matrix&& matrix); + Matrix sqrt(Matrix&& matrix); Matrix abs(const Matrix& matrix); - Matrix abs(const Matrix&& matrix); + Matrix abs(Matrix&& matrix); Matrix sign(const Matrix& matrix); - Matrix sign(const Matrix&& matrix); + Matrix sign(Matrix&& matrix); Matrix interp1(const Matrix& aX, const Matrix& aV, const Matrix& aX1, InterpnMethod aMethod); diff --git a/test/Function1D_Test.cpp b/test/Function1D_Test.cpp index 9bc28f9..282152a 100644 --- a/test/Function1D_Test.cpp +++ b/test/Function1D_Test.cpp @@ -1,5 +1,8 @@ #include #include + +#include "TestUtility.h" + #include "Matrix.h" #include "Function.h" #include "Function1D.h" @@ -107,3 +110,97 @@ TEST_F(Function1D_Test, polyval){ EXPECT_DOUBLE_EQ(262., resultP[2])<<" polyval error;"; delete [] resultP; } + +TEST_F(Function1D_Test, complexAndEtc){ + //complex + { + double *dataP =new double[8]{3,2,1,6, 7, 8 , 19, 13}; + auto matrixAN = Aurora::Matrix::fromRawData(dataP,2,4); + auto matrixBC = Aurora::complex(matrixAN); + EXPECT_EQ(8, matrixBC.getDataSize()); + EXPECT_EQ(Aurora::Complex, matrixBC.getValueType()); + EXPECT_DOUBLE_EQ(3, matrixBC.getData()[0]); + EXPECT_DOUBLE_EQ(0, matrixBC.getData()[3]); + } + //complex & real & imag + { + double *dataP =new double[8]{3,2,1,6, 7, 8 , 19, 13}; + auto matrixAC = Aurora::Matrix::fromRawData(dataP,2,2,0,Aurora::Complex); + auto matrixCN = Aurora::real(matrixAC); + EXPECT_EQ(4, matrixCN.getDataSize()); + EXPECT_EQ(Aurora::Normal, matrixCN.getValueType()); + EXPECT_DOUBLE_EQ(3, matrixCN.getData()[0]); + EXPECT_DOUBLE_EQ(19, matrixCN.getData()[3]); + + auto matrixDN = Aurora::imag(matrixAC); + EXPECT_EQ(4, matrixDN.getDataSize()); + EXPECT_EQ(Aurora::Normal, matrixDN.getValueType()); + EXPECT_DOUBLE_EQ(2, matrixDN.getData()[0]); + EXPECT_DOUBLE_EQ(13, matrixDN.getData()[3]); + } + + + +} + +TEST_F(Function1D_Test, ceilAndRound) { + double *dataP = new double[3]{3.1, 2.5, 1.8}; + auto matrixA = Aurora::Matrix::fromRawData(dataP, 3); + auto matrixB = Aurora::ceil(matrixA); + EXPECT_EQ(3, matrixB.getDataSize()); + EXPECT_EQ(Aurora::Normal, matrixB.getValueType()); + EXPECT_DOUBLE_EQ(4, matrixB.getData()[0]); + EXPECT_DOUBLE_EQ(3, matrixB.getData()[1]); + EXPECT_DOUBLE_EQ(2, matrixB.getData()[2]); + matrixB = Aurora::ceil(matrixA * 0.5) ; + EXPECT_EQ(3, matrixB.getDataSize()); + EXPECT_EQ(Aurora::Normal, matrixB.getValueType()); + EXPECT_DOUBLE_EQ(2, matrixB.getData()[0]); + EXPECT_DOUBLE_EQ(2, matrixB.getData()[1]); + EXPECT_DOUBLE_EQ(1, matrixB.getData()[2]); + + matrixB = Aurora::round(matrixA); + EXPECT_EQ(3, matrixB.getDataSize()); + EXPECT_EQ(Aurora::Normal, matrixB.getValueType()); + EXPECT_DOUBLE_EQ(3, matrixB.getData()[0]); + EXPECT_DOUBLE_EQ(3, matrixB.getData()[1]); + EXPECT_DOUBLE_EQ(2, matrixB.getData()[2]); + + matrixB = Aurora::round(matrixA * 0.5); + EXPECT_EQ(3, matrixB.getDataSize()); + EXPECT_EQ(Aurora::Normal, matrixB.getValueType()); + EXPECT_DOUBLE_EQ(2, matrixB.getData()[0]); + EXPECT_DOUBLE_EQ(1, matrixB.getData()[1]); + EXPECT_DOUBLE_EQ(1, matrixB.getData()[2]); +} + +TEST_F(Function1D_Test, absAndSqrt) { + double *dataP = new double[3]{1, 4, -3}; + auto matrixA = Aurora::Matrix::fromRawData(dataP, 3); + auto matrixB = Aurora::abs(matrixA); + EXPECT_EQ(3, matrixB.getDataSize()); + EXPECT_EQ(Aurora::Normal, matrixB.getValueType()); + EXPECT_DOUBLE_EQ(1, matrixB.getData()[0]); + EXPECT_DOUBLE_EQ(4, matrixB.getData()[1]); + EXPECT_DOUBLE_EQ(3, matrixB.getData()[2]); + matrixB = Aurora::sqrt(matrixB); + EXPECT_EQ(3, matrixB.getDataSize()); + EXPECT_EQ(Aurora::Normal, matrixB.getValueType()); + EXPECT_DOUBLE_EQ(1, matrixB.getData()[0]); + EXPECT_DOUBLE_EQ(2, matrixB.getData()[1]); + EXPECT_DOUBLE_EQ(1.7321, fourDecimalRound(matrixB.getData()[2])); + matrixB = Aurora::sqrt(Aurora::abs(matrixA*-1)); + EXPECT_EQ(3, matrixB.getDataSize()); + EXPECT_EQ(Aurora::Normal, matrixB.getValueType()); + EXPECT_DOUBLE_EQ(1, matrixB.getData()[0]); + EXPECT_DOUBLE_EQ(2, matrixB.getData()[1]); + EXPECT_DOUBLE_EQ(1.7321, fourDecimalRound(matrixB.getData()[2])); + matrixB = Aurora::sqrt(matrixA); + EXPECT_EQ(3, matrixB.getDataSize()); + EXPECT_EQ(Aurora::Normal, matrixB.getValueType()); + EXPECT_DOUBLE_EQ(1, matrixB.getData()[0]); + EXPECT_DOUBLE_EQ(2, matrixB.getData()[1]); + EXPECT_TRUE(isnanf(matrixB.getData()[2])); +} + +