diff --git a/src/Function1D.cpp b/src/Function1D.cpp index abc0dc3..8d01ad4 100644 --- a/src/Function1D.cpp +++ b/src/Function1D.cpp @@ -488,3 +488,22 @@ Matrix Aurora::transpose(const Matrix& aMatrix) return Matrix::New(resultData,col,row,1,aMatrix.getValueType()); } + +Matrix Aurora::horzcat(const Matrix& aMatrix1, const Matrix& aMatrix2) +{ + if(aMatrix1.isNull() || aMatrix2.isNull() || aMatrix1.getDims() !=2 || aMatrix2.getDims() !=2 || + aMatrix1.getDimSize(0) != aMatrix2.getDimSize(0) || aMatrix1.getValueType() != aMatrix2.getValueType()) + { + return Matrix(); + } + int column1 = aMatrix1.getDimSize(1); + int column2 = aMatrix2.getDimSize(1); + int row = aMatrix1.getDimSize(0); + size_t size1= aMatrix1.getDataSize(); + size_t size2= aMatrix2.getDataSize(); + double* resultData = Aurora::malloc(size1 + size2,aMatrix1.getValueType()); + cblas_dcopy(size1, aMatrix1.getData(), 1, resultData, 1); + cblas_dcopy(size2, aMatrix2.getData(), 1, resultData + size1, 1); + + return Matrix::New(resultData, row, column1+column2, 1, aMatrix1.getValueType()); +} diff --git a/src/Function1D.h b/src/Function1D.h index 656c6ef..0dfc967 100644 --- a/src/Function1D.h +++ b/src/Function1D.h @@ -68,6 +68,8 @@ namespace Aurora { Matrix transpose(const Matrix& aMatrix); + Matrix horzcat(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 bcbf399..067d743 100644 --- a/test/Function1D_Test.cpp +++ b/test/Function1D_Test.cpp @@ -342,3 +342,29 @@ TEST_F(Function1D_Test, transpose) { EXPECT_DOUBLE_EQ(result.getDimSize(0),2); EXPECT_DOUBLE_EQ(result.getDimSize(1),3); } + +TEST_F(Function1D_Test, horzcat) { + double *data1 = new double[6]{1,2,3,4,5,6}; + auto matrix1 = Aurora::Matrix::fromRawData(data1, 3,2); + double *data2 = new double[9]{7,8,9,10,11,12,13,14,15}; + auto matrix2 = Aurora::Matrix::fromRawData(data2, 3,3); + auto result = Aurora::horzcat(matrix1,matrix2); + EXPECT_DOUBLE_EQ(result.getData()[0],1); + EXPECT_DOUBLE_EQ(result.getData()[1],2); + EXPECT_DOUBLE_EQ(result.getData()[10],11); + EXPECT_DOUBLE_EQ(result.getData()[14],15); + EXPECT_DOUBLE_EQ(result.getDimSize(0),3); + EXPECT_DOUBLE_EQ(result.getDimSize(1),5); + + data1 = new double[6]{1,2,3,4,5,6}; + matrix1 = Aurora::Matrix::fromRawData(data1, 3,1,1,Aurora::Complex); + data2 = new double[6]{7,8,9,10,11,12}; + matrix2 = Aurora::Matrix::fromRawData(data2, 3,1,1,Aurora::Complex); + result = Aurora::horzcat(matrix1,matrix2); + EXPECT_DOUBLE_EQ(result.getData()[0],1); + EXPECT_DOUBLE_EQ(result.getData()[1],2); + EXPECT_DOUBLE_EQ(result.getData()[8],5); + EXPECT_DOUBLE_EQ(result.getData()[9],6); + EXPECT_DOUBLE_EQ(result.getDimSize(0),3); + EXPECT_DOUBLE_EQ(result.getDimSize(1),2); +}