Add vertcat

This commit is contained in:
kradchen
2023-06-09 15:13:52 +08:00
parent 611da0872b
commit 428d75e548
3 changed files with 38 additions and 0 deletions

View File

@@ -17,6 +17,7 @@
#include <Eigen/Eigen>
#include <Eigen/Dense>
#include <Eigen/SVD>
#include <mkl_cblas.h>
#include <mkl_lapack.h>
#include <sys/types.h>
#include <utility>
@@ -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.

View File

@@ -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);

View File

@@ -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};