是否有可能提高MatLab精度?

时间:2014-08-07 12:43:21

标签: matlab precision trigonometry

我需要过滤一个旋转矩阵,为此我需要首先将其转换为旋转角度,然后过滤这些并将答案转换回旋转矩阵形式。问题在于,将这两个转换链接在一起,即使没有中间的过滤(即angl2rot(rot2angl(rotationMatrix)))也会由于执行转换所需的所有trig函数缺乏精确性而引入显着错误。

有没有办法提高MatLab的精度?或者特别是可以使trig函数(我使用sin(),cos()和atan2())更精确?

编辑:负责从旋转矩阵转换为欧拉角的函数的实现,反之亦然:

function [ rotationM ] = eul2rot( a, b, c )
%EUL2ROT This function converts euler rotation angles to a 3x3 rotaton
%matrix

    X = zeros(3,3,size(a,1));
    Y = zeros(3,3,size(a,1));
    Z = zeros(3,3,size(a,1));
    rotationM = zeros(3,3,size(a,1));

    for count = 1:size(a,1)

        X(:,:,count) = [1 0 0; ...
            0 cos(a(count)) -sin(a(count)); ...
            0 sin(a(count)) cos(a(count))];

        Y(:,:,count) = [cos(b(count)) 0 sin(b(count)); ...
            0 1 0; ...
            -sin(b(count)) 0 cos(b(count))];

        Z(:,:,count) = [cos(c(count)) -sin(c(count)) 0; ...
            sin(c(count)) cos(c(count)) 0; ...
            0 0 1];

        rotationM(:,:,count) = Y(:,:,count)*Z(:,:,count);
        rotationM(:,:,count) = X(:,:,count)*rotationM(:,:,count);

    end

end

function [ th ] = rot2eul( rot )
%ROT2EUL Converts a 3x3 rotation matrix into a vector of three euler angles
        th = [atan2(rot(3,2,:),rot(3,3,:)); ...
            atan2(-rot(3,1,:),sqrt(rot(3,2,:).^2+rot(3,3,:).^2)); ...
            atan2(rot(2,1,:),rot(1,1,:))];
end

他们使用找到的方程here

3 个答案:

答案 0 :(得分:3)

作为源的site you link将旋转矩阵R定义为:

R = Z*Y*X;

X, Y, Z是三个单独的旋转矩阵。

但是,在您的代码中,您正在执行此操作:

rotationM(:,:,count) = Y(:,:,count)*Z(:,:,count);
rotationM(:,:,count) = X(:,:,count)*rotationM(:,:,count);

相当于:

R = X*Y*Z;

这两个不等价,因为矩阵乘法不是可交换的。改变顺序是乘法相当于改变执行旋转的顺序(并且3D中的旋转也不是可交换的),给你的结果与你期望的不同。

答案 1 :(得分:0)

John D' Errico的类HPF(High Precision Floats)支持具有任意小数位数的浮点数。您还可以查看符号数学工具箱的函数vpa

答案 2 :(得分:0)

您提到的功能如sincos是非常基本的matlab功能,并且不会包含错误。使用它们时获得的精度基本上是matlabs自己的精度(双精度,当你使用我期望的值时,很容易有14位小数。)

因此嫌疑人很清楚:自制函数angl2rotrot2angl可能是问题所在。要么是因为它们被窃听,要么是因为它们被错误地使用了。

如果没有看到实际的功能,就无法说明更多信息。