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
因此,似乎可以强制转换/转换几个初始变量以使更改渗透到整个代码中-但不建议这样做(请参见下面的注意事项和陷阱)。
重复转换是泄气由于引入数字噪声(从铸造时的single到double)或信息(从铸造时损失double到single,或之间的某些整数类型),例如:
double(single(1.2)) == double(1.2)
ans =
0
使用可以稍微缓解这种情况typecast。另请参见注意浮点错误。
仅仅依靠隐含的数据类型(即什么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代码转换为定点的最佳实践。