matlab中的变量命名空间

时间:2016-04-04 14:57:27

标签: matlab namespaces workspace

最近我在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

1 个答案:

答案 0 :(得分:1)

这实际上不是"问题"。来自assignin的文档:

  

assignin(ws, 'var', val)将值val赋给工作空间ws中的变量varvar输入必须只是数组名称;它不能包含数组索引。如果指定的工作区中不存在var,则assignin会创建它。

由于命名空间中存在函数sin(),因此matlab不会创建变量。

除此之外,我不推荐这种方法,因为它会使用你的代码混淆其他人。如果你不知道这条线存在,你将不会意识到会发生什么。如果子函数在与使用子函数的函数相同的.m文件中定义,则可以对其他函数的子函数进行例外处理。但是,即使这样,在文件很大的情况下也应该稀疏地使用它。