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

📄 exm12022_1.cpp

📁 这是学习matlab的好的程序
💻 CPP
字号:
#include <stdio.h>					//用于标准I/O程序定义和申明的头文件
#include "mat.h"						//定义MAT文件接入和创建方法的头文件
#include <string.h>					//用于串操作函数申明的头文件
#define BUFSIZE 255 				//定义缓冲器的最大字节数255

//--------------------------子函数create--------------------------------
int create(const char *file)
{
	//变量定义及初始化
	MATFile *pmat;							//为MAT文件定义指针
	mxArray *pa1, *pa2, *pa3;				//定义结构体的指针
	double data[9] = { 1.0, 4.0, 7.0, 2.0, 5.0, 8.0, 3.0, 6.0, 9.0 };	//定义双精度变量
	char str[BUFSIZE];						//定义字符串
	printf("Creating file %s...\n\n", file);	//以标准C格式输出MAT文件名file
	pmat = matOpen(file, "w");				//以“写”模式打开名为file的MAT文件
				//“写”模式会删除那文件中可能存在的原内容,并返回文件句柄pmat
	if (pmat == NULL)						//matOpen的成功执行将返回非NULL
	{
		printf("Error creating file %s\n", file);
		printf("(do you have write permission in this directory?)\n");
		return(1);									//返回1,表示开启失败。
	}

	pa1 = mxCreateDoubleMatrix(3,3,mxREAL);	//令pa1为所创(3′3)双精度实矩阵的指针
	mxSetClassName(pa1, "LocalDouble");				//把pa1所指结构体起名为LocalDouble
	pa2 = mxCreateDoubleMatrix(3,3,mxREAL);
	mxSetClassName(pa2, "GlobalDouble");				//把pa2所指结构体起名为GlobalDouble
	memcpy((void *)(mxGetPr(pa2)), (void *)data, sizeof(data));
						//把data源缓冲区中内容复制到pa2所指mxArray实部的目标缓冲区中
						//待复制的字节数为data 的全部字节
	pa3 = mxCreateString("MATLAB: the language of technical computing");
															//令pa3为所创字符串的指针
	mxSetClassName(pa3, "LocalString");				//把pa3所指结构体起名为LocalString

	matPutVariable(pmat, "LocalDouble", pa1);					//把pa1所指结构体写入pmat所指MAT文件
	matPutVariableAsGlobal(pmat, "GlobalDouble", pa2);
						//把pa2所指的结构体以“全局变量”身份写入pmat所指MAT文件
	matPutVariable(pmat, "LocalString", pa3);

	//经过以上操作,pa1所指的LocalDouble变量将是(3′3)的全0数组
	//以下两行指令再把data 源缓冲器中数据复盖在pa1所指mxArray的全0实部上
	//这样的程序设计是“故意”的,是为了表现可覆盖性。
	memcpy((void *)(mxGetPr(pa1)), (void *)data, sizeof(data));
	matPutVariable(pmat, "LocalDouble", pa1);

	mxDestroyArray(pa1);			//释放被mxCreate配置过的pa1所指动态内存
	mxDestroyArray(pa2);			//释放被mxCreate配置过的pa2所指动态内存
	mxDestroyArray(pa3);			//释放被mxCreate配置过的pa3所指动态内存

	if (matClose(pmat) != 0) 		//matClose关闭pmat所指文件成功,返回0;否则为1。
	{
		printf("Error closing file %s\n",file);
		return(1);
	}

//…….以下再次打开刚写入的MAT文件,并用mxGetArray对写入内容加以验证……..
	pmat = matOpen(file, "r");	//以“读”模式打开pmat所指的名为file的MAT文件
    if (pmat == NULL) 				//matOpen的成功开启,将返回非NULL。
	{
		printf("Error reopening file %s\n", file);
		return(1);
	}

	pa1 = matGetVariable(pmat, "LocalDouble");
			//从pmat所指MAT文件中读出名为LocalDouble的结构体,并设指针为pa1。
	if (pa1 == NULL)									//检查读出操作是否成功
	{
		printf("Error reading existing matrix LocalDouble\n");
		return(1);
	}
	if (mxGetNumberOfDimensions(pa1) != 2) 	//检查pa1所指结构体是否2维
	{
		printf("Error saving matrix: result does not have two dimensions\n");
		return(1);
	}

	pa2 = matGetVariable(pmat, "GlobalDouble");
			//从pmat所指MAT文件中读出名为GlobalDouble的结构体,并设指针为pa2。
	if (pa2 == NULL)
	{
		printf("Error reading existing matrix GlobalDouble\n");
		return(1);
	}
	if (!(mxIsFromGlobalWS(pa2)))		//检查pa2是否全局变量
	{
		printf("Error saving global matrix: result is not global\n");
		return(1);
	}

	pa3 = matGetVariable(pmat, "LocalString");
			//从pmat所指MAT文件中读出名为LocalString的结构体,并设指针为pa3。
	if (pa3 == NULL) 
	{
		printf("Error reading existing matrix LocalString\n");
		return(1);
	}

	mxGetString(pa3, str, 255);		//把pa3所指串结构体以C格式复制到str所指的内存中
											//被复制的字符数不得多于(255-1)
	if (strcmp(str, "MATLAB: the language of technical computing")) 
					//检查str中字符是否与 "MATLAB: the language of technical computing"相同
	{
		printf("Error saving string: result has incorrect contents\n");
		return(1);
	}

	mxDestroyArray(pa1);			//释放被mxCreate配置过的pa1所指动态内存
	mxDestroyArray(pa2);
	mxDestroyArray(pa3);
	if (matClose(pmat) != 0)
	{
		printf("Error closing file %s\n",file);
		return(1);
	}
	printf("Done\n");					//显示“整个子函数运行成功结束”
	return(0);							//返回“成功结束”的数值标志0
}

//--------------------------主程序-------------------------------
int main()
{
	int result;

	result = create("mattest.mat");			//调用子程序create创建数据文件mattest.mat
	return (result==0)?EXIT_SUCCESS:EXIT_FAILURE;
		//子程序成功执行返回0,并显示出“成功指型”的提示。
}

⌨️ 快捷键说明

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