我在MATLAB R2014b上,有一个问题,我将通过以下示例说明.
MWE可以如下制作或在此处下载为.zip文件.
+test在路径上创建一个包文件夹,其中包含四个函数文件:
+test
a.m
b.m
c.m
d.m
Run Code Online (Sandbox Code Playgroud)
内容a.m:
function a
disp 'Hello World!'
Run Code Online (Sandbox Code Playgroud)
内容b.m:
function b
a
Run Code Online (Sandbox Code Playgroud)
如果从命令行运行b,则必须先导入test包(import test.*)或运行test.b.
运行b将导致错误,因为函数的范围b不包含函数a.我们必须先导入它才能使用它.为此,我创造了c.m:
function c
import test.*
a
Run Code Online (Sandbox Code Playgroud)
现在运行c正常.
现在我的问题.如果我c.m改为(保存在d.m):
function d
a
import test.*
Run Code Online (Sandbox Code Playgroud)
即在调用package函数之后发出import命令a.运行d仍然可以正常工作,就好像导入命令的位置d.m无关紧要.导入似乎在调用函数之前发生a,这在d.m导入之前的行上发生.
为什么会这样呢?这是预期的行为,它的用途是什么?MATLAB如何以及以何种顺序读取.m文件并对其进行处理?更偏离主题,但总的来说:与MATLAB相比,如何导入以不同语言处理的包,命令的顺序是否重要?
我基于注释的先发制人的结论:最好只在MATLAB代码开头或附近使用导入函数.这清楚地显示了导入的内容在整个元素中可用(例如,功能).它还可以防止错误的假设,即在导入之前,内容尚未可用或引用具有相同名称的其他内容.
标题可能听起来很奇怪.所以这是一个例子.
Say length是在MATLAB中广泛使用的关键字或内部函数,有人保存了一个名为的变量length.
我可以运行以下脚本而没有任何问题,但是如果我将它放在一个函数中它会产生错误(使用R2015b)
一个有效的脚本
clear length;
length = [1 2 4];
la = length;
clear length;
b = length(la);
Run Code Online (Sandbox Code Playgroud)
功能不起作用
function test(a)
length = [1 2 4];
save('data.mat','length');
clear length;
load('data.mat');
% load
la = length;
clear length;
b = length(la);
end
Run Code Online (Sandbox Code Playgroud)
错误:引用已清除的变量长度.
为什么会这样?MATLAB如何以不同方式处理这些情况?这应该发生在其他功能/关键字上吗?
我在Matlab R2012b中遇到了一个令人费解的错误.似乎也是数据类型的变量名称表现出奇怪的行为.请看这个小例子:
function [] = test1()
dataset = 1;
if dataset ~= 0
disp hello
end
end
Run Code Online (Sandbox Code Playgroud)
正如预期的那样test1()产生输出的调用hello.现在,dataset我不是在我的函数中设置值,而是运行一个脚本.
function [] = test2()
myscript;
if dataset ~= 0
disp hello
end
end
Run Code Online (Sandbox Code Playgroud)
哪myscript.m一条有一条线:
dataset=1;
Run Code Online (Sandbox Code Playgroud)
现在,当我打电话时,test2()我收到此错误:
Undefined function 'ne' for input arguments of type 'dataset'.
Error in test2 (line 4)
if dataset ~= 0
Run Code Online (Sandbox Code Playgroud)
(原谅名为变量的变量dataset- 我知道它也是数据类型的名称,它出现在我正在运行的代码中.)所以好像在test2,Matlab创建一个空dataset对象而不是使用名为的变量dataset.此外,仅当我在脚本中而不是在函数体中设置值时,才会出现此行为.更奇怪的是,我能做到:
>> dbstop in test2 at 4 % line …Run Code Online (Sandbox Code Playgroud)