在编写简单的一次性程序时,能够方便地在提示符下查看当前有哪些变量可用。函数 who 及其同类函数 whos 和 whos_line_format 会显示内存中的不同信息,如下所示。
str = "A random string"; who -| Variables in the current scope: -| -| ans str
pattern … ¶option pattern … ¶C = who (…) ¶列出当前定义的与给定模式匹配的变量。
有效的模式语法与 clear 命令中描述的相同。如果未提供任何模式,则列出所有变量。
默认情况下,仅显示在本地作用域中可见的变量。
以下是有效的选项,但不能组合使用。
global列出全局作用域中的变量,而非当前作用域中的变量。
-regexp在匹配要显示的变量时,这些模式被视为正则表达式。使用与 regexp 函数接受的相同模式语法。
-file下一个参数被当作文件名处理。列出在指定文件中找到的所有变量。从文件读取变量时不接受任何模式。
如果作为函数调用,则返回与给定模式匹配的已定义变量名称的元胞数组。
pattern … ¶option pattern … ¶S = whos ("pattern",…) ¶提供与给定模式匹配的当前定义变量的详细信息。
选项和模式语法与 who 命令相同。
每个变量的扩展信息汇总在一个表中,该表包含以下默认条目。
所列变量的属性。可能的属性有:
本地作用域中的变量
c复数类型的变量。
f形式参数(函数参数)。
g具有全局作用域的变量。
p持久变量。
变量的名称。
变量的逻辑大小。标量为 1x1,向量为 1xN 或 Nx1,二维矩阵为 MxN。
当前用于存储变量的内存量。
变量的类。示例包括 double、single、char、uint16、cell 和 struct。
该表可以通过函数 whos_line_format 自定义以显示更多或更少的信息。
如果 whos 作为函数调用,则返回与给定模式匹配的定义变量名的结构体数组。描述每个变量的结构体字段包括:name、size、bytes、class、global、sparse、complex、nesting、persistent。
另请参阅: who,whos_line_format。
val = whos_line_format () ¶old_val = whos_line_format (new_val) ¶old_val = whos_line_format (new_val, "local") ¶查询或设置命令 whos 使用的格式字符串。
完整的格式字符串为:
%[modifier]<command>[:width[:left-min[:balance]]];
以下命令序列可用:
%a打印变量的属性(c=复数、s=稀疏、f=形式参数、g=全局、p=持久)。
%b打印变量占用的字节数。
%c打印变量的类名。
%e打印变量包含的元素。
%n打印变量名。
%s打印变量的维度。
%t打印变量的类型名称。
每个命令还可以有一个对齐修饰符:
l左对齐。
r右对齐(默认)。
c列对齐(仅适用于命令 %s)。
width 参数是一个正整数,指定用于打印的最小列数。不需要最大值,因为字段会根据需要自动扩展。
参数 left-min 和 balance 仅当列对齐修饰符与命令 %s 一起使用时才可用。balance 指定在字段宽度内将在各条目之间对齐的列号。编号从 0 开始,表示最左侧的列。left-min 指定指定平衡列左侧的最小字段宽度。
默认格式为:
" %la:5; %ln:6; %cs:16:6:1; %rb:12; %lc:-1;\n"
当从函数内部以 "local" 参数调用时,该变量会在函数及其调用的任何子程序中被本地更改。退出函数时将恢复原始变量值。
另请参阅: whos。
除了显示内存中有哪些变量之外,还可以判断某个给定变量是否可用。这样就可以根据变量的存在与否来改变程序的行为。下面的示例说明了这一点。
if (! exist ("meaning", "var"))
disp ("The program has no 'meaning'");
endif
c = exist (name) ¶c = exist (name, type) ¶检查 name 作为变量、函数、文件、目录或类的存在性。
返回代码 c 是以下之一:
name 是一个变量。
name 是一个绝对文件名,或是 Octave 的 path 中的一个普通文件,或者是(在附加 .m 后)Octave 的 path 中的一个函数文件。
name 是 Octave 的 path 中的一个 .oct 或 .mex 文件。
name 是一个内置函数。
name 是一个目录。
name 是一个 classdef 类。
name 是一个不与文件关联的函数(在命令行中输入)。
name 不存在。
如果提供了可选参数 type,则仅检查指定类型的符号。有效的类型有:
"var"仅检查变量。
"builtin"仅检查内置函数。
"dir"仅检查目录。
"file"仅检查文件和目录。
"class"仅检查 classdef 类。
如果未给定类型,且名称存在多个可能的匹配,exist 将根据以下优先级列表返回一个代码:变量、内置函数、oct 文件、目录、文件、类。
如果在 Octave 的搜索路径中存在名为 name 的普通文件,exist 将返回 2。对于不在搜索路径中的其他类型文件的信息,请改用函数 file_in_path 和 stat 的组合。
编程注意事项:如果 name 是由有缺陷的 .oct/.mex 文件实现的,调用 exist 可能会导致 Octave 崩溃。为了保持高性能,Octave 信任 .oct/.mex 文件而不对它们进行沙箱隔离。
通常 Octave 会管理内存,但有时手动从内存中删除变量也是实用的。当处理占用大量内存的大变量时,通常需要这样做。在使用 IEEE 754 浮点格式的计算机上,以下程序分配了一个需要约 128 MB 内存的矩阵。
large_matrix = zeros (4000, 4000);
由于将此变量保留在内存中可能会减慢其他计算的速度,因此可能有必要手动将其从内存中删除。clear 或 clearvars 函数可以执行此操作。
pattern … ¶options pattern … ¶删除与给定 pattern 匹配的名称,从而释放内存。
pattern 可以包含以下特殊字符:
?匹配任意单个字符。
*匹配零个或多个字符。
[ list ]匹配由 list 指定的字符列表。如果第一个字符是 ! 或 ^,则匹配除 list 中指定字符以外的所有字符。例如,模式 [a-zA-Z] 将匹配所有小写和大写字母字符。在 Windows 上,方括号按字面意义匹配,不用于对字符进行分组。
例如,命令
clear foo b*r
清除名称为 foo 以及所有以字母 b 开头并以字母 r 结尾的名称。
如果在没有任何参数的情况下调用 clear,则会从当前作用域中清除所有用户定义的变量(即局部变量)。当前作用域中存在的任何全局变量将不再可见,但它们将继续存在于全局作用域中。函数不受此形式 clear 的影响。
以下参数有长短两种形式:
all,-all,-a从符号表中清除所有局部和全局用户定义的变量以及所有函数。
-exclusive,-x清除不匹配以下模式的变量。
functions,-functions,-f从函数符号表中清除函数名称。除非函数已被 mlock 锁定在内存中,否则持久变量将被重新初始化为其默认值。
global,-global,-g清除全局变量名。
variables,-variables,-v清除局部变量名。
classes,-classes,-c清除类结构体表和所有对象。
-regexp,-rpattern 参数被视为正则表达式,任何匹配项都将被清除。
除了 -exclusive 和 -regexp 之外,所有长参数也可以不带破折号使用。注意,除了 -exclusive 外,每个调用只能指定一个其他参数。所有参数必须出现在任何模式之前。
编程说明:命令 clear name 仅清除变量 name,但前提是当前已定义了一个名为 name 的变量和一个同名函数。例如,假设您定义了一个函数 foo,然后通过执行赋值 foo = 2 将其隐藏。执行一次 clear foo 将清除变量定义并恢复 foo 作为函数的定义。再次执行 clear foo 将清除函数定义。
当清除链接到全局变量的局部变量名时,仅删除该变量的本地副本。全局副本仍然存在,可以使用 global global_varname 恢复访问。相反,clear -g global_varname 将同时删除局部变量和全局变量。
pattern … ¶-regexp pattern … ¶… -except pattern … ¶… -except -regexp pattern … ¶-global … ¶从内存中删除与给定 pattern 匹配的变量。
pattern 可以包含以下特殊字符:
?匹配任意单个字符。
*匹配零个或多个字符。
[ list ]匹配由 list 指定的字符列表。如果第一个字符是 ! 或 ^,则匹配除 list 中指定字符以外的所有字符。例如,模式 [a-zA-Z] 将匹配所有小写和大写字母字符。在 Windows 上,方括号按字面意义匹配,不用于对字符进行分组。
clearvars 可以以与 clear 相同的方式使用,但接受 -except 选项,该选项允许指定不应删除的变量。允许使用 -regexp 和 -except 选项的任意组合,但 -except 必须始终位于要保留的模式之前。所有参数和模式必须出现在 -global 之后。如果使用了 -global,则只有全局变量会被清除。
在开发过程中(而非在已完成的程序中),能够检查变量名中使用了哪些字符通常很有用。以下示例说明了这一点。
isvarname ("foo")
-| 1
在程序的开发过程中有用,在已完成的程序中则不太有用。
name … ¶-q name … ¶text = type ("name",…) ¶显示 name 的内容,它可以是文件、函数(m 文件)、变量、运算符或关键字。
type 通常会在前面加上一行描述 name 类别(如函数或变量)的标题行;-q 选项会抑制此行为。
如果未使用输出变量,则内容显示在屏幕上。否则,返回一个字符串元胞数组,其中每个元素对应于每个请求的函数的内容。
dir ¶w = what (dir) ¶列出目录 dir 中特定于 Octave 的文件。
如果未指定 dir,则使用当前目录。
如果请求返回参数,则找到的文件在结构体 w 中返回。该结构体包含以下字段:
目录 dir 的完整路径
m 文件的元胞数组
mat 文件的元胞数组
mex 文件的元胞数组
oct 文件的元胞数组
mdl 文件的元胞数组
slx 文件的元胞数组
p 文件的元胞数组
类目录的元胞数组(@classname/)
包目录的元胞数组(+pkgname/)
兼容性说明:Octave 不支持 mdl、slx 和 p 文件。what 对这些类别将始终返回空列表。
版权所有 © 2024-2026 Octave中文网
ICP备案/许可证号:黑ICP备2024030411号-4