从MATLAB编译的函数运行.m文件

时间:2011-09-13 23:12:32

标签: matlab matlab-deployment matlab-compiler

背景

假设我在MATLAB中编译以下简单函数

function foo(path_to_m_file)
  disp([' Running ' path_to_m_file])
  run(path_to_m_file);
end

函数foo只是获取 .m 文件的路径并尝试运行它。

但是,当我在编译后实际尝试运行foo时:

./run_foo.sh $path_to_run_time $path_to_m_file

其中path_to_m_file是一个简单的 .m 文件,其语句如下:

a = 2;

我收到以下错误:

Error using ==> run
MATLAB:run:FileNotFound

但是,我知道foo获取正确的路径。例如,如果我尝试用run

中的以下两行替换foo
fID = fopen(conf_file, 'rt');
first_line = textscan(fID, '%s', Inf, 'Delimiter', '\n');

foo读取.m文件的相应行。所以.m文件就在那里,MATLAB引擎可以“看到”它。实际上,我甚至可以对使用eval读取的字符串运行textscan

所以我的问题是:

  1. 为什么我会收到上述错误?为什么foo不运行.m文件?

    更新:请参阅下面的@ strictrude27的回答,了解这个问题的答案。

  2. 如果上述方法无效。有没有办法让MATLAB编译的函数运行 .m 文件,该文件在编译原始函数后可能已更改
  3. 我的第二个问题的动机:

    我希望能够“更新”作为项目一部分的.m文件,而无需重新编译整个项目。任何想法都将非常感激。

2 个答案:

答案 0 :(得分:4)

来自MATLAB编译器的documentaton

  

编译的应用程序不会在运行时处理MATLAB文件

     

MATLAB编译器的设计使您可以部署锁定功能。可部署的MATLAB文件在MATLAB编译器加密时暂停或冻结 - 它们从那时起不会改变。这并不意味着您无法部署灵活的应用程序 - 这意味着您必须在设计应用程序时考虑到灵活性。如果您希望最终用户能够在两种不同的方法之间进行选择,例如,它们都必须进行编译。

     

MCR仅适用于构建组件时加密的MATLAB代码。任何动态生成新MATLAB代码的函数或过程都不适用于MCR。

     

某些MATLAB工具箱(例如Neural Network Toolbox™产品)会动态生成MATLAB代码。由于MCR仅执行加密的MATLAB文件,而神经网络工具箱生成未加密的MATLAB文件,因此无法部署神经网络工具箱中的某些功能。

     

同样,无法部署需要检查MATLAB函数文件内容的函数。例如,HELP是动态的,在部署模式下不可用。如果为其提供MATLAB函数原型,则可以在部署模式下使用LOADLIBRARY

     

不是编译生成MATLAB代码并尝试部署它的函数,而是执行以下任务:

     
    
        
  1. 在MATLAB中运行一次代码以获取生成的函数。

  2.     
  3. 使用MATLAB编译器编译MATLAB代码,包括生成的函数。

  4.               
          
            

    提示:使用EVALFEVAL的另一种方法是使用匿名函数句柄。         如果您需要能够为动态运行时处理创建MATLAB代码,则最终用户必须已安装MATLAB副本。

          
        
      

答案 1 :(得分:0)

您可以逐行读取m文件并使用eval()函数执行每一行。 m文件的格式有限制(例如,没有换行符,每行必须包含完整的MATLAB语句)但它确实有效并且可以添加到已编译应用程序内的运行时环境中。我使用这种技术允许用户为我开发的已编译应用程序定义配置和数据文件。

显然,如果您的最终用户提供了一个格式不佳的m文件进行评估,您将最终难以解决错误。