⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 matrix.h

📁 用C++编写的处理色散媒质的FDTD程序
💻 H
字号:
#include <stdlib.h> 
#include <malloc.h>

#ifndef __MatrixbyZsolt__
#define __MatrixbyZsolt__


///////////////////////////////////////////////////////////////////////////////////////
//Initialize a 2D matrix
///////////////////////////////////////////////////////////////////////////////////////
template<class Tipus> Tipus ** Init_Matrix_2D(int nx, int ny)
{
	Tipus **X;
	int i;

	X=(Tipus **)calloc(nx,sizeof(Tipus *));
	if (X==NULL)
	{
		return NULL;
	}

	int s = nx*ny; 

	Tipus* p = (Tipus*)calloc(s, sizeof(Tipus));
	if (p == NULL) 
	{
		free(X);
		return NULL;
	}
	
	for (i=0; i<nx; i++)
	{
		X[i] = p;
		p += ny;
	}
	
	return X;
};

///////////////////////////////////////////////////////////////////////////////////////
//Initialize a 2D matrix with different sizes in y
///////////////////////////////////////////////////////////////////////////////////////
template<class Tipus> Tipus ** Init_Matrix_2D(int nx, int *Size_y)
{
//the dimensions of Size_y must be [nx] 

	Tipus **X;
	int i;

	X=(Tipus **)calloc(nx,sizeof(Tipus *));
	if (X==NULL)
	{
		return NULL;
	}

	int s = 0;; 
	for (i=0; i<nx; i++)
	{
		s += Size_y[i];
	}

	Tipus* p = (Tipus*)calloc(s, sizeof(Tipus));
	if (p == NULL) 
	{
		free(X);
		return NULL;
	}
	
	for (i=0; i<nx; i++)
	{
		X[i] = p;
		p += Size_y[i];
	}
	
	return X;
};

///////////////////////////////////////////////////////////////////////////////////////
//Clear a 2D matrix 
///////////////////////////////////////////////////////////////////////////////////////
template<class Tipus> Tipus ** Free_Matrix_2D(Tipus **X)
{
	if (!X)
		return NULL;

	free(X[0]);
	free(X);
	return NULL;
};
	
///////////////////////////////////////////////////////////////////////////////////////
//Initialize a 3D matrix
///////////////////////////////////////////////////////////////////////////////////////
template<class Tipus> Tipus *** Init_Matrix_3D(int nx, int ny, int nz)
{
	Tipus ***X;
	int i, j, ii, jj;

	X=(Tipus ***)calloc(nx,sizeof(Tipus **));
	if (X==NULL)
	{
		return NULL;
	}

	for (i=0; i<nx; i++)
	{
		X[i]=(Tipus **)calloc(ny,sizeof(Tipus *));
		if (X[i]==NULL)
		{
			for (ii=0; ii<i; ii++)
			{
				free(X[ii]);
			}
			free(X);
			return NULL;
		}
	}

	int s = n_x*n_y*n_z;
			
	Tipus* p = (Tipus*)calloc(s, sizeof(Tipus));
	if (p == NULL) 
	{
		for (i = 0; i< nx; i++)
		{
			free(X[i]);
		}
		free(X);
		return NULL;
	}
	
	for (i=0; i<nx; i++)
	{
		for (j=0; j<ny; j++)
		{
			X[i][j] = p;
			p += n_z;
		}
	}

	return X;

};

///////////////////////////////////////////////////////////////////////////////////////
//Initialize a 3D matrix with different sizes in z
///////////////////////////////////////////////////////////////////////////////////////
template<class Tipus> Tipus *** Init_Matrix_3D(int nx, int ny, int ** Size_z)
{
//the dimensions of Size_z must be [nx][ny] 
	Tipus ***X;
	
	X=(Tipus ***)calloc(nx,sizeof(Tipus **));
	if (X==NULL)
	{
		return NULL;
	}

	for (int i=0; i<nx; i++)
	{
		X[i]=(Tipus **)calloc(ny,sizeof(Tipus *));
		if (X[i]==NULL)
		{
			for (int ii=0; ii<i; ii++)
			{
				free(X[ii]);
			}
			free(X);
			return NULL;
		}
	}

	int s = 0;
	for (i=0; i<nx; i++)
	{
		for (int j=0; j<ny; j++)
		{
			s += Size_z[i][j];
		}
	}

	Tipus* p = (Tipus*)calloc(s, sizeof(Tipus));
	if (p == NULL) 
	{
		for (int i=0; i<nx; i++)
		{
			free(X[i]);
		}
		free(X);
		return NULL;
	}
	
	for (i=0; i<nx; i++)
	{
		for (int j=0; j<ny; j++)
		{
			X[i][j] = p;
			p += Size_z[i][j];
		}
	}

	return X;

};

///////////////////////////////////////////////////////////////////////////////////////
//Clear a 3D matrix 
///////////////////////////////////////////////////////////////////////////////////////
template<class Tipus> Tipus *** Free_Matrix_3D(Tipus ***X, int nx)
{
	if (!X)
		return NULL;


	free(X[0][0]);
	
	for (int i=0; i<nx; i++)
	{
		free(X[i]);
	}
 	free(X);

	return NULL;

};

#endif

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -