我刚刚发现(令我惊讶)调用以下函数
function foo()
if false
fprintf = 1;
else
% do nothing
end
fprintf('test')
Run Code Online (Sandbox Code Playgroud)
给出和错误Undefined function or variable "fprintf".我的结论是变量的范围是在运行之前确定的(在我有限的理解中如何解释计算机语言,特别是Matlab的工作原理).有人能给我一些背景信息吗?
编辑
我上面忘记提到的另一个有趣的事情是
function foo()
if false
fprintf = 1;
else
% do nothing
end
clear('fprintf')
fprintf('test')
Run Code Online (Sandbox Code Playgroud)
生产Reference to a cleared variable fprintf.
在MATLAB中使用函数作为"常量"变量的偶尔会很方便.但是当我最近使用此功能时,我遇到了意外错误.当我在下面运行MWE时,Undefined function or variable 'a'.尽管功能在同一个文件中清晰可用,但我得到了错误.当我发表if声明时,错误消失了.这似乎暗示MATLAB预先解释a为变量,即使永远不会到达变量赋值行,忽略了存在同名函数的事实.这是一个MATLAB错误还是某种想要的行为?
这是MWE:
function matlabBugTest( )
if false
a = 'foo';
end
a
end
function b = a()
b = 'bar';
end
Run Code Online (Sandbox Code Playgroud)
我知道有意为变量和函数使用相同的名称似乎很奇怪,所以我将举例说明这可能有用.例如,您可能希望使用函数来存储某些常量(如文件路径),但也希望能够在找不到该函数时使用不同的值.这种情况可能如下:
if ~exist('pathConstant.m', 'file')
pathConstant = 'C:\some\path';
end
load(fullfile(pathConstant, 'filename.ext'));
Run Code Online (Sandbox Code Playgroud)
我知道语言设计决策通常是困难和复杂的,但MATLAB选择忽略同名函数的一个更不幸的后果是它破坏了函数和脚本/命令行之间的兼容性.例如,以下在脚本中运行时没有问题:
if false
a = 'foo';
end
a
Run Code Online (Sandbox Code Playgroud)
其中函数a(如上所示)保存在自己的文件中.
我是MATLAB的新手并尝试在循环中运行循环.ID例如,我事先定义了一个变量ID={'100'}.在我的循环中,然后我想转到ID的目录,然后在那里加载matfile.但是,每当我加载matfile时,突然ID定义会被所有可能的ID(目录中ID 100所有的所有文件夹)覆盖.这是我的代码 - 我也试过fullfile,但到目前为止没有运气:
ID={'100'}
for subno=1:length(ID) % first loop
try
for sessno=1:length(Session) % second loop, for each ID there are two sessions
subj_name = ([ID{subno} '_' Session{sessno} '_vectors_SC.mat']);
cd(['C:\' ID{subno} '\' Session{sessno}]);
load(subj_vec_name) % the problem occurs here, when loading, not before
end
end
end
Run Code Online (Sandbox Code Playgroud)
然后,当我检查ID的长度时,它现在不是1(一个ID,即100),但是目录中的所有可能ID都是100,并且循环再次针对所有其他可能的ID进行迭代(尽管它应该在ID 100之后停止).