它可以单例

概述:

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

  • 更快的执行时间(尤其在 GPU 上可见)。
  • 内存消耗的一半:由于内存不足错误导致 double 失败; 存储为文件时更紧凑。

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

sing_var = single(var);

一些常用的功能(如: zeroseyeones等等 )默认的是输出 double 值,允许指定的类型/类的输出。

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

截至 2016 年 7 月,没有记录的方法来更改 double默认 MATLAB 数据类型。

在 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 时,但是 singledouble 操作数的粗心组合产生了精度。

    • 意外的高内存消耗 :当预期 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.
      

    为了获得更好的代码可读性并降低不需要的类型的风险,建议采用防御方法,其中变量明确地转换为所需类型。

也可以看看: