【问题标题】:In a Matlab gui how do you execute a .m file returned as a result of uigetfile?在 Matlab gui 中,如何执行由 uigetfile 返回的 .m 文件?
【发布时间】:2015-04-24 15:47:56
【问题描述】:

我有一个带有调用 uigetfile 的按钮的 Matlab gui。用户选择他们想要运行的文件,然后我的 gui 应该执行那个 .m 文件,将结果返回给 gui 以供进一步处理。

Uigetfile 效果很好,我可以捕获文件名和文件路径:

[filename, pathname] = uigetfile('*.m', 'Pick a .m file');

当我尝试执行文件名时:

total = [pathname filename];

% copy into current directory since files user selects could be in other directories
copyfile(total);   

% attempt to execute .m function the user selected
[a, b] = filename();

我得到这个错误:

Indexing cannot yield multiple results.

我的研究表明这是因为我有一个名为“文件名”的变量,所以 Matlab 认为我正在尝试使用该变量,而不是调用该函数。这对我来说很有意义,但是我不知道如何解决这个问题!

如何在不作为变量的情况下调用 uigetfile 的结果?或者,我还能如何运行用户在 gui 中选择的 .m 文件?

谢谢!

【问题讨论】:

    标签: matlab matlab-guide


    【解决方案1】:

    如果你和m.file在同一个文件夹里,你可以把整个uigetfile调用封装到run函数来执行它:

    run(uigetfile('*.m', 'Pick a .m file'))
    

    这样可以避免与之前定义的 filename 变量的命名冲突,并调用 uigetfile 的结果而不存储其输出。但是,如果您想从不同的文件夹运行脚本,我建议使用不同的名称存储 uigetfile 的结果:

    [filename, pathname] = uigetfile('*.m', 'Pick a .m file');
    run([filepath filename])
    

    这使您能够运行 mfile 而无需将其复制到当前文件夹,并且仍然避免与您之前定义的变量发生任何冲突。

    【讨论】:

    • 嗯,我喜欢简单...但是有两个问题。 1)您不能检查 uigetfile 的输出以查看其是否有效?换句话说,如果用户单击取消它会产生一个错误,因为它不能在没有返回文件的情况下运行。 2)我如何仍然得到函数a和b的输出?
    • 问题 1 已通过您的编辑解决。可以只做一个 if isequal(filename,0) || isequal(pathname,0) 在 uigetfile 和 run 行之间。谢谢!
    • @Ayshaya 抱歉,我正在编辑答案。井检查不是问题,但您可以使用 try catch 语句轻松检查。另外,我没有意识到 mfile 是您示例中的 filename() 。我认为这只是一个脚本,而不是一个函数。我得考虑一下这个
    • 只是为了清除问题:您的 mfile 是一个没有输入但有两个输出(a 和 b)的函数。那正确吗?如果是这样你最好把它变成一个脚本,去掉函数调用行,你的问题就解决了
    • 是的,没有输入和一些输出(实际上有十几个,只是为了发布而简化了)。我不确定我是否跟随?去掉函数调用线?
    【解决方案2】:

    我知道这已经被回答并接受了,但你可能想看看:

    output = feval ( str2func ( filename(1:end-2) ) )
    

    (1:end-2) 是去掉.m

    这样您可以将函数的输出存储在变量output中。如果您的 m 文件具有可变数量的输出,您可以将它们存储在结构或元胞数组中。

    仅仅因为函数没有输入 - 我不会认为 same 与脚本一样 - 您的“脚本”可能会覆盖调用函数中的许多变量而您不知道。 .. -> 因此调试将是一场噩梦...

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-04-19
      • 2019-10-18
      • 2014-07-08
      相关资源
      最近更新 更多