循环中重新分配的句柄类的 Matlab 代码生成

Posted

技术标签:

【中文标题】循环中重新分配的句柄类的 Matlab 代码生成【英文标题】:Matlab Code Generation for Handle Classes Reallocated in a Loop 【发布时间】:2015-09-04 01:29:43 【问题描述】:

我在 Matlab Coder 中遇到了一些我不完全理解的行为。为简化起见,这里有一个展示该行为的简短示例。如果我有一个句柄类定义为:

classdef somehandleclass < handle %#codegen

properties
    something
end

methods
    function obj = somehandleclass(initval)
        obj.something = initval;
    end
end

end

以及使用它的简短函数:

function result = runsomehandleclass %#codegen

obj = somehandleclass(0);
for i=1:6
    obj = somehandleclass(i);
end

result = obj.something;

end

...然后我用一个简单的构建脚本构建runsomehandleclass 函数:

cfg = coder.config('mex');
cfg.GenerateReport = true;
codegen -config cfg runsomehandleclass

我收到以下错误:

???不支持的分配。已分配的句柄对象退出循环。 ==> runsomehandleclass 中的错误行:5 列:11

我理解错误的文本,显然我每次都在循环创建 somehandleclass 的新实例。我的问题是:为什么这是一个错误?在这个简单的例子中,解决这个问题很简单,但是问题出现在一个更大的代码库中,在另一个函数的深处,一个句柄类被重新实例化,并且设置有很大的不同。我可以(并且已经)解决了这个问题,但是新的解决方案就不那么优雅了。实际上,这里没有泄漏,因为句柄类应该在它们的句柄被覆盖时被删除。

如果我从handle 中删除继承并将该类设为值类,则错误消失并且mex 按预期编译,但是在我的实际应用程序中,我确实希望有一个句柄类。

这是编译器的预期行为吗?另外,是否有解决方法,例如在我将新实例构造到obj 之前,是否有某种方法可以显式删除obj

【问题讨论】:

【参考方案1】:

请参阅here,这是你的情况。

在循环外初始化的obj = somehandleclass(i);obj中,引用了循环内创建的somehandleclass对象。换句话说,如果您想在循环中使用值类,请使用它。

【讨论】:

这或多或少是对我的问题的重述。是的,我知道它是在循环之外创建的,然后(可能)在循环中一遍又一遍地销毁和重新创建。这只是问题的一个简单示例;在我的实际应用程序中,实例化发生在其他代码的深处,但错误和结果是相同的。最好让它成为一个句柄类并在循环中重新调用构造函数。据我所知,这段代码没有理由无效或无法编译。它直接在 MATLAB 中工作。这在某种程度上是被禁止的用例吗? 因为它是 matlab,而不是 C++。您使用它的功能,也必须忍受它的限制。谈到 abt 类和 oop,matlab 从来都不是一个好的选择,也不是主流的选择之一。你看到链接了吗?说的很清楚A Variable Outside a Loop Cannot Refer to a Handle Object Created Inside a Loop 我不打算重述,我指出Matlab在哪里说代码生成不接受您的案例。它是您关于编译器预期行为的问题的答案。 啊哈,感谢您添加链接。这正是我想要的。 ...否则你的链接一直都在那里,我错过了。我很抱歉。

以上是关于循环中重新分配的句柄类的 Matlab 代码生成的主要内容,如果未能解决你的问题,请参考以下文章

从 for 循环 matlab 内部生成的变量分配向量值

matlab中如何取消plot画的图

MATLAB:附加到预先分配的矩阵

matlab中的GUI,轴中的图像循环

K-mean matlab 实现代码

在 Matlab 中从磁盘加载保存的对象很慢