diff --git a/src/Function1D.cpp b/src/Function1D.cpp index 1699233..abc0dc3 100644 --- a/src/Function1D.cpp +++ b/src/Function1D.cpp @@ -462,3 +462,29 @@ double Aurora::norm(const Matrix& aMatrix, NormMethod aNormMethod) return 0; } + +Matrix Aurora::transpose(const Matrix& aMatrix) +{ + //not surpport for 3 dims. + if(aMatrix.isNull() || aMatrix.getDimSize(2) > 1) + { + return Matrix(); + } + size_t size = aMatrix.getDataSize(); + int row = aMatrix.getDimSize(0); + int col = aMatrix.getDimSize(1); + double* resultData; + double* data = aMatrix.getData(); + if(aMatrix.isComplex()) + { + resultData = Aurora::malloc(size, true); + mkl_zomatcopy('C', 'T',row ,col, 1.0, (MKL_Complex16*)data, row, (MKL_Complex16*)resultData, col); + } + else + { + resultData = Aurora::malloc(size); + mkl_domatcopy('C', 'T',row ,col, 1.0, data, row, resultData, col); + } + + return Matrix::New(resultData,col,row,1,aMatrix.getValueType()); +} diff --git a/src/Function1D.h b/src/Function1D.h index 814cb5d..656c6ef 100644 --- a/src/Function1D.h +++ b/src/Function1D.h @@ -66,6 +66,8 @@ namespace Aurora { double norm(const Matrix& aMatrix, NormMethod aNormMethod); + Matrix transpose(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/test/Function1D_Test.cpp b/test/Function1D_Test.cpp index 34242a0..bcbf399 100644 --- a/test/Function1D_Test.cpp +++ b/test/Function1D_Test.cpp @@ -308,3 +308,37 @@ TEST_F(Function1D_Test, norm) { result = Aurora::norm(matrix,Aurora::NormMethod::NormF); EXPECT_DOUBLE_AE(result,27.4089); } + +TEST_F(Function1D_Test, transpose) { + double *data = new double[6]{1,2,3,4,5,6}; + auto matrix = Aurora::Matrix::fromRawData(data, 3,2); + auto result = Aurora::transpose(matrix); + EXPECT_DOUBLE_EQ(result.getData()[0],1); + EXPECT_DOUBLE_EQ(result.getData()[1],4); + EXPECT_DOUBLE_EQ(result.getData()[2],2); + EXPECT_DOUBLE_EQ(result.getData()[3],5); + EXPECT_DOUBLE_EQ(result.getData()[4],3); + EXPECT_DOUBLE_EQ(result.getData()[5],6); + EXPECT_DOUBLE_EQ(result.getDimSize(0),2); + EXPECT_DOUBLE_EQ(result.getDimSize(1),3); + + data = new double[12]{1,2,3,4,5,6,7,8,9,10,11,12}; + matrix = Aurora::Matrix::fromRawData(data, 3,2,1,Aurora::Complex); + result = Aurora::transpose(matrix); + EXPECT_DOUBLE_EQ(result.getData()[0],1); + EXPECT_DOUBLE_EQ(result.getData()[1],2); + EXPECT_DOUBLE_EQ(result.getData()[2],7); + EXPECT_DOUBLE_EQ(result.getData()[3],8); + EXPECT_DOUBLE_EQ(result.getData()[4],3); + EXPECT_DOUBLE_EQ(result.getData()[5],4); + EXPECT_DOUBLE_EQ(result.getData()[6],9); + EXPECT_DOUBLE_EQ(result.getData()[7],10); + EXPECT_DOUBLE_EQ(result.getData()[8],5); + EXPECT_DOUBLE_EQ(result.getData()[9],6); + EXPECT_DOUBLE_EQ(result.getData()[10],11); + EXPECT_DOUBLE_EQ(result.getData()[11],12); + EXPECT_DOUBLE_EQ(result.getDimSize(0),2); + EXPECT_DOUBLE_EQ(result.getDimSize(1),3); + EXPECT_DOUBLE_EQ(result.getDimSize(0),2); + EXPECT_DOUBLE_EQ(result.getDimSize(1),3); +}