External Interfaces/API | ![]() ![]() |
Examples of MAT-Files
This section includes C and Fortran examples of writing, reading, and diagnosing MAT-files. The examples cover the following topics:
Creating a MAT-File in C
This sample program illustrates how to use the library routines to create a MAT-file that can be loaded into MATLAB. The program also demonstrates how to check the return values of MAT-function calls for read or write failures.
/* * MAT-file creation program * * See the MATLAB API Guide for compiling information. * * Calling syntax: * * matcreat * * Create a MAT-file which can be loaded into MATLAB. * * This program demonstrates the use of the following functions: * * matClose * matGetVariable * matOpen * matPutVariable * matPutVariableAsGlobal * * Copyright 1984-2000 The MathWorks, Inc. * $Revision: 1.9 $ */ #include <stdio.h> #include <string.h> /* For strcmp() */ #include <stdlib.h> /* For EXIT_FAILURE, EXIT_SUCCESS */ #include "mat.h" #define BUFSIZE 256 int main() { MATFile *pmat; 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; 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 = 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 = 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); } 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); } status = matPutVariable(pmat, "LocalDouble", pa1); if (status != 0) { printf("%s : Error using matPutVariable on line %d\n", __FILE__, __LINE__); return(EXIT_FAILURE); } status = matPutVariableAsGlobal(pmat, "GlobalDouble", pa2); if (status != 0) { printf("Error using matPutVariableAsGlobal\n"); return(EXIT_FAILURE); } 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. */ memcpy((void *)(mxGetPr(pa1)), (void *)data, sizeof(data)); status = matPutVariable(pmat, "LocalDouble", pa1); if (status != 0) { printf("%s : Error using matPutVariable on line %d\n", __FILE__, __LINE__); return(EXIT_FAILURE); } /* Clean up. */ mxDestroyArray(pa1); mxDestroyArray(pa2); mxDestroyArray(pa3); if (matClose(pmat) != 0) { printf("Error closing file %s\n",file); return(EXIT_FAILURE); } /* Re-open file and verify its contents with matGetVariable. */ pmat = matOpen(file, "r"); if (pmat == NULL) { printf("Error reopening file %s\n", file); return(EXIT_FAILURE); } /* Read in each array we just wrote. */ 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); } pa2 = matGetVariable(pmat, "GlobalDouble"); if (pa2 == NULL) { printf("Error reading existing matrix GlobalDouble\n"); return(EXIT_FAILURE); } if (!(mxIsFromGlobalWS(pa2))) { printf("Error saving global matrix: result is not global\n"); return(EXIT_FAILURE); } 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); } /* Clean up before exit. */ mxDestroyArray(pa1); mxDestroyArray(pa2); mxDestroyArray(pa3); if (matClose(pmat) != 0) { printf("Error closing file %s\n",file); return(EXIT_FAILURE); } printf("Done\n"); return(EXIT_SUCCESS); }
To produce an executable version of this example program, compile the file and link it with the appropriate library. Details on how to compile and link MAT-file programs on the various platforms are discussed in the section, Compiling and Linking MAT-File Programs.
Once you have compiled and linked your MAT-file program, you can run the stand-alone application you have just produced. This program creates a MAT-file, mattest.mat
, that can be loaded into MATLAB. To run the application, depending on your platform, either double-click on its icon or enter matcreat
at the system prompt.
To verify that the MAT-file has been created, at the MATLAB prompt enter
whos -file mattest.mat Name Size Bytes Class GlobalDouble 3x3 72 double array (global) LocalDouble 3x3 72 double array LocalString 1x43 86 char array Grand total is 61 elements using 230 bytes
![]() | Finding Associated Files | Reading a MAT-File in C | ![]() |