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



背景

假设我在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得到了正确的路径。例如,如果我尝试用foo 中的以下两行替换run的行

fID = fopen(conf_file, 'rt');
first_line = textscan(fID, '%s', Inf, 'Delimiter', 'n');

CCD_ 7读取CCD_。所以.m文件就在那里,MATLAB引擎可以";参见";事实上,我甚至可以在用textscan读取的字符串上运行eval

所以我的问题是:

  1. 为什么我会出现上面的错误?为什么foo不运行.m文件?

    更新:关于这个问题的答案,请参阅@strictlyrude27下面的答案。

  2. 如果以上不起作用。有没有一种方法可以让MATLAB编译的函数运行.m文件,该文件在编译原始函数后可能发生了更改?

我第二个问题的动机是:

我希望有能力";"更新";作为项目一部分的CCD_ 14文件,而不必重新编译整个项目。如有任何想法,我们将不胜感激。

来自MATLAB编译器的文档:

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

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

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

一些MATLAB工具箱,如神经网络工具箱™产品,动态生成MATLAB代码。由于MCR只执行加密的MATLAB文件,而神经网络工具箱生成未加密的MATLAB文档,因此无法部署神经网络工具箱中的某些函数。

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

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

  1. 在MATLAB中运行一次代码,即可获得生成的函数。

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

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

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

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

最新更新