1

背景

假设我在 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文件?

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

  2. 如果上述方法不起作用。有没有办法让 MATLAB 编译的函数运行在编译原始函数可能已更改的.m文件?

我第二个问题的动机:

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

4

2 回答 2

4

来自 MATLAB 编译器的文档

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

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

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

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

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

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

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

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

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

于 2011-09-13T23:43:58.647 回答
0

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

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

于 2015-02-05T11:41:44.240 回答