在 MATLAB 中生成代码期间替代外部函数,例如 imread 和其他函数
Alternatives to extrinsic functions such as imread and other functions during code generation in MATLAB
您可能知道,代码生成过程中不会输出外部函数。这些函数 and/or 是否有其他方法可以解决此问题?我的代码生成错误报告如下所示:
很奇怪我也不能输出size
和rgb2gray
。因为这些对我的计划来说是必不可少的,所以我无法避免它们。
非常感谢您的帮助!
这是个好问题,我经常看到类似的问题。当我开始使用 MATLAB Coder 时,最大的陷阱之一是不断搜索支持的函数。我很同情你的挫败感,在经历了这一切后,我有一些建议。
首先,针对您的直接问题,虽然 Coder 不支持 imread
,但 size
和 rgb2gray
支持。编码器可能会抱怨这些,因为它们已从对 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 等),也许有人可以为您确定一个好的外部库供您使用。
您可能知道,代码生成过程中不会输出外部函数。这些函数 and/or 是否有其他方法可以解决此问题?我的代码生成错误报告如下所示:
很奇怪我也不能输出size
和rgb2gray
。因为这些对我的计划来说是必不可少的,所以我无法避免它们。
非常感谢您的帮助!
这是个好问题,我经常看到类似的问题。当我开始使用 MATLAB Coder 时,最大的陷阱之一是不断搜索支持的函数。我很同情你的挫败感,在经历了这一切后,我有一些建议。
首先,针对您的直接问题,虽然 Coder 不支持 imread
,但 size
和 rgb2gray
支持。编码器可能会抱怨这些,因为它们已从对 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 等),也许有人可以为您确定一个好的外部库供您使用。