Matlab矩阵乘法计算重要数字

时间:2012-10-25 17:17:33

标签: matlab matrix linear-algebra matrix-multiplication

我有两个变量Ab形式的矩阵作为输入 到我的matlab函数(发布在下面)。 我想计算一下 用于矩阵逆运算的有效数字(矩阵除法) 来自结果Ab矩阵。但是,我不知道从哪里开始 (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

3 个答案:

答案 0 :(得分:1)

我和丹在这里。我不明白这个问题,也不知道你在计算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

我想我也很紧张。 :)

布雷特

答案 1 :(得分:1)

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

Matlab有一个名为cond的内置函数,它给出矩阵的条件数(相对于反转)。接近1的值是“好的” - 我不确定如何将它与任何具体的“重要人物”联系起来。

答案 2 :(得分: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位有效数字。