大数据指的是创建的数据和供分析的数据的数量与速率迅速增加。
此趋势的主要驱动因素是不断增加的信息数字化。采集设备的数量和类型以及其他数据生成机制无时无刻不在增加。
大数据源包括来自仪表传感器、卫星和医疗图像的流数据,来自安全摄像机的视频以及派生自金融市场和零售运营的数据。上述来源的大数据集可以包含千兆字节或百万兆字节的数据,并且每天以兆字节或千兆字节的级别增长。
大数据使分析师和数据专家有机会获得更好的见解,进行更明智的决策,但是它同时也会带来许多的挑战。可用的内存可能无法足以处理大数据集,可能需要花太久的时间进行处理或可能流动太快而无法存储。标准算法通常不能以合理的时间或内存来处理大数据集。没有任何一种单一方法可以处理大数据。为此,MATLAB 提供了许多工具来解决这些挑战。
====================================================================================
上面是matlab官网的一些相关介绍。
其中在编程中用到的几个重要函数:
1、Matlab内存映射文件
在maltab程序中,经常需要读取一些.mat格式的数据文件,如果文件非常大,内存装不下或者加载时间过长,我们可以通过matlab提供了内存映射文件机制(memroy mapped file)[1]来解决这一问题。内存文件映射是一种内存管理方法,应用程序可以通过内存指针对磁盘上的文件进行访问,从而不需要预先将整个文件加载到内存中去。
Matlab内存映射文件的语法格式如下:
m = memmapfile(filename)
m = memmapfile(filename, prop1, value1, prop2, value2, ...)
memmapfile(filename)创建了一个默认参数的内存映射文件,而m = memmapfile(filename, prop1, value1, prop2, value2, ...)创建一个指定参数的内存映射文件,参数设置见下表1,最后一列Default表示参数默认值,其中Repeat属性中的inf表示顺序读取文件直至文件末尾,映射的内存数据可通过m.Data属性来访问。
表1. Matlab memmapfile参数列表
调用示例:
首先创建一个5000*1维的double数组并保存,gallery是一个maltab测试函数,返回给定参数的测试数组。
randData = gallery('uniformdata', [5000, 1], 0, 'double'); fid = fopen('records.dat','w'); fwrite(fid, randData, 'double'); fclose(fid);
Example 1 创建默认内存映射文件
m = memmapfile('records.dat');Example 2 创建指定参数的内存映射文件
设置offset、Format和Writeble属性,,注意最后得到了一个9744*1的uint32数组,总共是38976字节,加上offset刚好等于5000个double数组的总字节数。
m = memmapfile('records.dat', ... 'Offset', 1024, ... 'Format', 'uint32', ... 'Writable', true);
Type the object name to see the current settings for all properties:
m = Filename: 'd:\matlab\records.dat' Writable: true Offset: 1024 Format: 'uint32' Repeat: Inf Data: 9744x1 uint32 array
Example 3 映射对象
将record.dat文件映射成对象,该对象拥有一个4*10*8 uint32数组成员,变量名为x,,可以通过m.Data(*).x进行访问,*表示index.
m = memmapfile('records.dat', ... 'Offset', 1024, ... 'Format', {'uint32' [4 10 18] 'x'}); A = m.Data(1).x; whos A Name Size Bytes Class A 4x10x18 2880 uint32 arrayExample 4 映射复杂对象
复杂对象拥有model,serialno,expenses三个属性,读取1000次。
m = memmapfile('records.dat', ... 'Format', { ... 'int16' [2 2] 'model'; ... 'uint32' [1 1] 'serialno'; ... 'single' [1 3] 'expenses'}, ... <strong>'Repeat', 1000</strong>);2、硬盘访问.mat文件
Matlab程序中经常要访问.mat文件,通常在作法是用load函数直接加载.mat文件。如果.mat文件非常大,超过了系统可用内存的时候该怎么办呢?Matlab2013b为提供了matfile函数,matfile函数可以通过索引直接访问.mat文件中的Matlab变量,而无需将.mat文件加载入内存。
matfile有两种用法:
m = matfile(filename),用文件名创建matfile对象,通过这个对象可以直接访问mat文件中的matlab变量。
m = matfile(filename,'Writable',isWritable),isWritable开启或关闭文件写操作。
使用示例:
1. 向mat文件中写入变量
x = magic(20);
m = matfile('myFile.mat'); % 创建一个指向myFile.mat的matfile对象
m.x = x; % 写入x
m.y(81:100,81:100) = magic(20); % 使用坐标索引
2. 加载变量
filename ='topography.mat';
m = matfile(filename);
topo = m.topo; %读取变量topo
[nrows,ncols] = size(m,'stocks'); %读取stocks变量的size
avgs = zeros(1,ncols);
for idx = 1:ncols
avgs(idx) = mean(m.stocks(:,idx));
end
3. 开启写权限
filename ='myFile.mat';
m = matfile(filename,'Writable',true);
或者
m.Properties.Writable = true;
新版本的MATLAB推出了可以处理任意大图像的函数blockproc,其用法如下:
B = blockproc(A,[M N],fun) B = blockproc(src_filename,[M N],fun) B = blockproc(adapter,[M N],fun) blockproc(...,param,val,...)
A是要处理的图像矩阵,如果图像太大不能完全导入内存,也可以用图像文件名src_filename来表示。[M,N]是希望每次分块处理的矩阵大小,fun是函数句柄,即对每块矩阵的处理函数。
需要说明的是blockproc默认支持tiff/tif和jpeg2000格式的任意大图像处理,如果要读取其他格式的大图像需要针对该图像格式再写一个继承自MATLAB中ImageAdapter这个抽象类的子类adapter,来满足blockproc的输入要求。MATLAB帮助文档中有一个读取lan格式的LanAdapter示例类,大家可以参照那个格式来构造任意图像格式的Adapter类来实现blockproc函数对任意大图像文件的支持。
最后一种调用格式可以实现读取大图像文件,分块处理后再在指定路径写入处理后的图像文件,这个非常有用。
fun = @(block_struct) repmat(block_struct.data,5,5) ; %注意处理函数的输入必须是结构体,其data域是我们的矩阵数据,这是由blockproc分块后的机制决定 blockproc('moon.tif',[16 16],fun,'Destination','C:\moonmoon.tif'); imshow('C:\moonmoon.tif')
4、nlfilter函数
功能:用来执行通用的滑动邻域操作。 用法: B = nlfilter(A,[m n],fun) B = nlfilter(A,[m n],fun,P1,P2,...) B = nlfilter(A,'indexed',...) B = nlfilter(A,[m n],fun)对图像A的每个大小为m*n的patch进行fun函数的操作,patch的取法为滑动(sliding),即patch的中心像素遍历图像的每个点,当取到边界时需要进行边界延拓。fun必须是函数的句柄,可自由定义也可取matlab内置的函数。例如fun函数必须接受m*n块作为输入,并返回一个标量y,形如: c=fun(x) c为m*n块x的中心像素点的输入值。 例子:B = nlfilter(A,[3 3],@myfun); 其中myfun是以m文件如下: function scalar = myfun(x) scalar = median(x(:));
调用格式:B = colfilt(A,[m n],block_type,fun)
意为将图像A重排成每列为m*n块拉成一列组成的临时矩阵,对该临时矩阵进行fun函数的操作。
例:
对图像的I的每个5*5邻域进行取标准差的运算 :I2 = uint8(colfilt(I,[5 5],’sliding',@std));
另:
在调用fun函数处理前,colfilt先调用了im2col生成了临时矩阵,调用fun函数处理之后,又调用col2im将成列的矩阵重排为块。
colfilt与blockproc及nlfilter相比,用法类似,但速度更快。
6、padarray函数
功能:填充图像或填充数组。 用法:B = padarray(A,padsize,padval,direction) A为输入图像,B为填充后的图像,padsize给出了给出了填充的行数和列数,通常用[r c]来表示。padval和direction分别表示填充方法和方向。它们的具体值和描述如下: padval: 'symmetric'表示图像大小通过围绕边界进行镜像反射来扩展; 'replicate'表示图像大小通过复制外边界中的值来扩展; 'circular'图像大小通过将图像看成是一个二维周期函数的一个周期来进行扩展。 direction: 'pre'表示在每一维的第一个元素前填充; 'post'表示在每一维的最后一个元素后填充; 'both'表示在每一维的第一个元素前和最后一个元素后填充,此项为默认值。 若参量中不包括direction,则默认值为'both'。若参量中不包含padval,则默认用零来填充。若参量中不包括任何参数,则默认填充为零且方向为'both'。在计算结束时,图像会被修剪成原始大小。 举例: A = [1 2; 3 4]; B = padarray(A,[3 2],'replicate','post')
7、repmat
即 Replicate Matrix ,复制和平铺矩阵,是 MATLAB 里面的一个函数。repmat( )函数的作用主要是利用了类似分治算法构造矩阵的思想、给出一个小规模矩阵,按指定要求构造出一个大矩阵
B = repmat(A,m,n) B = repmat(A,[m n]) B = repmat(A,[m n p...]) 一、repmat(NaN,m,n)等价于NaN(m,n). 二、repmat(single(inf),m,n)等价于inf(m,n,'single'). 三、repmat(int8(0),m,n)等价于zeros(m,n,'int8'). 四、repmat(uint32(1),m,n)等价于ones(m,n,'uint32'). 五、repmat(eps,m,n)等价于eps(ones(m,n)).B = repmat(A,m,n)
在matlab中,如果有以下操作:
Inv(A)*B, 建议用左除A\B代替。