首页 > 系统相关 >MATLAB中的“内存不足”?使用此技巧可轻松将内存使用量减半

MATLAB中的“内存不足”?使用此技巧可轻松将内存使用量减半

时间:2022-08-31 08:46:38浏览次数:90  
标签:mydata 内存 整数 内存不足 使用量 MATLAB integer 数据 1000

MATLAB中的“内存不足”?使用此技巧可轻松将内存使用量减半

我将演示如何简单地更改数字数据的精度可以将内存使用量减少一半甚至更多

Photo by 拥有摄影 on 不飞溅

H 您是否曾经在 MATLAB 中遇到内存问题并上网查找?

Google Search result for what to do if you run out of memory.

事实证明,#7 在许多情况下是最简单的解决方案,最多可以减少 90% 的内存使用。此方法附带 额外的好处是,如果您保存变量,它们还将占用更少的硬盘空间并更快地加载 .

让我们深入了解如何减少内存使用(这些概念适用于其他编程环境,但我将专注于 MATLAB):

这篇文章中讨论的关键命令:

**谁是** ******单身的** ******双倍的** ******整数16** ******格式**

当涉及到数值数据时,您可以使用指定类型 单身的 或者 双倍的 但人们几乎从不这样做!这对您的数据意味着什么?让我们看一些随机的例子:

 我的数据 = 兰德(1000,1000); % 不要省略这个分号!  
 谁的我的数据

你会看到一个表格,上面写着你的变量 我的数据 字节值等于:8 000 000。即 8 兆字节。储存在你的记忆中。

在字节旁边,它会说“双”。默认情况下,MATLAB 会创建一个非常浪费的双精度变量。尝试这个:

 我的数据=单(兰德(1000,1000)); % 不要省略这个分号!  
 谁的我的数据

从双人变成单身,我们会失去什么?

 mydata_double = rand(1000,1000);  
 我的数据单=单(我的数据双);  
 mean(mydata_double,'all') % 这里没有分号  
 意思是(mydata_single,'全部')

您会看到双精度变量的结果是“0.500049032047244”,而单精度变量的结果是“0.5000491”。如果 5,000,490 和 5,000,491 之间的差异会对您的数据产生重大影响,那么 不要转换为单身 .

我们可以用整数做得更好吗?

是的。有警告。如果您对 50% 感到满意,您可以在此处停止阅读。但是,如果您愿意加倍努力,请继续。仅当您使用 single 然后使用整数格式 int8 或 int16 测试结果时才应该这样做,并且您确认它们具有可比性。使用整数很复杂,但在某些情况下是值得的。

  • 警告 1: 数据应该已经是双精度格式的整数,或者可以舍入为整数而不会丢失太多信息(例如 1.001、2.0045 等),或者您应该准备好来回转换数据。

如果你不小心,要看看这个警告会如何伤害你——试试这个:

 我的数据 = 兰德(10,10);  
 我的数据 = int8(我的数据);  
 我的数据

❌ 你会得到一堆 0 和 1,因为你的数据已经四舍五入了。

我们怎样才能避免这种情况?您可以将每个数字乘以 10、100 或 1000,然后在必要时再减去。

 % 扩大数据规模并缩小规模  
 to_integer = @(x) x*1000  
 to_decimal = @(x) double(x)/1000 % 转换为整数  
 mydata = int16(to_integer(rand(10,10))); % 又翻倍!  
 我的数据 = to_decimal(我的数据);
  • 警告 2: 你的整数必须有一个你不会超过的最小值和最大值(如果你这样做,它将被四舍五入到那个值)。

如果您正在转换使用 整数16 这意味着 -2¹⁶ 到 2¹⁶,因此您可以存储 -65536 和 +65536 之间的值 - 或 -6.5536 和 +6.5536 之间的小数精度 - 或 -65.636 和 +65.636 之间。看看它是如何工作的?

一个的最大值是多少 你8 矩阵?滚动到底部以获得答案。

警告 3: 如果要对矩阵进行某些类型的处理,则需要转换为双精度或单精度。例如,您可以获取矩阵的均值或标准差,但不能使用 投资 例如,计算矩阵逆。

让我们看看每种数据的节省情况

