在 MATLAB 中生成代码期间替代外部函数,例如 imread 和其他函数

Alternatives to extrinsic functions such as imread and other functions during code generation in MATLAB

您可能知道,代码生成过程中不会输出外部函数。这些函数 and/or 是否有其他方法可以解决此问题?我的代码生成错误报告如下所示:

Code Generation Error Report

很奇怪我也不能输出sizergb2gray。因为这些对我的计划来说是必不可少的,所以我无法避免它们。

非常感谢您的帮助!

这是个好问题,我经常看到类似的问题。当我开始使用 MATLAB Coder 时,最大的陷阱之一是不断搜索支持的函数。我很同情你的挫败感,在经历了这一切后,我有一些建议。

首先,针对您的直接问题,虽然 Coder 不支持 imread,但 sizergb2gray 支持。编码器可能会抱怨这些,因为它们已从对 imread 的调用中传递了 mxArrays,这在外部时很好,但对于单独生成则不行。那只是一个猜测。 Coder 支持的函数列表是编写代码时非常有用的工具:List of Functions supported in MATLAB Coder

但即使有这两个,要替换 imread 也不是一件小事。您必须找到另一个支持您正在使用的特定文件的库,然后使用 coder.ceval 将其拼接。或者,如果您能找到它的纯 MATLAB 实现,那可能会有所帮助。

您的目标是纯 C 库还是 MEX 文件?如果你打算在 MATLAB 环境中使用这段代码,你总是可以单独使用 imread 然后传递数据。

现在进行一些更一般的观察:MATLAB Coder 并不是一个完美的 MATLAB 到 C 的翻译系统。它非常强大,我已经能够用它编写一些非常大的项目,但是如果你想要的是能够在没有 MATLAB 的情况下 运行 任何 MATLAB 代码,你应该看看 MATLAB 编译器,一个不同的添加-在。这里有一个很好的问答:MATLAB Compiler vs MATLAB Coder

在 MATLAB Coder 中编写项目时,最好是从头开始,要知道您最终的目标是 C 代码。从 MATLAB 到 C 的转换过程中有很多陷阱,您在编写 MATLAB 代码时必须时刻保持警惕。

一个有用的工具是右键单击 "Current Folder" 列表中的文件,该列表通常位于 window 主列表的左侧,并且 select "Check Code Generation Readiness." 你会得到一份关于文件中潜在问题的很好的报告。我建议经常使用它。

另一个有用的工具是始终将 %#codegen 标记放入您的代码中。这会提醒 MATLAB 编辑器 .m 文件用于代码生成,因此它会在您编写文件时提供额外的上下文相关信息。这有很大帮助。

代码生成最常缺失的函数是文件 IO 函数。这有一些很好的理由,但它仍然令人沮丧。

当您拼接外部 C 代码时,您使用 coder.ceval 函数,它可以提供对外部库的出色访问。使用这个井是另一个话题,不在这个问题的范围内。

如果您可以准确指出您有兴趣阅读的文件类型(PNG、BMP、TIFF 等),也许有人可以为您确定一个好的外部库供您使用。