默认情况下,Matlab使用double作为数字类型。我正在训练GMM并且内存不足,所以我想将默认数值类型更改为float,将内存的一半作为double。有可能吗?
我知道single(A)
将双精度元素A
转换为单精度,但是我们需要为A用尽内存分配双精度存储。另外,我不能在我的所有矩阵分配中使用single()
,因为许多工具箱中的各种函数都被调用,我无法手动更改。
那么有没有办法调用zeros(n)
默认情况下会分配浮点数矩阵而不是双倍?
答案 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')
的简写,您也可以要求提供其他任何数字类型,例如uint8
或int64
。其他数组创建函数(如ones
,rand
,randn
,NaN
,inf
和eye
支持类似的语法。
请注意,对single
类型的数组执行的操作可能并不总是返回single
类型的输出(因此您可能需要随后将它们转换为single
),并且它们可能会使用不属于single
类型的中间数组(因此您可能无法始终获得您可能希望获得的所有内存优势)。例如,图像处理工具箱中的许多函数将接受single
类型的输入,但随后将在内部转换为double
以执行操作。统计工具箱中用于拟合GM模型的函数似乎接受single
类型的输入,但我不知道它们在内部做了什么。