我们将尝试假设我们的数据将小于 256,并且我们可以容忍丢失一些小数(您应该始终检查这是否适用于您的数据)。

 to_integer = @(x) (x*100)  
 to_decimal = @(x) ( double(x) /100 ) 我的数据 = 兰德(1000,1000); % 8 MB 双倍  
 mydata_to_integer = to_integer(mydata); % 仍然是 8 兆字节(双倍)  
 mydata_to_integer = single(mydata_to_integer); % 现在 4 兆字节 % 检查最小值和最大值是否在 -2^16 和 2^16 之间  
 [ min(mydata_to_integer,[],'all'),max(mydata_to_integer,[],'all') ]  
 mydata_to_integer = int16(mydata_to_integer); % 现在 2 兆字节 % 因为最大值是 100,我们可以下到 int8 mydata_to_integer = int8(mydata_to_integer); % 1 兆字节!

现在让我们尝试恢复我们的原始数据,并通过计算平均值来看看它有多准确:

 长格式  
 mean(mydata, 'all') % 原始数据  
 to_decimal(mean(mydata_to_integer,'all')) % 转换回来的数据

0.500068458752177 与 0.500070540000000。让我们也计算标准偏差。

 标准(我的数据,[],'全部')  
 标准(to_decimal(双(mydata_to_integer)),[],'全部')

0.288641641801215 与 0.288675051151625 - 我们可以忍受。

结论

为了节省内存(RAM 和硬盘存储),您应该使用 单(你的变量) .这是将内存使用量减半的最简单、最直接的方法。如果你想减少高达 90% 的内存使用,你应该仔细尝试 整数16 或者 你8 (它存储 -256 和 +256 之间的值,作为上述问题的答案)。

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明

本文链接:https://www.qanswer.top/2890/30353108

标签:mydata,内存,整数,内存不足,使用量,MATLAB,integer,数据,1000
From: https://www.cnblogs.com/amboke/p/16641672.html

相关文章

  • 线性二次最优控制-圆轨迹跟踪matlab
    点击查看代码clearall;closeall;clc;%%参数ts=0.1;t=30;d=1.45;%%初始状态x(1)=0;y(1)=0;xita(1)=0;v=3;w=0.2;u=[v;w];Z(:,1)=[-3;-3;0.2];fo......
  • matlab中数据结构之-tables
    作为matlab中的一种数据结构,是一种按行和列存储信息的一种表格式的数据结构,同一列中的数据具有相同的长度,和我们平常见到的表差不多。使用关键table函数创建,格式为tabl......
  • 使用matlab生成正弦波、三角波、方波
    生成余弦波数据(该示例中展示了如何输出十六进制数据到文件中)N=100;y=zeros(N,1);%生成100行*1列的矩阵y_integer=zeros(N,1);%生成100行*1列的矩阵y_h......
  • MATLAB R2022a中文版下载及安装教程(图文详解免费版)
    一、下载下载地址:点击下载二、安装激活1、如果安装有旧版本,请先卸载;2、使用WinRAR解压镜像文件,或者win10直接加载,点击“setup.exe”开始安装;3、点击右上角高级选项,选......
  • matlab中persistex型的变量
    学习matlab中的persistex类型的变量特性和C语言中static型变量差不多。请看代码:1%fileName:persistex.m2%Thisscriptdemonstratespersistentvariables3%The......
  • matlab2021a的快捷键修改
    使用matlab2021a,在使用编辑器过程中,默认的快捷键非常不方便。修改如下:1、HOME-->perference,打开perfecence窗口2、左侧MATLAB-->Keyboard-->Shortcuts,右侧Activesetti......
  • 边用边学--Matlab(1)
    边用边学--Matlab(1)Zeros         Size     Table Bitget      就是查看某个数的第几bit Find    ......
  • matlab实现某功能
    类型判断1、查看变量类型时可用class,判断某变量的类型值:会生成0或1,1—匹配,0—不匹配isa(Data,'double')isa(Data,'cell')2、也可用如下。strcmp(class(Data),......
  • matlab读写文件操作
    把数组矩阵写入txt文件,并用逗号或空格隔开1、若需要用,分隔,则下述''用','替换。 dlmwrite('myfile.txt',A,'delimiter',''); 2、fileID=fopen('ma......
  • matlab编写程序时的注释该怎么写
    不同的组织都有不同的规定,对于matlab注释来说,只要包括以下几个方面就差不多够了:1、Nameofthefunction函数的名称2、Descriptionofwhatthefunc......