它可以单例
概述:
MATLAB 中数值数组的默认数据类型是 double
。double
是数字的浮点表示 ,这种格式每个值需要 8 个字节(或 64 位)。在某些情况下,例如仅处理整数或当数值不稳定性不是迫在眉睫的问题时,可能不需要如此高的比特深度。因此,建议考虑 single
精度(或其他适当类型 ) 的好处 :
- 更快的执行时间(尤其在 GPU 上可见)。
- 内存消耗的一半:由于内存不足错误导致
double
失败; 存储为文件时更紧凑。
将变量从任何支持的数据类型转换为 single
是使用以下方法完成的:
sing_var = single(var);
一些常用的功能(如: zeros
, eye
, ones
,等等 )默认的是输出 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
因此,在整个代码中转换/转换几个初始变量似乎已经足够了 - 但是不鼓励这样做 (参见下面的警告和陷阱 )。
警告和陷阱:
-
由于引入数字噪声(从
single
转换为double
时)或信息丢失(从double
转换为single
,或在某些整数类型之间 ),不鼓励重复转换,例如:double(single(1.2)) == double(1.2) ans = 0
-
仅仅依赖于隐式数据类型(即 MATLAB 猜测计算输出的类型应该是什么)是**不鼓励的,**因为可能会产生一些不希望的影响:
-
信息丢失 :当预期得到
double
时,但是single
和double
操作数的粗心组合产生了精度。 -
意外的高内存消耗 :当预期
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 代码转换为固定点的最佳实践 。