6

我有两个变量形式的矩阵,A它们b是我的 matlab 函数的输入(发布在下面)。我想从结果矩阵中计算 用于矩阵逆运算(矩阵除法)的有效数字。但是,我不知道从哪里开始(matlab 或数学)来采用这种方法。帮助?Ab

更多上下文,使用平方线性系统(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
4

3 回答 3

1

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

Matlab 有一个名为的内置函数cond,它给出矩阵的条件数(关于反转)。接近 1 的值是“好”——我不知道如何将它与“重要数字”等具体的东西联系起来。

于 2012-10-25T20:57:04.473 回答
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

我想我也很密集。:)

布雷特

于 2012-10-25T20:25:41.207 回答
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 个有效数字。
于 2012-10-25T21:15:57.407 回答