
1.6.3 常用的工作空间管理命令
MATLAB为管理工作空间提供了方便、快捷的命令,这些命令包括who、whos、clear、clearvars、save、load、pack等,下面讨论它们的用法。
1.who、whos
who命令用来列出当前工作区中的变量,它只列出变量的名称,要获取变量更详细的信息,则需使用提供详细信息的whos命令。例如,在工作区已经建立了两个变量t和y,则有:

使用whos,则有:

2.clear
clear命令在1.3.3节中已经介绍过,这里不再重复。
3.clearvars
clearvars命令用来清理内存中的变量,当使用clearvars variables时,删除由variables指定的变量。对于其中的全局变量,命令clearvars只将其清除出当前的工作区,那些声明该变量为全局变量的函数,仍然能够访问该全局变量。
(1)clearvars-except keepVariables。
这种调用格式会把keepVariables指定变量外的所有变量清除干净,使用这种语法构成可留下特定的变量,并移除所有其他的变量。例如:

(2)clearvars variables-except keepVariables。
使用这种格式时,会将keepVariables指定的变量保存,将variables指定的变量删除。例如:

4.save
MATLAB使用save命令将工作空间中的变量保存到文件。常用的格式为save(filename),它将当前工作区中的所有变量保存到以字符串filename命名的MAT文件中去。其中的MAT文件是MATLAB的一种格式化的二进制文件。例如,先创建一个变量a,将其保存在当前的工作区中:

然后删除当前工作空间中的变量a,当再次使用该变量的数据时,只需要在主页中,利用导入数据功能即可将a导入工作空间,进而加以使用,如图1-42所示。

图1-42 将保存的数据导入工作空间
除使用save(filename)这种格式保存变量到文件外,还可以使用主页的“保存工作区”菜单命令保存变量到文件,如图1-43所示。

图1-43 利用“保存工作区”菜单命令保存变量到文件
save命令使用指定变量名的save(filename,variables)格式,它将指定的变量保存到文件中。其中,filename是文件名字符串,variables是被保存变量名字符串。需要特别注意的是,变量名不能直接作为参数使用,否则出错。例如,已知在工作区中有x、y变量,试比较:

如果不使用函数形式的括号,则save后边可以直接使用文件名和变量名。例如:

这种调用格式同样可以保存变量x和y到文件xy.mat,其中变量x和y之间用空格分隔。在这种调用格式下,x和y之间的分隔不能使用逗号。试对比一下:

其实这种差异很容易理解,当使用空格分隔时,save命令将文件名后边的所有变量当作输出对象,都输出到文件。当使用逗号时,MATLAB对save xy1.mat x,y的解释是:它不是一条命令,它是以逗号隔开的两条命令,即①save xy1.mat x和②y,对这两条命令逐条执行,则①只保存x变量,而②输出y的值到屏幕。
在这种调用格式中,save后边跟着文件名,它默认是.mat文件。即使用户使用其他的文件扩展名,也不能改变其存储格式。例如:

尝试将x和y保存为.txt文本,虽然MATLAB在执行时顺利完成,但打开xy.txt会发现,它还是.mat的二进制文件。如图1-44所示是使用UltraEdit打开的xy.txt,虽然外观上是.txt文件,但本质上是不可读的。

图1-44 外观上的.txt文件
其实,MATLAB给出了将数据保存成可读ASCII文件的调用方法。例如,如下两种格式都可以保存为.txt文件:

5.load
load命令能够将数据从.mat文件调入工作空间。其最简洁的格式为s = load(filename),它将.mat文件中的变量读入一个结构数组,或者把数据从ASCII文件中读入双精度的矩阵。例如:

load命令允许用户指定读入的变量,使用load(filename,variables)格式,其中变量格式为如下的一种。
(1)var1,var2,...,在这种格式下,会读入列表中的变量,使用通配符“*”可匹配任意类型。例如,load('a*')会读入所有变量名中以a字母开头的变量。
(2)'-regexp',expressions,这种格式只读入与指定的正则表达式相匹配的变量。关于正则表达式的更多信息,用户可在命令行窗口利用doc regexp进行深入了解。例如:

load命令允许使用指定的文件格式读取变量,如load(filename,'-mat',variables)格式强制load命令以.mat文件格式处理将要读入的文件,而不必考虑实际上该文件本身是不是这种.mat文件,指定的选项variables可随意;再如,load(filename,'-ascii')格式强制load命令以ASCII格式处理要读入的文件,而不必考虑实际上该文件本身是不是ASCII格式文件。例如:

和save命令类似,load命令允许使用命令行格式,也就是不带括号的格式。使用这种格式时,不必再将参数以单引号括起来,和前边我们学习过的save命令一样。在这种格式下,参数变量以空格分隔,而不能使用逗号分隔,否则也会出现在学习save命令时所讨论的那种丢失参数的现象。
值得注意的是,如果使用load命令时没有指定文件名称,那么load命令就搜索默认文件MATLAB.mat,找到该文件后,读入该文件。
当读入的文件是ASCII文件时,ASCII文件必须是规整的数据文件,也就是说,ASCII文件中的数据,每行必须含有相同个数的数据。否则使用load命令加载时会出错。ASCII文件中的每行各数据之间的分隔符,可以是空格、逗号、分号或退格键退出的Tab位,数据文件中允许有MATLAB的注释行。Load命令会忽略注释行而不予读入。
6.pack
在MATLAB中,pack命令常常用来整理内存,常用的调用格式有3种,分别为:pack;pack filename;pack('filename')。其中,第3种是第2种的函数格式。pack命令通过重新整理MATLAB工作空间中驻留的变量,将原来碎片化的内存整理为连续的内存,这样化零为整,可以显著提高内存的使用效率。
根据MATLAB的帮助文件,可知其整理步骤大致为:将基本空间及全局工作空间中的变量保存到一个临时的.mat文件中;清空内存中所有的变量与函数;重新加载临时.mat文件中保存的基本空间和全局空间变量,然后删掉临时文件。
这样一来,重新分配的空间将是连续的,避免了整理之前内存的碎片化问题。
具体使用时,还需要注意以下几点:pack命令不能提高操作系统分配给MATLAB的虚拟内存数量;pack命令只能在MATLAB的命令行使用;使用文件名参数的格式时,对于文件要写入的文件夹,用户必须有写入权(可写入);要想在运行pack命令时继续保有持续性变量(Persistent Variables),则需使用mlock函数先锁定内存;pack命令无法保留超过2GB的变量,它将从工作区清除这些变量。
将工作目录转换到一个可写入的文件夹下,运行pack命令,然后再返回先前的文件夹中,则可按照如下代码执行:
