Matlab Codegen Eig 函数 - 这是一个错误吗?

Posted

技术标签:

【中文标题】Matlab Codegen Eig 函数 - 这是一个错误吗?【英文标题】:Matlab Codegen Eig Function - Is this a Bug? 【发布时间】:2013-04-17 16:44:00 【问题描述】:

考虑以下最小示例:

function CoderEigFail() %#codegen
A = [0 sqrt(2); sqrt(2) 0];
[B C] = eig(A)

当我通过codegen CoderEigFail.m 编译并运行它时,得到的矩阵 B 与运行原始 Matlab 文件时得到的矩阵 B 不同。特别是,对于 mex 文件,我得到 B = [1 1; -1 1],而对于 Matlab 文件,我得到 B = [-0.7071 0.7071; 0.7071 0.7071]。我在 MacOSx Mountain Lion 上运行了 Matlab R2011a。

谁能重现/解释这种行为?这是一个错误还是我在这里遗漏了什么?

【问题讨论】:

有趣的“错误”。但是要理解,特征向量就是一个向量。所以本质上只是一个可以任意缩放并且仍然有效的方向(在某种意义上,方向 与方向 相同,依此类推。特征向量仅在缩放因子内是唯一的。根据我的经验,Matlab 总是选择缩放这些特征向量(B 的列),以便它们的 2 范数是统一的。显然,编译后的版本要么不缩放,要么缩放不同。希望其他人可以填写更多详细信息,说明为什么缩放差异。 【参考方案1】:

不,这不是错误。

正如 Stuart 在对问题的评论中指出的那样,特征向量通常是标准化的。 eig() 的文档中的注释中指出了这一点。

编译版本的行为差异是“对于某些高级库函数”下的“Expected Differences in Behavior After Compiling MATLAB Code”中记录的功能。

这种行为只是被承认,但没有理由或解释。

【讨论】:

以上是关于Matlab Codegen Eig 函数 - 这是一个错误吗?的主要内容,如果未能解决你的问题,请参考以下文章

Matlab中的eig函数和eigs函数的异同点

Matlab Codegen:不支持匿名函数

Numpy EIG 在 Mac OS X 10.6 上比 MATLAB EIG 慢大约 4 倍。我究竟做错了啥?

matlab中如何求特征值?

怎么用Matlab求矩阵的特征值和特征向量

使用 Matlab codegen 在 Matlab 2013 中创建 mex 文件时出错