我想为矩阵的所有元素设置精度。以下是我的所作所为:
>>A
A =
0 1.0000 0 0 0 0
-137.0830 0 0 0 0 0
0 0 0 1.0000 0 0
365.5546 0 0 0 0 0
0 0 0 0 0 1.0000
365.5546 0 0 0 0 0
>> vpa(A,2)
ans =
[ 0, 1.0, 0, 0, 0, 0]
[ -144.0, 0, 0, 0, 0, 0]
[ 0, 0, 0, 1.0, 0, 0]
[ 377.0, 0, 0, 0, 0, 0]
[ 0, 0, 0, 0, 0, 1.0]
[ 377.0, 0, 0, 0, 0, 0]
结果不是我的愿望,应该是: 第一列中的-137.08,365.55,365.55。 请帮忙建议我如何获得它。 非常感谢你!
答案 0 :(得分:1)
second input到vpa
是number of significant digits,不与小数点后的值数相同。数字-137.08
实际上有五个显着位数,因此您需要使用5
的第二个输入
vpa(A, 5)
% [ 0, 1.0, 0, 0, 0, 0]
% [ -137.08, 0, 0, 0, 0, 0]
% [ 0, 0, 0, 1.0, 0, 0]
% [ 365.55, 0, 0, 0, 0, 0]
% [ 0, 0, 0, 0, 0, 1.0]
% [ 365.55, 0, 0, 0, 0, 0]
答案 1 :(得分:1)
您没有正确使用vpa
。来自docs:
vpa(x,d)至少使用d个有效数字
Nota表示至少。这就是为什么当你只询问2位有效数字时你仍然得到377。
您似乎不知道有效数字是多少。来自Wikipedia:
数字的有效数字是带有意义的数字 有助于其测量分辨率。这包括所有数字 不同的是:
- 所有前导零;
- 当它们仅仅是占位符以表示数字的比例时尾随零(在识别时解释了确切的规则 有意义的数字);和
- 例如,通过计算执行的虚假数字比原始数据或测量的精度更高 报告的精度高于设备支持的精度。
所以你想要这个
>> vpa(365.5546, 5)
ans =
365.55
现在,为了保持一致,您需要找出矩阵的最大值和compute the desired number of significant digits。
max_number = floor(log10(max(abs(A(:))+1)) + 1);
decimals = 2;
vpa(A, max_number + decimals)
此处,max_number
是矩阵具有的整数位数的最大数量,decimals
是您想要的小数位数。
答案 2 :(得分:-1)
vpa(x,d)
:
d
是有效数字,而不是小数位。
pvalue = vpa(-137.0830);
twopvalue = vpa(-137.0830,2);
% pvalue = -137.08299999999999840838427189738
% twopvalue = -144.0
如果您想在第一列中获得-137.08,365.55,365.55。您可以使用roundn(A,-2)
roundn(A,-2)
ans =
0 1.0000 0 0 0 0
-137.0800 0 0 0 0 0
0 0 0 1.0000 0 0
365.5500 0 0 0 0 0
0 0 0 0 0 1.0000
365.5500 0 0 0 0 0