我在 Matlab 中有一个我定义的命令,它应该返回整数值:
x = intlinprog(f,intcon,A,b,Aeq,beq,lb,ub)
我不想对结果进行四舍五入。我希望从一开始就int
值。
这是我尝试过的:
x = int32([0 0 0 0 0 0 0 ])
x = intlinprog(f,intcon,A,b,Aeq,beq,lb,ub)
%// but this is not working, and not giving integer values.
知道我如何强制x
成为int
值的矩阵而不是double
吗?
文档中intcon
的示例:
示例:
intcon = [1,2,7]
表示x(1), x(2), and x(7)
仅采用整数值。
因此,如果您希望x
的所有元素都是整数,则应将intcon
设置为 1:numel(f)
。
中定义的x
x = int32([0 0 0 0 0 0 0])
被覆盖
x = intlinprog(f,intcon,A,b,Aeq,beq,lb,ub)
因此,您有三种选择:
1( 在函数外部强制转换int32
:
x = int32(intlinprog(f,intcon,A,b,Aeq,beq,lb,ub))
2( 或内部
function [ output ] = intlinprog(...)
...
...
output = int32( output )
end
如果您认为有必要,请先使用round
。还要考虑ceil
、 floor
和fix
。
3(或者最后,可能是您的实际意图,正确使用预分配的数组:
x = int32( [0 0 0 0 0 0 0] )
x(1:end) = int32(intlinprog(f,intcon,A,b,Aeq,beq,lb,ub))
通过x(1:end)
,您不会覆盖先前定义的x
,而是填充其数组元素并因此保留数据类型。但是,函数的输出和预分配的数组需要具有相同的大小。
Matlab 倾向于在执行计算之前将整数转换为双精度值,您几乎无能为力,同时避免了任何形式的过度复杂化。您必须修改函数,以便在执行所有计算后将结果类型转换回int32
。我从未检查过这个事实,但由于 Matlab 基本上是 Java 的包装器,我担心它可以以同样的方式工作:当浮点值被转换为整数值时,它们基本上被截断了。因此:
Float Integer
10.87 -> 10
10.14 -> 10
这就是为什么我建议您在使用 int32 函数强制转换值之前对值进行舍入,以避免丢失太多精度:
function result = intlinprog(...)
% Your computations here...
result = int32(round(result));
end
编辑
我检查了一下:
A = [
10.53;
10.01;
10.44;
10.87
];
int32(A)
ans =
4×1 int32 column vector
11
10
10
11
结果让我假设在类型转换之前在内部执行了四舍五入到最接近的整数。因此,您只需使用:
function result = intlinprog(...)
% Your computations here...
result = int32(result);
end
没有问题。
您可以将双精度舍入为整数
x = round(intlinprog(f,intcon,A,b,Aeq,beq,lb,ub))