【问题标题】:Detach anonymous function from file in which it's defined从定义匿名函数的文件中分离匿名函数
【发布时间】:2019-10-06 17:27:23
【问题描述】:

我正在寻找解决以下问题的方法:

  • 创建一个包含fun = @(x)(x*x) 的脚本foo.m
  • 运行foo。这将创建变量 fun
  • 删除foo.m
  • 尝试运行fun(2)

在最新版本的 MATLAB(我使用的是 R2019b)中,这会导致错误:

以前可访问的文件“foo.m”现在无法访问。

不知何故,匿名函数与定义它的文件相关联。

是否有可能以某种方式“分离”它,以便即使在文件被删除后它也能继续工作?


对于那些好奇我为什么需要它的人,它适用于 fixingMATLink,Mathematica/MATLAB 接口,适用于最新版本的 MATLAB。

【问题讨论】:

  • @CrisLuengo 这只是一个错字(现已修复)。我打电话给fun。如果 foo.m 被删除,它就不起作用,即使 MATLAB 知道 fun 变量,甚至可以显示定义。
  • 在命令行和脚本中将fun 定义为全局变量是否有效?
  • @rahnema1 不。但它们不是默认全局的吗?
  • 没有。我的意思是如果你使用global 关键字来声明变量。
  • @rahnema1 我明白你想尝试什么。它不会改变任何东西。它对你有用吗?

标签: matlab


【解决方案1】:

您可以使用func2strstr2func 构造一个可以工作的新函数句柄:

more_fun = str2func(func2str(fun));
more_fun(2)

注意,在此之后,fun 仍然找不到,但您也可以直接分配给fun 以使其再次访问。

编辑:刚刚发现一个(记录在案的)限制:如果匿名函数使用外部变量,此方法将不起作用,因为

使用str2func 创建的函数句柄无法访问其本地工作区之外的变量或嵌套函数。如果您的函数句柄包含这些变量或函数,则 MATLAB® 在您调用句柄时会引发错误。

【讨论】:

  • 这个问题和答案一起解释了更多关于 MATLAB 如何在内部工作的信息。很有趣!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-12-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-09-11
  • 2011-04-20
相关资源
最近更新 更多