我有两个变量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
的有效数字的十进制数。
测试案例
预期的测试/规格表。 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 = 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
答案 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
但是,我会添加两条评论: