📄 matcreat.c
字号:
/*
* MAT-file creation program
* Copyright 1984-2000 The MathWorks, Inc.
*/
/* $Revision: 1.13 $ */
#include <stdio.h>
#include <string.h> /* For strcmp() */
#include <stdlib.h> /* For EXIT_FAILURE, EXIT_SUCCESS */
#include "mat.h" //MAT文件API的头文件,必须添加
#define BUFSIZE 256
int main()
{
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 };
const char *file = "mattest.mat";
char str[BUFSIZE];
int status;
//打开一个MAT文件,如果不存在则创建一个新MAT文件,并检查返回值
//如果打开失败,则返回
printf("Creating file %s...\n\n", file);
pmat = matOpen(file, "w");
if (pmat == NULL)
{
printf("Error creating file %s\n", file);
printf("(Do you have write permission in this directory?)\n");
return(EXIT_FAILURE);
}
//创建一个名为pa1的矩阵,如果创建失败则返回
pa1 = mxCreateDoubleMatrix(3,3,mxREAL);
if (pa1 == NULL)
{
printf("%s : Out of memory on line %d\n", __FILE__, __LINE__);
printf("Unable to create mxArray.\n");
return(EXIT_FAILURE);
}
//创建一个名为pa2的矩阵,如果创建失败则返回
pa2 = mxCreateDoubleMatrix(3,3,mxREAL);
if (pa2 == NULL)
{
printf("%s : Out of memory on line %d\n", __FILE__, __LINE__);
printf("Unable to create mxArray.\n");
return(EXIT_FAILURE);
}
//初始化矩阵pa2
memcpy((void *)(mxGetPr(pa2)), (void *)data, sizeof(data));
//创建一个字符串类型的矩阵,如果创建失败则返回
pa3 = mxCreateString("MATLAB: the language of technical computing");
if (pa3 == NULL)
{
printf("%s : Out of memory on line %d\n", __FILE__, __LINE__);
printf("Unable to create string mxArray.\n");
return(EXIT_FAILURE);
}
//向MAT文件中写入变量pa1,并命名为LocalDouble
status = matPutVariable(pmat, "LocalDouble", pa1);
if (status != 0)
{
printf("%s : Error using matPutVariable on line %d\n", __FILE__, __LINE__);
return(EXIT_FAILURE);
}
//向MAT文件中写入pa2,并命名为GlobalDouble,它是一个全局变量
status = matPutVariableAsGlobal(pmat, "GlobalDouble", pa2);
if (status != 0)
{
printf("Error using matPutVariableAsGlobal\n");
return(EXIT_FAILURE);
}
//向MAT文件中写入变量pa3,并命名为LocalString
status = matPutVariable(pmat, "LocalString", pa3);
if (status != 0)
{
printf("%s : Error using matPutVariable on line %d\n", __FILE__, __LINE__);
return(EXIT_FAILURE);
}
/*
* Ooops! we need to copy data before writing the array. (Well,
* ok, this was really intentional.) This demonstrates that
* matPutVariable will overwrite an existing array in a MAT-file.
*/
//初始化变量pa1
memcpy((void *)(mxGetPr(pa1)), (void *)data, sizeof(data));
//向MAT文件中写入变量pa1,并命名为LocalDouble
status = matPutVariable(pmat, "LocalDouble", pa1);
if (status != 0)
{
printf("%s : Error using matPutVariable on line %d\n", __FILE__, __LINE__);
return(EXIT_FAILURE);
}
/*清除矩阵 */
mxDestroyArray(pa1);
mxDestroyArray(pa2);
mxDestroyArray(pa3);
//关闭MAT文件,如果出错则返回
if (matClose(pmat) != 0)
{
printf("Error closing file %s\n",file);
return(EXIT_FAILURE);
}
/*
* 重新打开MAT文件,并验证文件的内容。如果打开失败则返回
*/
pmat = matOpen(file, "r");
if (pmat == NULL)
{
printf("Error reopening file %s\n", file);
return(EXIT_FAILURE);
}
/*
* 读取变量LocalDouble
*/
pa1 = matGetVariable(pmat, "LocalDouble");
if (pa1 == NULL)
{
printf("Error reading existing matrix LocalDouble\n");
return(EXIT_FAILURE);
}
//验证变量的总维数
if (mxGetNumberOfDimensions(pa1) != 2)
{
printf("Error saving matrix: result does not have two dimensions\n");
return(EXIT_FAILURE);
}
//读取变量GlobalDouble,如果失败则返回
pa2 = matGetVariable(pmat, "GlobalDouble");
if (pa2 == NULL)
{
printf("Error reading existing matrix GlobalDouble\n");
return(EXIT_FAILURE);
}
//验证pa2是否在Matlab的全局工作空间得到
if (!(mxIsFromGlobalWS(pa2))) {
printf("Error saving global matrix: result is not global\n");
return(EXIT_FAILURE);
}
//读取变量LocalString
pa3 = matGetVariable(pmat, "LocalString");
if (pa3 == NULL)
{
printf("Error reading existing matrix LocalString\n");
return(EXIT_FAILURE);
}
//生成字符串
status = mxGetString(pa3, str, sizeof(str));
if(status != 0)
{
printf("Not enough space. String is truncated.");
return(EXIT_FAILURE);
}
//验证字符的内容是否相符
if (strcmp(str, "MATLAB: the language of technical computing"))
{
printf("Error saving string: result has incorrect contents\n");
return(EXIT_FAILURE);
}
/* 退出前必须释放变量的内存 */
mxDestroyArray(pa1);
mxDestroyArray(pa2);
mxDestroyArray(pa3);
//关闭MAT文件
if (matClose(pmat) != 0)
{
printf("Error closing file %s\n",file);
return(EXIT_FAILURE);
}
printf("Done\n");
return(EXIT_SUCCESS);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -