【问题标题】:How to force function to return int32 integers?如何强制函数返回 int32 整数?
【发布时间】:2018-07-06 18:43:41
【问题描述】:

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

【问题讨论】:

  • 我对您的问题进行了大量修改,下次请多花点时间格式化和制定您的问题。这不是一个简单的在线论坛,而是一个严肃的问答网站。
  • 您似乎忽略了一件非常重要的事情,即线性规划方法不适用于离散变量。整个领域都在研究整数规划和混合整数规划算法以优化此类问题。

标签: arrays matlab casting mixed-integer-programming


【解决方案1】:

这是来自documentationintcon 示例 :

例如:intcon = [1,2,7] 表示x(1), x(2), and x(7) 只取整数值。

因此,如果您希望x 的所有元素都是整数,您应该将intcon 设置为1:numel(f)

【讨论】:

  • 这么奇怪的巧合,OP的自定义函数和工具包函数的名字、参数的名字和顺序恰好一模一样……
  • 我认为当用户学会如何参考文档时,大多数问题都是可以解决的。
【解决方案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,而是填充其数组元素并因此保留数据类型。不过,函数的输出和预分配的数组需要具有相同的大小。

【讨论】:

    【解决方案3】:

    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
    

    没有问题。

    【讨论】:

    • 我很难接受您所说的“Matlab 基本上是 Java 的包装器”。 MATLAB 是用 C 和 C++ 编写的,并且可能还有 Fortran 组件。 UI 是 Java 7 左右的版本,现在可以直接调用 Java 方法。但是计算不是在 Java 中完成的,如果任何与语言相关的代码(解析、执行引擎、JIT)是 Java,我会感到惊讶。请注意,MATLAB 于 1984 年首次发布,Java 于 1995 年由 Sun 首次公开(根据 Wikipedia)。
    • C 和 C++ 都通过截断将浮点数转换为整数。 Java 可能从 C 继承了这一点。
    【解决方案4】:

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

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

    【讨论】:

    • 我不想重新计算结果..我希望从一开始就将值设为 int
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-04-08
    • 1970-01-01
    • 2019-02-25
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多