2

我在 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

4

4 回答 4

3

这是文档intcon中的一个示例 :

示例:intcon = [1,2,7]表示x(1), x(2), and x(7)仅采用整数值。

因此,如果您希望 的所有元素x都是整数,则应设置intcon1:numel(f).

于 2018-01-27T17:37:00.387 回答
2

x定义的

x = int32([0 0 0 0 0 0 0]) 

被覆盖

x = intlinprog(f,intcon,A,b,Aeq,beq,lb,ub)

所以你有三个选择:

int321)在你的功能之外投射:

x = int32(intlinprog(f,intcon,A,b,Aeq,beq,lb,ub))

2) 或内部

function [ output ] = intlinprog(...)
   ...
   ...

   output = int32( output )

end

之前使用round,如果您认为有必要。也考虑ceil和。floorfix

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,而是填充其数组元素并因此保留数据类型。您的函数的输出和预分配的数组需要具有相同的大小。

于 2018-01-27T17:03:02.550 回答
1

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

没有什么问题。

于 2018-01-27T17:23:25.573 回答
0

您可以将双精度数舍入为整数

x = round(intlinprog(f,intcon,A,b,Aeq,beq,lb,ub))
于 2018-01-27T16:53:41.947 回答