我正在使用matlab来解决混合整数编程,在我从linprog获得解决方案之后,我想评估它们是否都是整数(x是n维),但我无法想出办法来做到这一点。
所有功能,例如mod(x,1) == 0
,isequal(x,floor(x))
都会产生错误的反响。
更奇怪的是,如果您手动输入具有相同参数的矢量,则结果是正确的。
显示结果:(这里的所有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
答案 0 :(得分:2)
似乎是来自linprog的积分1,实际上是一个非常接近1的浮点数,但不等于它。只是你(默认情况下)无法通过在MATLAB中输出数字来区分。请参阅此问题comparing floating point values。另请参阅有关display format of numbers的MATLAB手册页。
默认情况下,MATLAB使用format short
显示数字:
format
将浮点数值的显示设置为默认显示格式,即固定的十进制短格式。此格式显示5位缩放的定点值。
因此,1 – 1e–10
显示为1,即使它不等于为1.同样,mod(1 – 1e–10, 1)
将是显示为1,即使它确实是1 – 1e–10
。
如果您手动将x
设置为其显示的表示,则所有不太重要的数字都会被截断,“奇怪地”会给您预期的结果。
在输入命令x
后检查format long
。