我有两个变量 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 = 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
的小数数字数量。
测试用例:预期的测试/规格表。A
和b
都是矩阵,结果应该是类似的。
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
但是,我将添加两个评论:
- 这显然与矩阵乘法无关,所以我不确定为什么将其带入其中。
- 这是要计算的奇怪数量。除非您的矩阵中的数字非常特殊,否则答案几乎总是17,因为大多数浮点数没有短小数的扩展。例如,对于您在问题中给出的A和B,X中的所有三个数字都根据我的功能具有17个重要数字。