有没有一种方法可以在Matlab GUI中将字符串转换为函数调用?

时间:2019-04-25 09:13:59

标签: string matlab matlab-gui matlab-app-designer

我试图在另一个matlab GUI中调用一个matlab GUI。该matlab GUI具有一个字符串名称,该字符串可在GUI内部使用。我想知道如何将此字符串更改为函数,以便可以调用它来打开GUI。

因此,我的问题是;如何将字符串转换为函数,以便它可以调用matlab中的另一个GUI?

我正在尝试在Matlab应用设计器中构建GUI。这个想法是GUI启动功能需要一个名为AutomaticUpdate的自定义功能。此功能在特定的共享目录中搜索自身的最新版本。 (例如,GUI_v1_1查看设置目录中是否存在GUI_v1_2或更高版本)。找到后,AutomaticUpdate函数会将这个新版本从共享目录复制到运行它的目录中。现在,我希望GUI_v1_1在复制后自动启动GUI_v1_2。

将GUI从共享目录复制到运行“旧” GUI的目录的过程基于对GUI标题中存在的数字的比较,方法是将标题转换为字符串,然后选择并比较此字符串中的数字。共享目录中可用的最新版本可以通过这种方式选择和复制。现在,我具有字符串格式的GUI标题,但是要在GUI中打开它,我需要以函数格式打开它。在将GUI名称复制(即GUI_v1_2)后,手动将其复制到GUI启动功能中,即可启动第二个GUI。在GUI复制后直接获取字符串,并没有将str2func应用于该字符串。

这有效(如果刚刚从共享文件夹复制的GUI名为TestApp_v1_2):

   function startupFcn(app)
       if haveInet
           fname = AutomaticUpdate2();
       end
   AppTest_v1_2
   end

这不是:

   function startupFcn(app)
       if haveInet
           fname = AutomaticUpdate2();
       end
   str2func(fname)
   end

看到最新复制的文件名为TestApp_v1_2,fname包含字符串“ TestApp_v1_2”,因此我希望它可以正常工作。我需要这样做,因为代码必须独立于刚刚复制的版本的名称。它应该始终打开刚刚复制的最新版本。

1 个答案:

答案 0 :(得分:3)

使用str2func来构建函数句柄(而不是eval

在第二个代码片段中说“ 不起作用”时,您错了一半。只是您还没有完成调用该函数:

str2func(fname)

本身并没有什么明显的作用。它仅创建函数fname的句柄,但是由于您在没有任何输出参数的情况下调用该行,因此该行完成执行后,创建的句柄将立即丢失。

现在,如果您尝试:

myNewUpdatedApp = str2func(fname) ;

然后myNewUpdatedApp现在指向,但是您仍然需要实际调用它来开始执行。因此,要完全完成这项工作,请使用:

myNewUpdatedApp = str2func(fname) ; % create the function handle (pointer to funtion)
myNewUpdatedApp ;                   % call the execution of the function

我鼓励您阅读以下内容:

  • str2func(总是优于eval,甚至在文档页面中甚至有一章比较了这两个选项)。
  • Function Handles。非常有用的小功能,尤其是在像您这样的情况下。