Matlab对带有向量参数的mod()、isequal()、floor()函数给出了错误的答案

Matlab对带有向量参数的mod()、isequal()、floor()函数给出了错误的答案,matlab,Matlab,我用matlab来解一个混合整数规划,在我从linprog得到一个解之后,我想评估它们是否都是整数(x是n维),但我想不出一个方法来实现这一点 所有的函数,例如mod(x,1)==0,isequal(x,floor(x))都会给出错误的anwser 更奇怪的是,如果您手动输入一个具有相同参数的向量,它将被证明是正确的 结果表明:(这里所有的x都是由linprog的结果得到的)。任何人都可以帮上忙,或者提出一些其他有用的方法来评估这一点 K>> x x = 7.0000

我用matlab来解一个混合整数规划,在我从linprog得到一个解之后,我想评估它们是否都是整数(x是n维),但我想不出一个方法来实现这一点

所有的函数,例如
mod(x,1)==0
isequal(x,floor(x))
都会给出错误的anwser

更奇怪的是,如果您手动输入一个具有相同参数的向量,它将被证明是正确的

结果表明:(这里所有的x都是由linprog的结果得到的)。任何人都可以帮上忙,或者提出一些其他有用的方法来评估这一点

K>> x

x =

    7.0000
    1.0000

K>> mod(x,1)

ans =

    0.0000
    1.0000

K>> x

x =

    6.0000
    3.0000

K>> isequal(x,floor(x))

ans =
    0

从linprog得到的积分1,实际上是一个非常接近1的浮点数,但不等于1。只是(默认情况下)无法通过在MATLAB中输出数字来分辨差异。看看这个问题。另外,请参见有关的MATLAB手册页面

默认情况下,MATLAB使用
格式short
显示数字:

格式
将浮点数值的显示设置为默认显示格式,即短的固定小数格式。此格式显示5位数的缩放定点值

因此,
1–1e–10
将显示为1,即使它不等于1。同样地,
mod(1-1e-10,1)
将显示为1,即使它实际上是
1-1e-10

如果手动将
x
设置为其显示的表示形式,则所有低有效位都会被截断,“奇怪地”给出预期结果


键入命令
format long
后,选中
x

似乎对我有用。您是否考虑过使用整数类型(int/uint之一)而不是double来解决您的问题?我也尝试过,得到了我预期的结果。是的,如果您手动键入x值,它会工作,但如果它附带linprog解决方案,这是行不通的。@LoremIpsum@robbitt这是因为linprog中的数字与它们看起来不一样,请看我的答案。为什么不把linprog的结果四舍五入呢。问题是你所看到的7.0000实际上是7.00000001或类似的东西是的,我用设置格式long进行了测试,它实际上是6.000000000000003,3.000000000000000,但这是不对的,因为对于linprog函数,我有限制,比如x1>=6,x2@JiahuiGuo嗯,6+3e-15≥ 6实际上是成立的,就像3@JiahuiGuo My bad一样,这个解决方案显然是不可行的,因为它不是一个整数。您可以检查解是否足够接近积分(一个简单的
norm(x-round(x))<1e-10
可以工作)。我可以问你为什么要做检查而不仅仅是四舍五入吗?原因是我已经尝试过了,我使用norm(x-floor(x))<1e-20来尝试让它工作,但在某些情况下,norm(x-floor(x))会大于阈值,这就是为什么我想找到一个更通用的解决方案,而不是在这里提供阈值@流明