diff --git a/src/Function1D.cpp b/src/Function1D.cpp index 8fb42c9..381ffb4 100644 --- a/src/Function1D.cpp +++ b/src/Function1D.cpp @@ -333,6 +333,22 @@ Matrix Aurora::log(const Matrix& aMatrix, int aBaseNum) data[i] /= temp; } } - - return Aurora::Matrix(std::shared_ptr(data,Aurora::free),std::vector{aMatrix.getDimSize(0),aMatrix.getDimSize(1),aMatrix.getDimSize(2)}); + return Matrix::New(data, aMatrix); +} + +Matrix Aurora::exp(const Matrix& aMatrix) +{ + size_t size = aMatrix.getDataSize(); + double* data; + if (aMatrix.isComplex()) + { + data = Aurora::malloc(size, true); + vzExp(size, (MKL_Complex16*)aMatrix.getData(), (MKL_Complex16*)data); + } + else + { + data = Aurora::malloc(size); + vdExp(size, aMatrix.getData(), data); + } + return Matrix::New(data, aMatrix); } diff --git a/src/Function1D.h b/src/Function1D.h index 58dd1cd..b00d6a3 100644 --- a/src/Function1D.h +++ b/src/Function1D.h @@ -49,6 +49,8 @@ namespace Aurora { Matrix log(const Matrix& aMatrix, int aBaseNum = -1); + Matrix exp(const Matrix& aMatrix); + /** * 多项式计算 * @brief 例如p[1 0 1],x[3 2 5],代表对多项式 y = x^2 + 1 求(x=3, x=2, x=5)时所有的y diff --git a/src/Matrix.cpp b/src/Matrix.cpp index f8e7f8c..38c2460 100644 --- a/src/Matrix.cpp +++ b/src/Matrix.cpp @@ -448,7 +448,7 @@ namespace Aurora { double value = getData()[(k*getDimSize(1)*getDimSize(0)+j*getDimSize(0)+i)*complexstep+1]; if(value<0) { - mark = "-"; + mark = ""; } ::printf("%s%f2i",mark,value); } diff --git a/test/Function1D_Test.cpp b/test/Function1D_Test.cpp index 9607917..5d4f64d 100644 --- a/test/Function1D_Test.cpp +++ b/test/Function1D_Test.cpp @@ -222,3 +222,21 @@ TEST_F(Function1D_Test, log) { EXPECT_DOUBLE_AE(result.getData()[1],0.6021); EXPECT_DOUBLE_AE(result.getData()[2],0.7782); } + +TEST_F(Function1D_Test, exp) { + double *data1 = new double[4]{1,2,3,4}; + auto matrix1 = Aurora::Matrix::fromRawData(data1, 4,1,1); + auto result = Aurora::exp(matrix1); + EXPECT_DOUBLE_AE(result.getData()[0],2.7183); + EXPECT_DOUBLE_AE(result.getData()[1],7.3891); + EXPECT_DOUBLE_AE(result.getData()[2],20.0855); + EXPECT_DOUBLE_AE(result.getData()[3],54.5982); + + double *data2 = new double[4]{1,2,3,4}; + auto matrix2 = Aurora::Matrix::fromRawData(data2, 2,1,1,Aurora::Complex); + result = Aurora::exp(matrix2); + EXPECT_DOUBLE_AE(result.getData()[0],-1.1312); + EXPECT_DOUBLE_AE(result.getData()[1],2.4717); + EXPECT_DOUBLE_AE(result.getData()[2],-13.1288); + EXPECT_DOUBLE_AE(result.getData()[3],-15.2008); +}