matlab - (Matlab)奇怪的精度损失,同时将复杂矩阵分配给局部变量

标签 matlab floating-point precision jit scoping

当将表达式存储到局部变量中时,相同的语句在“脚本”范围内正确运行时,我遇到了这种意外的(并且似乎是非投诉的)浮点精度损失,特别是复杂值

(目前在 Matlab-2018a Linux 上测试,似乎是一个错误,还没有在其他版本上测试过)

计算存储表达式 transpose(a)*conj(a) 其中 a 是一个复数矩阵。存储等效的 conj(a'*a) 没有问题,但我想了解这个问题,我已经从同事的更大代码库中提取了这个,它得到了意想不到的结果。

在示例中,我使用 ishermitian() 来查看是否发生了意外行为,因为这些表达式根据定义给出了 Hermitian 矩阵,并且兼容的浮点舍入语义将使其保持 hermitian < em>甚至 失去精度时。如果矩阵是“真实的” btw,则不会发生同样的事情。

我有以下 Minimal-Reproducible-Example:tst_bad() 说明了行为不端的版本

len = 16;         % generate complex input:
t = 2*pi/len*(0:len-1)';
tt = t + (0:0.1:0.3);
a = hilbert(sin(tt));
% a = rand(len, 4)+1i*rand(len, 4); % alternative input, almost as good

m1 = transpose(a)*conj(a);
res = -ones(1, 4);
res(1) = ishermitian(m1);
[res(2) m2] = tst_bad(a);
[res(3) m3] = tst_good(a);
m4 = single(m1);
res(4) = ishermitian(m4)
display(res)
% 1 0 1 1

function [f, m] = tst_bad(a)
    m = transpose(a)*conj(a); 
    f = ishermitian(m);
    m_iseq = isequal(m,  transpose(a)*conj(a)) % 'true' but :
  % running "isequal(m,  transpose(a)*conj(a))" in the REPL will return 
  % 'false' if running in matlab-debugger
end

function [f, m] = tst_good(a)
    m = conj(a'*a);
    f = ishermitian(m);
end

有没有人见过类似的行为?请注意,即使是错误的 m2 矩阵的对角线成员也不是真实的(如预期的那样)


后果:

  1. @Cris Luengo 的回复中的重要说明 - 在当前的 Matlab 引擎中,“函数”代码大部分是 JIT,而“脚本”代码 -通常不是,因此存在差异。

  2. 因此,这不是任何变量范围或属性(我已经开始尝试在“脚本范围”中分配一个变量并将其传递给函数等)

  3. 这让我很想用一种语言来做这样的数字代码,在这种语言中,计算结果将此类假设体现在类型系统中(例如声明 - 这是一个厄米矩阵等,具体取决于代数结构标量),并进一步使用此信息来选择算法等。

最佳答案

您可以将测试简化为:

len = 16;
t = 2*pi/len*(0:len-1)';
tt = t + (0:0.1:0.3);
a = hilbert(sin(tt));

m1 = transpose(a)*conj(a);
disp(ishermitian(m1))      % true
m2 = tst_bad(a);
disp(ishermitian(m2))      % false
disp(isequal(m1,m2))       % false

function m = tst_bad(a)
    m = transpose(a)*conj(a);
end

我刚刚在 MATLAB R2018b(在线版)上运行并确认了这个问题。在函数内或函数外计算 transpose(a)*conj(a) 会导致不同的结果。这看起来像是 JIT 的问题。

我建议你 submit this as a bug to the MathWorks . (“报告错误”链接位于蓝色条下方最右边的链接,您需要有效的许可证才能以这种方式报告错误。)

关于matlab - (Matlab)奇怪的精度损失,同时将复杂矩阵分配给局部变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54769719/

相关文章:

matlab - 在 Matlab 图形中绘制图例

c - IEEE754中是否有关于加法的中性元素

python - 如何在 Python 中使数字更精确?

json - 将数字从 float64 转换为 Int64 不正确

recursion - 为什么我的迭代高阶过程比等效的递归过程给出更精确的结果?

data-structures - MATLAB 中有 "queue"吗?

matlab - Matlab 中 'qr' 和 'SVD' 获取矩阵的单个向量有什么区别?

ios - 在 xcode 项目中使用 Matlab 功能

Haskell int float 和 char float

java - 使用小数指数的 Math.pow