DIC源码
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

123 lines
3.1 KiB

3 months ago
#pragma once
#ifndef _ARRAY_H_
#define _ARRAY_H_
#include <Eigen>
typedef Eigen::Matrix<float, 6, 6> Matrix6f;
typedef Eigen::Matrix<float, 12, 12> Matrix12f;
typedef Eigen::Matrix<float, 6, 1> Vector6f;
typedef Eigen::Matrix<float, 4, 1> Vector4f;
namespace opencorr
{
//new and delete 2d array
float** new2D(int dimension1, int dimension2); //array[dimension1][dimension2]
void delete2D(float**& ptr);
//new and delete 3d array
float*** new3D(int dimension1, int dimension2, int dimension3); //array[dimension1][dimension2][dimension3]
void delete3D(float***& ptr);
//new and delete 4d array
float**** new4D(int dimension1, int dimension2, int dimension3, int dimension4); //array[dimension1][dimension2][dimension3][dimension4]
void delete4D(float****& ptr);
//allocate memory for 2d, 3d, and 4d arrays
template <class Real>
void hCreatePtr(Real*& ptr, int dimension1)
{
ptr = (Real*)calloc(dimension1, sizeof(Real)); //allocate the memory and initialize all the elements with zero
}
template <class Real>
void hCreatePtr(Real**& ptr, int dimension1, int dimension2)
{
Real* ptr1d = (Real*)calloc(dimension1 * dimension2, sizeof(Real));
ptr = (Real**)malloc(dimension1 * sizeof(Real*));
for (int i = 0; i < dimension1; i++)
{
ptr[i] = ptr1d + i * dimension2;
}
}
template <class Real>
void hCreatePtr(Real***& ptr, int dimension1, int dimension2, int dimension3)
{
Real* ptr1d = (Real*)calloc(dimension1 * dimension2 * dimension3, sizeof(Real));
Real** ptr2d = (Real**)malloc(dimension1 * dimension2 * sizeof(Real*));
ptr = (Real***)malloc(dimension1 * sizeof(Real**));
for (int i = 0; i < dimension1; i++)
{
for (int j = 0; j < dimension2; j++)
{
ptr2d[i * dimension2 + j] = ptr1d + (i * dimension2 + j) * dimension3;
}
ptr[i] = ptr2d + i * dimension2;
}
}
template <class Real>
void hCreatePtr(Real****& ptr, int dimension1, int dimension2, int dimension3, int dimension4)
{
Real* ptr1d = (Real*)calloc(dimension1 * dimension2 * dimension3 * dimension4, sizeof(Real));
Real** ptr2d = (Real**)malloc(dimension1 * dimension2 * dimension3 * sizeof(Real*));
Real*** ptr3d = (Real***)malloc(dimension1 * dimension2 * sizeof(Real**));
ptr = (Real****)malloc(dimension1 * sizeof(Real***));
for (int i = 0; i < dimension1; i++)
{
for (int j = 0; j < dimension2; j++)
{
for (int k = 0; k < dimension3; k++)
{
ptr2d[(i * dimension2 + j) * dimension3 + k] = ptr1d + ((i * dimension2 + j) * dimension3 + k) * dimension4;
}
ptr3d[i * dimension2 + j] = ptr2d + (i * dimension2 + j) * dimension3;
}
ptr[i] = ptr3d + i * dimension2;
}
}
//release memory of 2d, 3d, and 4d arrays
template <class Real>
void hDestroyPtr(Real*& ptr)
{
free(ptr);
ptr = nullptr;
}
template <class Real>
void hDestroyPtr(Real**& ptr)
{
free(ptr[0]);
free(ptr);
ptr = nullptr;
}
template<class Real>
void hDestroyPtr(Real***& ptr)
{
free(ptr[0][0]);
free(ptr[0]);
free(ptr);
ptr = nullptr;
}
template <class Real>
void hDestroyPtr(Real****& ptr)
{
free(ptr[0][0][0]);
free(ptr[0][0]);
free(ptr[0]);
free(ptr);
ptr = nullptr;
}
}//namespace opencorr
#endif //_ARRAY_H_