7.3变量状态

当创建简单的一次性程序时,可以非常方便地在提示下查看哪些变量可用。函数who及其兄弟姐妹whoswhos_line_format将显示有关内存中内容的不同信息,如下所示。

str = "A random string";
who
 -| Variables in the current scope:
 -|
 -| ans  str
 
:who
:who pattern …
:who option pattern …
:C = who (…)

列出当前定义的与给定模式匹配的变量。

有效的模式语法与针对的描述相同clear命令如果未提供任何模式,则会列出所有变量。

默认情况下,只显示在本地作用域中可见的变量。

以下是有效的参数,但不能组合使用。

global

列出全局范围而不是当前范围中的变量。

-regexp

当匹配要显示的变量时,这些模式被认为是正则表达式。接受的相同模式语法regexp函数。

广告
-file

下一个参数被视为文件名。将列出在指定文件中找到的所有变量。从文件中读取变量时不接受任何模式。

广告

如果作为函数调用,则返回与给定模式匹配的已定义变量名称的元胞数组。

详见: whos,isglobal,isvarname,exist,regexp.

广告
 
:whos
:whos pattern …
:whos option pattern …
:S = whos ("pattern", …)

提供与给定模式匹配的当前定义变量的详细信息。

参数和模式语法与的相同who命令

每个变量的扩展信息汇总在一个表中,表中有以下默认分量。

Attr

列出的变量的属性。可能的属性包括:

blank

本地范围中的变量

c

复数类型的变量。

f

形式参数(函数参数)。

g

具有全局范围的变量。

p

持久变量。

广告
Name

变量的名称。

广告
Size

变量的逻辑大小。标量为1x1,向量为1xN或Nx1,二维矩阵为MxN。

广告
Bytes

当前用于存储变量的内存量。

广告
Class

变量的类。示例包括double、single、char、uint16、cell和struct。

广告

该表格可以自定义,以通过该函数显示或多或少的信息whos_line_format.

如果whos作为函数调用,返回与给定模式匹配的定义变量名的结构体数组。结构体中描述每个变量的字段有:名称、大小、字节、类、全局、稀疏、复数、嵌套、持久。

详见: who,whos_line_format.

广告
 
