Matlab对带有向量参数的mod()、isequal()、floor()函数给出了错误的答案
我用matlab来解一个混合整数规划,在我从linprog得到一个解之后,我想评估它们是否都是整数(x是n维),但我想不出一个方法来实现这一点 所有的函数,例如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
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))会大于阈值,这就是为什么我想找到一个更通用的解决方案,而不是在这里提供阈值@流明