?? exm12022_1.cpp
字號(hào):
#include <stdio.h> //用于標(biāo)準(zhǔn)I/O程序定義和申明的頭文件
#include "mat.h" //定義MAT文件接入和創(chuàng)建方法的頭文件
#include <string.h> //用于串操作函數(shù)申明的頭文件
#define BUFSIZE 255 //定義緩沖器的最大字節(jié)數(shù)255
//--------------------------子函數(shù)create--------------------------------
int create(const char *file)
{
//變量定義及初始化
MATFile *pmat; //為MAT文件定義指針
mxArray *pa1, *pa2, *pa3; //定義結(jié)構(gòu)體的指針
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); //以標(biāo)準(zhǔn)C格式輸出MAT文件名file
pmat = matOpen(file, "w"); //以“寫”模式打開名為file的MAT文件
//“寫”模式會(huì)刪除那文件中可能存在的原內(nèi)容,并返回文件句柄pmat
if (pmat == NULL) //matOpen的成功執(zhí)行將返回非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為所創(chuàng)(3′3)雙精度實(shí)矩陣的指針
mxSetClassName(pa1, "LocalDouble"); //把pa1所指結(jié)構(gòu)體起名為L(zhǎng)ocalDouble
pa2 = mxCreateDoubleMatrix(3,3,mxREAL);
mxSetClassName(pa2, "GlobalDouble"); //把pa2所指結(jié)構(gòu)體起名為GlobalDouble
memcpy((void *)(mxGetPr(pa2)), (void *)data, sizeof(data));
//把data源緩沖區(qū)中內(nèi)容復(fù)制到pa2所指mxArray實(shí)部的目標(biāo)緩沖區(qū)中
//待復(fù)制的字節(jié)數(shù)為data 的全部字節(jié)
pa3 = mxCreateString("MATLAB: the language of technical computing");
//令pa3為所創(chuàng)字符串的指針
mxSetClassName(pa3, "LocalString"); //把pa3所指結(jié)構(gòu)體起名為L(zhǎng)ocalString
matPutVariable(pmat, "LocalDouble", pa1); //把pa1所指結(jié)構(gòu)體寫入pmat所指MAT文件
matPutVariableAsGlobal(pmat, "GlobalDouble", pa2);
//把pa2所指的結(jié)構(gòu)體以“全局變量”身份寫入pmat所指MAT文件
matPutVariable(pmat, "LocalString", pa3);
//經(jīng)過(guò)以上操作,pa1所指的LocalDouble變量將是(3′3)的全0數(shù)組
//以下兩行指令再把data 源緩沖器中數(shù)據(jù)復(fù)蓋在pa1所指mxArray的全0實(shí)部上
//這樣的程序設(shè)計(jì)是“故意”的,是為了表現(xiàn)可覆蓋性。
memcpy((void *)(mxGetPr(pa1)), (void *)data, sizeof(data));
matPutVariable(pmat, "LocalDouble", pa1);
mxDestroyArray(pa1); //釋放被mxCreate配置過(guò)的pa1所指動(dòng)態(tài)內(nèi)存
mxDestroyArray(pa2); //釋放被mxCreate配置過(guò)的pa2所指動(dòng)態(tài)內(nèi)存
mxDestroyArray(pa3); //釋放被mxCreate配置過(guò)的pa3所指動(dòng)態(tài)內(nèi)存
if (matClose(pmat) != 0) //matClose關(guān)閉pmat所指文件成功,返回0;否則為1。
{
printf("Error closing file %s\n",file);
return(1);
}
//…….以下再次打開剛寫入的MAT文件,并用mxGetArray對(duì)寫入內(nèi)容加以驗(yàn)證……..
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文件中讀出名為L(zhǎng)ocalDouble的結(jié)構(gòu)體,并設(shè)指針為pa1。
if (pa1 == NULL) //檢查讀出操作是否成功
{
printf("Error reading existing matrix LocalDouble\n");
return(1);
}
if (mxGetNumberOfDimensions(pa1) != 2) //檢查pa1所指結(jié)構(gòu)體是否2維
{
printf("Error saving matrix: result does not have two dimensions\n");
return(1);
}
pa2 = matGetVariable(pmat, "GlobalDouble");
//從pmat所指MAT文件中讀出名為GlobalDouble的結(jié)構(gòu)體,并設(shè)指針為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文件中讀出名為L(zhǎng)ocalString的結(jié)構(gòu)體,并設(shè)指針為pa3。
if (pa3 == NULL)
{
printf("Error reading existing matrix LocalString\n");
return(1);
}
mxGetString(pa3, str, 255); //把pa3所指串結(jié)構(gòu)體以C格式復(fù)制到str所指的內(nèi)存中
//被復(fù)制的字符數(shù)不得多于(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配置過(guò)的pa1所指動(dòng)態(tài)內(nèi)存
mxDestroyArray(pa2);
mxDestroyArray(pa3);
if (matClose(pmat) != 0)
{
printf("Error closing file %s\n",file);
return(1);
}
printf("Done\n"); //顯示“整個(gè)子函數(shù)運(yùn)行成功結(jié)束”
return(0); //返回“成功結(jié)束”的數(shù)值標(biāo)志0
}
//--------------------------主程序-------------------------------
int main()
{
int result;
result = create("mattest.mat"); //調(diào)用子程序create創(chuàng)建數(shù)據(jù)文件mattest.mat
return (result==0)?EXIT_SUCCESS:EXIT_FAILURE;
//子程序成功執(zhí)行返回0,并顯示出“成功指型”的提示。
}
?? 快捷鍵說(shuō)明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號(hào)
Ctrl + =
減小字號(hào)
Ctrl + -