:val= whos_line_format ()
:old_val= whos_line_format (new_val)
:old_val= whos_line_format (new_val地方的

查询或设置命令使用的格式字符串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-minbalance仅当列对齐修饰符与命令“”一起使用时才可用%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是其中之一

1

name是一个变量。

广告
2

name是一个绝对的文件名,在Octave的path,或(在附加'之后.m')Octave的函数文件path.

广告
3

name是'.oct.mex'文件在Octave的path.

广告
5

name是一个内置函数。

广告
7

name是一个目录。

广告
8

name是一个classdef类。

广告
103

name是一个与文件无关的函数(在命令行中输入)。

广告
0

name不存在。

广告

如果可选参数type如果提供了,请仅检查指定类型的符号。有效类型为

"var"

仅检查变量。

广告
"builtin"

仅检查内置函数。

广告
"dir"

仅检查目录。

广告
"file"

仅检查文件和目录。

广告
"class"

仅检查classdef类。

广告

如果没有给定类型并且存在多个可能的名称匹配,exist将根据以下优先级列表返回一个代码:变量、内置函数、oct文件、目录、文件、类。

exist如果一个名为name存在于Octave的搜索路径中。有关不在搜索路径中的其他类型文件的信息,请使用以下函数的组合file_in_pathstat相反

编程注意事项:如果name从一个有缺陷的.oct/.mex文件实现,调用exist可能导致Octave崩溃。为了保持高性能,Octave信任.oct/.mex文件,而不是对它们进行沙盒处理。

详见: file_in_loadpath,file_in_path,dir_in_loadpath,stat.

广告

通常Octave会管理内存,但有时手动从内存中删除变量是可行的。当处理填充了大量内存的大变量时,通常需要这样做。在使用IEEE浮点格式的计算机上,以下程序赋值一个需要大约128 MB内存的矩阵。

large_matrix = zeros (4000, 4000);

因为内存中有此变量可能会减慢其他计算速度,因此可能需要手动将其从内存中删除。这里的clearclearvars函数执行此操作。

 
:clear
:clear pattern
:clear options pattern

删除与给定名称匹配的名称patterns,从而释放内存。

这里的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, -r

这里的pattern参数被视为正则表达式,任何匹配都将被清除。

广告

除了-exclusive-regexp,所有长参数也可以在不带破折号的情况下使用。注意,除了-exclusive,可能只显示一个其他参数。所有参数必须出现在任何模式之前。

编程说明:命令清楚的name仅清除变量name当一个变量和一个名为name当前已定义。例如,假设您定义了一个函数foo,然后通过执行赋值将其隐藏foo = 2.执行命令clear fooonce将清除变量定义并恢复的定义foo作为一种函数。正在执行clear foo第二次将清除函数定义。

当链接到全局变量的局部变量名被清除时,只有该变量的局部副本被删除。全局副本不可访问,可以使用恢复全球的global_varname相反地清除-gglobal_varname将删除局部变量和全局变量。

详见: clearvars,who,whos,exist,mlock.

广告
 
:clearvars
:clearvars pattern
:clearvars -正则表达式pattern
:clearvars 除了pattern
:clearvars …-除了-regexppattern
:clearvars -global …

删除与给定匹配的变量patterns来自内存。

这里的pattern可能包含以下特殊字符:

?

匹配任意单个字符。

广告
*

匹配零个或多个字符。

广告
[ list ]

匹配指定的字符列表list。如果第一个字符是!^,匹配除指定字符外的所有字符list。例如,图案[a-zA-Z]将匹配所有小写和大写字母字符。

广告

如果-regexp参数,然后将后续模式作为正则表达式处理,并清除任何匹配项。

如果-except参数,然后后续模式选择将被清除。

如果-global参数,则所有模式都将应用于全局变量,而不是局部变量。

当在没有自变量的情况下调用时,clearvars删除所有局部变量。

示例代码:

清除以开头的所有变量'x'以及特定变量"foobar"

clearvars x* foobar

清除特定变量"foobar"并使用正则表达式清除以开头的所有变量'x''y'.

clearvars foobar -regexp ^x ^y

清除除之外的所有变量"foobar"

clearvars -except foobar

清除以开头的所有变量"foo",除了那些endingin"bar"

clearvars foo* -except -regexp bar$

详见: clear,who,whos,exist.

广告
 
:pack ()

在中整合作用域内存MATLAB.

提供此函数是为了兼容性,但在Octave中不起任何作用。

详见: clear.

广告

关于函数或变量的信息,如其在文件系统中的位置,也可以从Octave中获取。这通常只在程序开发过程中有用,而不是在程序中有用。

 
:type name
:type qname
:text = type ("name", …)

显示的内容name它可以是文件、函数(m-file)、变量、运算符或关键字。

type通常在描述的类别的标题行之前name例如函数或变量;这里的-q参数抑制此行为。

如果未使用返回变量,则内容将显示在屏幕上。否则,将返回一个字符串元胞数组,其中每个元素对应于每个指定函数的内容。

广告
 
:which name
:[str, …] = which ('name', …)

显示每个的类型name.

如果name是从函数文件中定义的,也会显示文件的全名。

详见: help,lookfor.

广告
 
:what
:what dir
:w = what (dir)

列出目录中特定于Octave的文件dir.

如果dir则使用当前目录。

如果指定返回参数,则在结构体中返回找到的文件w。该结构体包含以下字段:

path

目录的完整路径dir

广告
m

m文件的元胞数组

广告
mat

垫锉的元胞数组

广告
mex

mex文件的元胞数组

广告
oct

oct文件的元胞数组

广告
mdl

mdl文件的元胞数组

广告
slx

slx文件的元胞数组

广告
p

p文件的元胞数组

广告
classes

类目录的元胞数组(@classname/)

广告
packages

包目录的元胞数组(+pkgname/)

广告

兼容性说明:Octave不支持mdl、slx和p文件。what将始终为这些类别返回一个空列表。

详见: which,ls,exist.

广告

版权所有 © 2024-2025 Octave中文网

ICP备案/许可证号:黑ICP备2024030411号-2