Matlab语言,可以做一个`single`!

示例

概述:

MATLAB中数字数组的默认数据类型为double。double是数字的浮点表示形式,此格式每个值占用8个字节(或64位)。在某些情况下,例如仅处理整数或数字不稳定不是迫在眉睫的问题时,可能不需要这么高的位深度。因此,建议考虑single精度(或其他适当类型)的好处:

  • 更快的执行时间(在GPU上尤其明显)。

  • 内存消耗的一半:可能double由于内存不足错误而失败;作为文件存储时更加紧凑。

使用以下方法将变量从任何受支持的数据类型转换single为:

sing_var = single(var);

一些常用的功能(如:zeros,eye,ones等),其输出double由默认值,允许指定的类型/类的输出。

将脚本中的变量转换为非默认精度/类型/类:

截至2016年7月,尚无记录的方法可从更改默认的MATLAB数据类型double。

在MATLAB中,新变量通常模仿创建它们时使用的变量的数据类型。为了说明这一点,请考虑以下示例:

A = magic(3);
B = diag(A);
C = 20*B;
>> whos C
  Name      Size            Bytes  Class     Attributes
  C         3x1                24  double
A = single(magic(3)); % A is converted to "single"
B = diag(A);
C = B*double(20);     % The stricter type, which in this case is "single", prevails
D = single(size(C));  % It is generally advised to cast to the desired type explicitly.
>> whos C
  Name      Size            Bytes  Class     Attributes
  C         3x1                12  single

因此,似乎可以强制转换/转换几个初始变量以使更改渗透到整个代码中-但不建议这样做(请参见下面的注意事项和陷阱)。

注意事项和陷阱:

  1. 重复转换是泄气由于引入数字噪声(从铸造时的single到double)或信息(从铸造时损失double到single,或之间的某些整数类型),例如:

    double(single(1.2)) == double(1.2)   
    ans =
        0

    使用可以稍微缓解这种情况typecast。另请参见注意浮点错误。

  2. 仅仅依靠隐含的数据类型(即什么MATLAB猜测的计算应该是输出的类型)被劝阻由于可能出现的一些非预期的效果:

    为了提高代码的可读性并减少有害类型的风险,建议采用防御方法,其中将变量显式转换为所需类型。

    • 信息丢失:当double期望结果时,如果不小心组合single和double操作数,则会产生single精度。

    • 出乎意料的高内存消耗:当single期望结果但粗心的计算导致double输出时。

    • 使用GPU不必要的开销:当将gpuArray类型(即,存储在VRAM中的变量)与非gpuArray变量(即通常存储在RAM中的变量)混合在一起时,必须先以一种或另一种方式传输数据,然后才能执行计算。此操作需要时间,并且在重复计算中会非常明显。

    • 将浮点类型与整数类型混合时会出错:未为整数和浮点类型的混合输入定义mtimes(*)之类的函数-会出错。整数类型输入根本没有定义times(.*)之类的函数-并再次出错。

      >> ones(3,3,'int32')*ones(3,3,'int32')
      Error using  *
      MTIMES is not fully supported for integer classes. At least one input must be scalar.
      >> ones(3,3,'int32').*ones(3,3,'double')
      Error using  .*
      Integers can only be combined with integers of the same class, or scalar doubles.

也可以看看:

  • MATLAB文档:浮点数。

  • Mathworks的技术文章:将MATLAB代码转换为定点的最佳实践。