MATLAB矩阵乘法计算重要数字



我有两个变量 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 = Ab;
    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 = Ab;
    y = 1; % Used as place holder to compile
    z = 5; % Used as place holder to compile
end
end

编辑:为了清楚一点, z应该是一些整数,该整数近似于(天花板或地板值),在。

上计算出Ab的小数数字数量。

测试用例:预期的测试/规格表。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 = Ab
x =
    0.8580
    3.0118
   -0.9132
% determinant is not equal to zero
y =
     1
% Amount of sig figs/precision in calculation
z =
     15

我在这里和丹在一起。我不明白这个问题,也不明白您如何/在哪里计算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

矩阵与单数的近距离通常通过"条件号"来量化。有几种方法可以估计矩阵的状况数。一种常见的技术是计算最大和最小特征值的比率。

MATLAB具有一个称为cond的内置函数,可为矩阵提供条件号(相对于反转)。1接近1的值是"好" - 我不确定如何将其与"重要数字"这样的具体的任何混凝土联系起来。

如果您要问的问题是"给定MATLAB对浮点号的十进制表示,则最小的数字是多少,以便在第一个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个重要数字。

相关内容

  • 没有找到相关文章

最新更新