Define persistent variable
persistent X Y Z
persistent X Y Z defines
Z as variables that are local to the function
in which they are declared; yet their values are retained in memory
between calls to the function. Persistent variables are similar to
global variables because the MATLAB® software creates permanent
storage for both. They differ from global variables in that persistent
variables are known only to the function in which they are declared.
This prevents persistent variables from being changed by other functions
or from the MATLAB command line.
Whenever you clear or modify a function that is in memory, MATLAB also
clears all persistent variables declared by that function. To keep
a function in memory until MATLAB quits, use
If the persistent variable does not exist the first time you
persistent statement, it is initialized
to the empty matrix.
It is an error to declare a variable persistent if a variable with the same name exists in the current workspace. MATLAB also errors if you declare any of a function's input or output arguments as persistent within that same function. For example, the following persistent declaration is invalid:
function myfun(argA, argB, argC) persistent argB
This function writes a large array to a spreadsheet file and
then reads several rows from the same file. Because you only need
to write the array to the spreadsheet one time, the program tests
whether an array can be read from the file and, if so, does not waste
time in repeating that task. By defining the
as persistent, you can easily check whether the array has been read
from the spreadsheet file.
Here is the
function arrayToXLS(A, xlsfile, x1, x2) persistent dblArray; if isempty(dblArray) disp 'Writing spreadsheet file ...' xlswrite(xlsfile, A); end disp 'Reading array from spreadsheet ...' dblArray = xlsread(xlsfile, 'Sheet1', [x1 ':' x2]) fprintf('\n');
Run the function three times and observe the time elapsed for each run. The second and third run take approximately one tenth the time of the first run in which the function must create the spreadsheet:
largeArray = rand(4000, 200); tic, arrayToXLS(largeArray, 'myTest.xls','E254', 'J256'), toc Writing spreadsheet file ... Reading array from spreadsheet ... dblArray = 0.0982 0.3783 0.1264 0.7880 0.1902 0.5811 0.2251 0.2704 0.5682 0.7271 0.8028 0.2834 0.6453 0.5568 0.8254 0.4961 0.9096 0.5402 Elapsed time is 8.990525 seconds. tic, arrayToXLS(largeArray, 'myTest.xls','E257', 'J258'), toc Reading array from spreadsheet ... dblArray = 0.4620 0.3781 0.6386 0.5930 0.0946 0.4865 0.1605 0.1251 0.8709 0.5188 0.6702 0.2138 Elapsed time is 0.912534 seconds. tic, arrayToXLS(largeArray, 'myTest.xls','E259', 'J262'), toc Reading array from spreadsheet ... dblArray = 0.7015 0.6588 0.4023 0.0359 0.4512 0.6097 0.1308 0.6441 0.0431 0.6396 0.7481 0.8688 0.8278 0.2686 0.5475 0.8550 0.5896 0.1080 0.9437 0.1671 0.0505 0.1203 0.2461 0.7306 Elapsed time is 0.928843 seconds.
Now clear the
arrayToXLS function from
memory and observe that running it takes much longer again:
clear functions tic, arrayToXLS(largeArray, 'myTest.xls','E263', 'J264'), toc Writing spreadsheet file ... Reading array from spreadsheet ... dblArray = 0.6292 0.7788 0.0732 0.6481 0.9299 0.8631 0.7700 0.5181 0.9805 0.5092 0.8658 0.4070 Elapsed time is 7.603461 seconds.