2

我使用 MATLAB 的编码器工具创建了矩阵指数函数的 MEX 版本,用于另一组函数。问题是,MEX 版本给出的结果与原始 m 文件不同。

经过调试,我认为是这个原因,是因为MEX文件和m文件不做矩阵除法(\)相同。或者 MEX 文件首先存在问题。通往发生矩阵除法的行的所有变量在两边都是等价的。

这是发生问题的行:

F = (V-U)\(2*U) + I

其中 I 是 V 和 U 大小的单位矩阵。

MEX 文件进行矩阵除法时出现差异的原因是什么,我该如何解决这个问题?这行代码可以不用除法重写吗?

4

2 回答 2

4

从这样的操作生成 C 代码我没有问题。

这是我尝试过的测试功能:

myfcn.m

function F = myfcn(U,V)
    I = eye(size(U));
    F = (V-U)\(2*U) + I;
end

这是我们将用来验证结果的测试脚本:

test_myfcn.m

U = rand(5);
V = rand(5);
F = myfcn(U,V);

我首先启动代码生成工具 ( ccoder),创建一个新项目集以生成 MEX 文件,然后添加myfnc.m之前的函数作为入口点。然后我将两种输入变量类型定义为:

double (:Inf x :Inf)

它指定了一个双精度类型的无限大小的 MxN 矩阵。

最后我们可以构建项目了。这产生myfcn_mex.mexw64.

测试原始 M 函数和生成的 MEX 函数,我得到几乎相同的结果(差异按机器 epsilon 的顺序排列):

>> F = myfnc(U,V);
>> FF = myfcn_mex(U,V);
>> norm(F-FF)
ans =
   1.4391e-14
于 2014-10-15T19:40:46.810 回答
2

MATLAB 在 2014a 版本中对 EXPM 算法进行了细微更改。MATLAB Coder 实现是独立的,并且尚未对代码生成算法进行相应的更改,因此可能存在一些差异。新的实现可以(V - U)\(2*U) + I,而旧的可以(V - U)\(V + U)。这些在数学上是等效的,但通常会给出不同的舍入行为。

AFAIK,MATLAB 与 MATLAB Coder 中线性系统的解决方案质量没有系统差异。核心算法本质上是等价的,四舍五入的差异预计会从各种模糊的来源蔓延。在给定情况下,对于 MATLAB 或 MATLAB Coder,残差可能更小。如果解决方案的差异很大,则表明正在解决的问题是病态的。如果您愿意,我可以对此进行更多解释,但每本数值分析教科书都对此进行了介绍。你能提供一个具体的例子吗?当您的问题在 MATLAB 中解决时,您至少可以找出 cond(V - U) 在那里返回的内容吗?

于 2014-10-20T18:14:34.353 回答