From 428d75e54845c796e4a77165e70287b43be50022 Mon Sep 17 00:00:00 2001 From: kradchen Date: Fri, 9 Jun 2023 15:13:52 +0800 Subject: [PATCH] Add vertcat --- src/Function1D.cpp | 21 +++++++++++++++++++++ src/Function1D.h | 2 ++ test/Function1D_Test.cpp | 15 +++++++++++++++ 3 files changed, 38 insertions(+) diff --git a/src/Function1D.cpp b/src/Function1D.cpp index d1b5ea9..f7ca533 100644 --- a/src/Function1D.cpp +++ b/src/Function1D.cpp @@ -17,6 +17,7 @@ #include #include #include +#include #include #include #include @@ -694,6 +695,26 @@ Matrix Aurora::horzcat(const Matrix& aMatrix1, const Matrix& aMatrix2) return Matrix::New(resultData, row, column1+column2, 1, aMatrix1.getValueType()); } +Matrix Aurora::vertcat(const Matrix& aMatrix1, const Matrix& aMatrix2){ + { + if(aMatrix1.isNull() || aMatrix2.isNull() || aMatrix1.getDims() !=2 || aMatrix2.getDims() !=2 || + aMatrix1.getDimSize(1) != aMatrix2.getDimSize(1) || aMatrix1.getValueType() != aMatrix2.getValueType()) + { + return Matrix(); + } + int row1 = aMatrix1.getDimSize(0); + int row2 = aMatrix2.getDimSize(0); + int column = aMatrix1.getDimSize(1); + size_t size1= aMatrix1.getDataSize(); + size_t size2= aMatrix2.getDataSize(); + double* resultData = Aurora::malloc(size1 + size2,aMatrix1.getValueType()); + cblas_dcopy_batch_strided(row1, aMatrix1.getData(), 1,row1, resultData, 1, row1+row2, column); + cblas_dcopy_batch_strided(row2, aMatrix2.getData(), 1,row2, resultData + row1, 1, row1+row2, column); + + return Matrix::New(resultData, row1+row2, column, 1, aMatrix1.getValueType()); +} +} + Matrix Aurora::vecnorm(const Matrix& aMatrix, NormMethod aNormMethod, int aDim) { //only surpport aDim = 1 for now. diff --git a/src/Function1D.h b/src/Function1D.h index 4d341b0..f0ef6bf 100644 --- a/src/Function1D.h +++ b/src/Function1D.h @@ -77,6 +77,8 @@ namespace Aurora { Matrix horzcat(const Matrix& aMatrix1, const Matrix& aMatrix2); + Matrix vertcat(const Matrix& aMatrix1, const Matrix& aMatrix2); + Matrix vecnorm(const Matrix& aMatrix, NormMethod aNormMethod, int aDim); Matrix linspace(double aStart, double aEnd, int aNum); diff --git a/test/Function1D_Test.cpp b/test/Function1D_Test.cpp index 1bd7ba4..be24e2b 100644 --- a/test/Function1D_Test.cpp +++ b/test/Function1D_Test.cpp @@ -431,6 +431,21 @@ TEST_F(Function1D_Test, horzcat) { EXPECT_DOUBLE_EQ(result.getDimSize(1),2); } +TEST_F(Function1D_Test, vertcat) { + double *data1 = new double[6]{1,2,3,4,5,6}; + auto matrix1 = Aurora::Matrix::fromRawData(data1, 2,3); + 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::vertcat(matrix1,matrix2); + EXPECT_DOUBLE_EQ(result.getData()[0],1); + EXPECT_DOUBLE_EQ(result.getData()[1],2); + EXPECT_DOUBLE_EQ(result.getData()[5],3); + EXPECT_DOUBLE_EQ(result.getData()[8],11); + EXPECT_DOUBLE_EQ(result.getDimSize(0),5); + EXPECT_DOUBLE_EQ(result.getDimSize(1),3); +} + + TEST_F(Function1D_Test, vecnrom) { //1Dim double *data = new double[3]{1,2,-3};