在matlab中将默认数值类型更改为float

时间:2015-06-24 06:51:06

标签: matlab memory

默认情况下,Matlab使用double作为数字类型。我正在训练GMM并且内存不足,所以我想将默认数值类型更改为float,将内存的一半作为double。有可能吗?

我知道single(A)将双精度元素A转换为单精度,但是我们需要为A用尽内存分配双精度存储。另外,我不能在我的所有矩阵分配中使用single(),因为许多工具箱中的各种函数都被调用,我无法手动更改。

那么有没有办法调用zeros(n)默认情况下会分配浮点数矩阵而不是双倍?

2 个答案:

答案 0 :(得分:3)

不,目前无法将默认数字类型更改为float / single。请参阅MathWorks论坛上的这些信息性帖子:

另外,在我引用的第一个链接上引用John D' Errico - 一位强大而传奇的MATLAB专家:

  

这在MATLAB中是不可能的。无论如何,在single工作很少是个好主意。无论如何,它在很多情况下实际上都比较慢。与精确度损失的风险相比,节省的内存几乎不值得。如果绝对必须,请仅对最大的阵列使用single

因此,如果您使用了这么多内存,您应该考虑重新构建算法。如果要解决的线性系统非常大并且系数很多,请考虑使用sparse来降低内存需求。

除此之外,执行此操作会很危险,因为其他工具箱中可能存在依赖于double类型的矩阵类型分配并自动将这些变为single的事实可能会产生意外后果的功能

答案 1 :(得分:2)

正如@rayryeng所说,在MATLAB中没有办法改变默认的数字类型"到single。我甚至不完全确定这意味着什么。

但是,您也提出了一个具体问题:

  

那么有没有办法调用zeros(n)默认情况下会分配浮点数矩阵而不是双倍?

是的 - 您可以使用zeros(n, 'single')。这将为您提供一个single类型的零数组。 zeros(n)只是zeros(n, 'double')的简写,您也可以要求提供其他任何数字类型,例如uint8int64。其他数组创建函数(如onesrandrandnNaNinfeye支持类似的语法。

请注意,对single类型的数组执行的操作可能并不总是返回single类型的输出(因此您可能需要随后将它们转换为single),并且它们可能会使用不属于single类型的中间数组(因此您可能无法始终获得您可能希望获得的所有内存优势)。例如,图像处理工具箱中的许多函数将接受single类型的输入,但随后将在内部转换为double以执行操作。统计工具箱中用于拟合GM模型的函​​数似乎接受single类型的输入,但我不知道它们在内部做了什么。