Matlab矩阵乘法计算有效数字

6
我有两个矩阵,形式为变量A和b,并作为我的Matlab函数(在下面发布)的输入。 我想从结果A,b矩阵中计算用于矩阵求逆操作(矩阵除法)的有效数字。 但是,我不知道从哪里开始(Matlab或数学上)来处理这种方法。需要帮助吗?
更多背景信息,使用一个方形线性系统(Ax = b),我正在检查它是否奇异或非奇异,并尝试找到解决方案。
% x = answer
% y = 0 if no solution, 1 if nonsingular, 2 if many solutions
% z = p is number of sig figs
%
function [ x, y, z ] = squareLinSysSolv(A, b)


if det(A) == 0
    % Matrix is singular and therefor many solutions
    x = A\b;
    y = 0; % Used as place holder to compile
    z = 5; % Used as place holder to compile
elseif det(A) ~= 0
    % Matrix does not equal to zero (perhaps a number very close to it or
    % far from it) and therefor has a unique solution.
    x = A\b;
    y = 1; % Used as place holder to compile
    z = 5; % Used as place holder to compile
end
end

编辑: 为了更加清晰明了,请注意,z 应该是一个整数,用于近似(向上或向下取整)在 A\b 计算时达到的有效数字位数的十进制数。

测试用例: 预期结果的测试/规范表。两个矩阵 Ab,结果应该是这样的。

A =
    1.5000    2.3000    7.9000
    6.1000    3.2000   13.0000
   13.0000   21.0000   76.0000

b =
     1
     3
     5
>> [x,y,z] = squareLinSysSolv(A,b)
% the result of x = A\b
x =

    0.8580
    3.0118
   -0.9132
% determinant is not equal to zero
y =

     1
% Amount of sig figs/precision in calculation
z =

     15

也许我有点迟钝,但我不明白你所说的“矩阵求逆运算中使用的有效数字”的意思。你是指像“在不改变答案超过某个(给定的)数量的情况下,我可以改变A和b的程度”这样的东西吗? - Dan Becker
@DanBecker 希望这样更容易理解(我也更新了原帖)z 应该是一个整数,它近似于 A\b 在某些有效数字处计算的十进制数的上限或下限值。 - Adam
哦,我还是不太明白...你的意思是想要一个值 z,这个值能使得 z 后面的所有小数位都等于零吗? - Dan Becker
如果我上一条评论准确描述了您尝试做的事情,那么这个SO问题看起来会很有帮助:https://dev59.com/0Ggt5IYBdhLWcg3w8h41 - Dan Becker
1
既然至少有两个人甚至不理解这个问题在问什么,为什么还有人点赞呢?能否请一个点赞者给我们解释一下这个问题在问什么,以及他们为什么认为它很有趣?我一直觉得自己可能漏掉了什么! - Dan Becker
显示剩余2条评论
3个回答

1
我同意Dan的观点。我不理解问题,也不知道你在哪里计算z。首先,答案显示的数字位数与计算答案时的有效数字位数是独立的。其次,你有两种情况:det(A)==0和det(A)~=0。在这两种情况下,似乎你都将z设置为5。(你一定在其他地方做了一些事情,但你没有展示出来,以便计算z=15?你是如何计算z的?)
此外,请注意,有效数字的数量将取决于数据的类别。双精度>单精度>整数...
最后,为了提高效率,虽然我不知道A的大小(也不知道计算行列式需要多少开销),但没有必要计算两次。
if det(A)==0
    % case 1
else % NOT: elseif det(A)~=0
    % case 2
end

我想我也有点迟钝。:)

Brett


1

矩阵接近奇异的程度通常由“条件数”来量化。有几种方法可以估计矩阵的条件数。一种常见的技术是计算最大和最小幅值特征值的比率。

Matlab有一个内置函数称为cond,它给出了矩阵(相对于反演)的条件数。接近1的值是“好”的 - 我不确定如何将其与任何具体的东西(如“有效数字”)相关联。


0
如果你的问题是“给定matlab浮点数的十进制表示,最小的数字z是多少,以至于在前z位之后所有数字都是零”,那么我认为以下函数基本可以解决。
我要提醒一下,虽然我已经在很多数字上测试过了,但我可能会错过某些情况,所以你需要仔细测试。这可以通过一次遍历字符串更有效地完成。
function n = sig_decimal_digits(f)
    % get string representation, any decimal point, and any leading zeros
    str = num2str(f,20);

    % strip any exponent part
    loc = regexp(str, 'e');
    if ~isempty(loc)
        str = str(1:(loc-1));
    end

    % strip any decimal point
    str = strrep(str, '.', '');

    % strip any leading zeros (and minus sign!)
    loc = regexp(str, '[1-9]');
    if isempty(loc)
        %if *only* leading zeros, f is 0, so n = 1
        n = 1;
        return;
    else
        str = str(loc:end);
    end

    % count length of string, excluding trailing zeros
    loc = regexp(str, '0+$');
    if isempty(loc)
        n = length(str);
    else
        n = loc-1;
    end
end

然而,我会添加两个评论:

  1. 这显然与矩阵乘法无关,所以我不确定为什么你要把它带进来。
  2. 这是一个奇怪的量要计算。除非您的矩阵中有非常特殊的数字,否则答案几乎总是17,因为大多数浮点数没有短小的十进制展开式。例如,对于您在问题中提供的A和b,根据我的函数,x中的所有三个数字都有17个有效数字。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接