1 不等于 1?MATLAB 中的矩阵条目比较

1 doesn't equal 1? Matrix entry comparison in MATLAB

提问人:Maxomega 提问时间:2/21/2020 最后编辑:Cris LuengoMaxomega 更新时间:2/21/2020 访问量:80

问:

我正在尝试通过将矩阵相乘得到 1 来测试矩阵的反转。我检查它是否等于 1,如果不是,则打印一条消息和矩阵条目的值。

问题是打印的矩阵条目 1。我甚至使用我知道有效的舍入函数来确保浮点不准确没有问题。

这是我的代码:

 function [D1,f]=stiff(D,y)
 n = size(D,2);
 D1 = inv(D);
 f = D1 * y;
 for i = 1:n
        for j = 1:n
            if j == i % checking for diagonal entry
                yTempVar = D * D1 (1:n, i);
                if truncateFunction (yTempVar(j), 1) ~= 1
                    fprintf ("something's wrong")
                    truncateFunction (yTempVar(j), 1)
                 return
             end
         end
     end
 end

function B=truncateFunction(A,pow)
A(abs(A)<10^-pow)=0;
B=A;

相应的输出是这样的:

something's wrong
ans = 1.0000

我也尝试过没有舍入功能,我试过用 1.0000

这是我在实时脚本中要测试的内容

D=rand(4)*0.1;
y=randi([10 20], 4,1);
stiff(D,y)
MATLAB 浮点 相等

评论

1赞 Mark Snyder 2/21/2020
你能给我们一个完整的例子吗?即给我们一个值,以及一个定义,这样你就没有得到预期的结果了吗?DntruncateFunction
0赞 Maxomega 2/21/2020
@MarkSnyder 对不起。我必须与我的代码分开,因为它是针对一个项目的。我编辑了它以有一个有效的测试用例
1赞 Mark Snyder 2/21/2020
我仍然无法运行您的代码(没有定义),但无论如何,您真的确定这实际上是可靠的吗?尝试使用类似或其他小数字的东西,看看它是否有效。truncateFunctiontruncateFunctionif abs(yTempVar(j) - 1) > .000001
1赞 Maxomega 2/21/2020
我简直不敢相信我忘了包括它!再一次,对不起。有趣的是,这似乎很有效!以下是 truncateFunction() 中使用的算法: 这有点难以剖析,但我被告知要相信它。那好吧function B=truncateFunction(A,pow)A(abs(A)<10^-pow)=0;B=A;

答:

2赞 Mark Snyder 2/21/2020 #1

truncateFunction不会做你认为它所做的事情。它仅将低于给定 10 幂的值舍入为零 - 除非该整数为零,否则它根本不会四舍五入到最接近的整数。

一般来说,对于浮点问题(就是这样),最好检查值是否在小值内,而不是相等。

epsilon = .00001
if abs(yTempVar(j)-1) > epsilon
    fprintf ("something's wrong")
    truncateFunction (yTempVar(j), 1)
    return