如何强制函数返回int32整数?

时间:2018-01-27 16:49:39

标签: arrays matlab casting mixed-integer-programming

我在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 个答案:

答案 0 :(得分:3)

以下是documentationls -l|awk '{A[$6":"]++}END{for (i in A){print i" "A[i]}}' 的示例 :

  

示例:ls -la | grep -c "Jan" 表示: 1 Jan: 19 Feb: 11 Mar: 28 Apr: 10 May: 14 Jun: 24 Jul: 4 Aug: 16 Sep: 10 Oct: 30 Nov: 4 Dec: 1 只取整数值。

因此,如果您希望if (targetPoint != Vector3.Zero) { transform.rotation = Quaternion.LookRotation(targetPoint, Vector3.up); } 的所有元素都是整数,则应将intcon设置为intcon = [1,2,7]

答案 1 :(得分:2)

中定义的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。另请考虑ceilfloorfix

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

答案 2 :(得分:1)

Matlab倾向于在执行计算之前将整数转换为双精度,并且几乎没有什么可以做的,同时避免任何类型的过复杂性。您必须修改您的函数,以便在执行所有计算后将结果类型转换回int32。我从来没有检查过这个事实,但是由于Matlab基本上是Java的包装器,我担心它可以以相同的方式工作:当浮点值被转换为整数值时,它们基本上被截断。因此:

Float      Integer
10.87  ->  10
10.14  ->  10

这就是为什么我建议你在使用int32 function投射之前对值进行舍入,以避免失去太多精度:

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

没问题。

答案 3 :(得分:0)

你可以将双打整数转换成整数

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