How can I delete variables in my MAT-file without loading them into MATLAB 7.2 (R2006a)?

150 views (last 30 days)
I would like to delete variables in a MAT-file without loading them into MATLAB first.
For example, I have a file called myFile.mat which contains many variables resulting in a large MAT-file which is slow to load. I don't need all of the variables in the file.

Accepted Answer

MathWorks Support Team
MathWorks Support Team on 10 Nov 2015
MATLAB itself does not offer any functionality for deleting a particular variable from a MAT file.
 
However the MAT FILE API provides the matDeleteVariable function which allows you to delete a variable from a MAT file by its name. You can create a small MEX function in order to call matDeleteVariable. An example is attached.
 
  2 Comments
Matt J
Matt J on 28 Jul 2017
I tweaked the code to allow multiple variables to be deleted in a single call, in case anyone finds it useful.
#include "mex.h"
#include "mat.h"
/* This function removes one or more variables from a MAT file
* Compile it with
* >>mex rmvarMatfileMEX.c
* Afterwards call it with
* >> rmvarMatfileMEX(FILENAME_WITH_EXTENSION,...variables....)
* e.g.
* >> rmvarMatfileMEX('MyFile.mat','var1','var2',...)
*/
void mexFunction( int nlhs, mxArray *plhs[], int nrhs, const mxArray *prhs[])
{
MATFile *f;
char *filename;
char *vname;
int tmp;
if (nrhs >= 2 )
{
if (!mxIsChar(prhs[0]) || !mxIsChar(prhs[0]))
{
mexErrMsgIdAndTxt("RemoveVariableFromMatFile:ClassInputArguments","This function expects the inputs to be char.");
}
filename = mxArrayToString(prhs[0]);
f = matOpen(filename,"u");
if (f == NULL)
{
mxFree(filename);
mexErrMsgIdAndTxt("RemoveVariableFromMatFile:UnableToOpenFile","Could not open file. Make sure the file exists and is accessible.");
}
for (int i=1;i<nrhs;i++)
{
vname = mxArrayToString(prhs[i]);
tmp = matDeleteVariable(f,vname);
if ( tmp != 0)
{
mexWarnMsgIdAndTxt("RemoveVariableFromMatFile:UnableToDeleteVariable","Could not delete variable. Make sure that the variable exists.");
}
mxFree(vname);
vname=NULL;
}
matClose(f);
mxFree(filename);
}
}

Sign in to comment.

More Answers (2)

BenRaanan
BenRaanan on 26 Jan 2018
This worked great for me. Thank you
  3 Comments
Walter Roberson
Walter Roberson on 22 Jan 2020
Yes this is expected behavior. Variables are deleted in mat files by marking them unused. The next time that a variable is to be written to the file in append mode, if the new variable fits into the vacant space then it will be written there (with any unused space marked as available). mat files are not compacted until they are overwritten as a whole.

Sign in to comment.


David szpliman
David szpliman on 19 Sep 2018

Great Genius! Problem solved!

Categories

Find more on Variables in Help Center and File Exchange

Products


Release

R2006a

Community Treasure Hunt

Find the treasures in MATLAB Central and discover how the community can help you!

Start Hunting!