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

Posted

技术标签:

【中文标题】从 MATLAB 编译的函数运行 .m 文件【英文标题】:Running an .m file from a MATLAB-compiled function 【发布时间】:2011-09-13 23:12:31 【问题描述】:

背景

假设我在 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 引擎可以“看到”它。事实上,我什至可以在使用textscan 读取的字符串上运行eval

所以我的问题是:

    为什么会出现上述错误?为什么foo 不运行.m 文件?

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

    如果上述方法不起作用。有没有办法让 MATLAB 编译的函数运行 .m 文件,该文件可能在编译原始函数之后发生了变化?

我第二个问题的动机:

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

【问题讨论】:

【参考方案1】:

来自 MATLAB 编译器的documentaton:

编译后的应用程序不会在运行时处理 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 是动态的,在部署模式下不可用。如果您提供 MATLAB 函数原型,您可以在部署模式下使用 LOADLIBRARY

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

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

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

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

【讨论】:

谢谢@strictlyrude27。抱歉,我应该说我已经看到了,但我很惊讶我能够在我用textscan 阅读的行上运行eval,所以我仍然不确定为什么run 不起作用,但eval 可以。我会在 OP 上更新这个。有了这个,我仍然想知道我的第二个问题是否有答案。 Run() 使用调用文件系统上定义的函数的正常机制。如果编译后的 Matlab 代码可以从磁盘运行正常的.m 文件,那么您可以编译一个小 GUI,以重现完整的 Matlab IDE 功能并绕过 Matlab 的许可机制。 Eval 受到更多限制,因为它只计算表达式而不定义函数(而且速度很慢);一方面,仅仅构建整个语言是不够的;另一方面,它被广泛使用,以至于他们真的无法禁用它并且编译的程序仍然可以工作。【参考方案2】:

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

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

【讨论】:

以上是关于从 MATLAB 编译的函数运行 .m 文件的主要内容,如果未能解决你的问题,请参考以下文章

如何从 C/C++ 中止 MATLAB m 文件函数?

matlab回调函数生成.exe文件好处

linux c++ 怎么 调用自己函数的

matlab,简述脚本M文件和函数M文件的区别?

如何从 C 调用在 MATLAB 中创建并在 C 中编译的函数?

Matlab 编译项目的用户定义配置