最近我在matlab代码中发现了一个问题,即在函数中调用assignin('caller',...)
以在调用函数中创建新变量,如果变量名与路径中的matlab函数名同名。
这是一个简单的代码片段,仅用于演示此问题。
function myfunctest
sin = 0;
subfcn_set; % call subfcn_set to make a new variable
whos % list variables in current workspace
sin % raise error because it calls the sin function
end
function subfcn_set
assignin('caller', 'sin', 'I am sine');
end
将代码段保存到myfunctest.m
并在matlab中运行
>> myfunctest
Name Size Bytes Class Attributes
sin 1x9 18 char
sin =
I am sine
一切看起来都不错。但是,如果我删除sin = 0
中的myfunctest
并再次运行,
>> myfunctest
Name Size Bytes Class Attributes
sin 1x9 18 char
Error using sin
Not enough input arguments.
Error in myfunctest (line 8)
sin
即使变量sin
存在,也会调用内置sin
函数,如whos
所示。这也适用于路径中的其他matlab函数名称。
如果我们将变量名称从sin
更改为其他内容,例如notafunc
,则无论初始化如何,一切都会很好。
>> myfunctest
Name Size Bytes Class Attributes
notafunc 1x13 26 char
notafunc =
I am notafunc
答案 0 :(得分:1)
这实际上不是"问题"。来自assignin
的文档:
assignin(ws, 'var', val)
将值val赋给工作空间ws中的变量var
。var
输入必须只是数组名称;它不能包含数组索引。如果指定的工作区中不存在var
,则assignin
会创建它。
由于命名空间中存在函数sin()
,因此matlab不会创建变量。
除此之外,我不推荐这种方法,因为它会使用你的代码混淆其他人。如果你不知道这条线存在,你将不会意识到会发生什么。如果子函数在与使用子函数的函数相同的.m文件中定义,则可以对其他函数的子函数进行例外处理。但是,即使这样,在文件很大的情况下也应该稀疏地使用它。