Who am I

我的照片
Hefei, Anhui, China
Research Fields: Satellite Geodesy
显示标签为“Matlab”的博文。显示所有博文
显示标签为“Matlab”的博文。显示所有博文

2013年11月14日星期四

matlab 使用subplot时添加总title

使用subplot时,直接使用title命令时,只能将title添加在分图上,如果想给总图添加title应如何操作?

只需在最后一个subplot结束之后加上两行代码即可:
axes
set(gca,'visible','off','Title',text('string','\bfHello World!'))

2013年9月11日星期三

ubuntu12.04下安装matlab2013a

ubuntu12.04下安装matlab过程:

1. 下载matlab镜像文件(.iso),假设文件名为Matlab2013a.UNIX.iso
2. 挂载iso文件,命令为: sudo mount -o loop Matlab2013a.UNIX.iso /mnt
3. 进入挂载目录: cd /mnt
4. 安装: sudo ./install
5. 出现图形化安装界面,根据提示输入key以及license文件;
6. 默认安装位置为: /usr/local/MATLAB/R2013a
7. 更改权限: sudo chmod a+w -R ~/.matlab (重要)
8. 运行软件,命令为:sudo /usr/local/MATLAB/R2013a/bin/matlab (每次运行matalb程序输入命令太长,可以在.bashrc文件中加入alias matlab='bash /usr/local/MATLAB/R2013a/bin/matlab',这样以后只要输入matlab命令即可打开软件

注:由于license文件必须在ife的网络中才能有效,所以在以后的安装中注意这点,避免重复安装和卸载。


2013年5月30日星期四

自定义colormap meep (zt)

matlab 自定义colormap meep (from red through white to blue)

I have been thinking of using the colormap used in the MEEP software (an open source FDTD code) as a nice alternative to the classical Matlab colormap. Here is the short Matlab code to generate it and the resulting images:

mincolor    = [1 0 0]; % red
mediancolor = [1 1 1]; % white   
maxcolor    = [0 0 1]; % blue      

ColorMapSize = 4;
int1 = zeros(ColorMapSize,3); 
int2 = zeros(ColorMapSize,3);
for k=1:3
    int1(:,k) = linspace(mincolor(k), mediancolor(k), ColorMapSize);
    int2(:,k) = linspace(mediancolor(k), maxcolor(k), ColorMapSize);
end
meep = [int1(1:end-1,:); int2];

colormap(meep); 
colorbar

参考资料:
http://meyavuz.blogspot.de/2011/02/meep-colormap-for-matlab.html

2013年5月9日星期四

线性方程组求解与矩阵求逆

1. 线性方程组
在大地测量数据处理方面,线性方程组的求解无疑是最重要的问题之一。线性方程组的通用形式可写为\( AX=B \),系数矩阵A的维数为 \( (M,N) \),\( M \)为观测方程的个数(等于观测值的个数,1个观测值一个方程),\(N\)为需要求解的系数个数,因此向量\( X \) 的长度为\( N \),观测值向量\( B \)的长度为\( M \)。根据\(M\)和\( N \)的大小观测,可以将线性方程组分为三类:
  • \( M > N \), 超定方程组(也称矛盾方程组),此时通常求方程的LS解;
  • \( M = N \),适定方程组,有唯一解;
  • \( M < N \),欠定方程组,有无数组解,但通常求其最小范数解。
接下来主要讨论超定方程组和适定方程组的情况。
对于超定方程组,根据LS准则,可得到法方程:\( A^TAX=A^TB \),令\( C=A^TA,D=A^TB \),则\( C \)的维数为\((N,N)\),D的维数为\((N,1)\),此时法方程的求解与适定方程组一致。下面的讨论以适定方程组为例。

2. 线性方程组的求解与求逆的关系
线性方程组\( AX=B \)的求解在数学上表示为\( X=A^{-1} \times B \),但是在实际数值计算过程中,并不是一定要去计算\( A^{-1} \),如常用的消去法,三角分解前推回代法等。
矩阵求逆等价于求解方程组\( AX=I \),理论上与求解线性方程组一致。
在数值计算过程中,我们必须考虑计算的速度以及对内存的耗用情况,此时求逆和线性方程组的求解是两个不同的概念。
在求解线性方程组之前,必须明确你所需要的结果。如果只要最后结果\( X \),则尽量不要去求逆;
如果系数阵\( A \)的求逆无法避免,尽量选择快速的求逆算法。当然,对于小矩阵,就不用考虑两者的差别了。
用matlab函数表示以上情况:
\( X=A\B \) (基于LU分解,前推回代直接求解参数向量\( X \));
\( X=A^{-1} \cdot B \) (基于求逆求解参数向量\( X \) );
通常第一种方法速度快,占用内存少,但无法给出\( A^{-1} \)的信息。

3. 线性方程组的常用数值解法
通常把线性方程组的数值解法分为直接法和间接法。所谓直接法,就是经有限次运算即可求得方程组的精确解的方法;迭代法将求解的方程组转化为一个无限序列,其极限就是方程组的解。直接法一般来说用于求解系数矩阵阶数不是太高的问题,工作量较小,精度较高,但程序较复杂;迭代法主要用于一些高阶问题,一般程序较为简单,但工作量有时较大,耗用内存较多。
1> 直接法
 a. 克莱姆法则
\( x_i=\frac{det(A_i)}{detA} \)
算法复杂度:\( (n+1) \times [(n-1) \times n! + n!] \)
运算量非常大,理论上可行,实际计算中很少用;

三角形方程组的求解简单快速,所以通常将系数阵A转化为三角阵再进行运算。不同的分解形式对应不同的分解方法。求解下三角阵L的过程,称为前推\( (X_1-X_2---X_n) \);求解上三角阵U的过程,称为回代\( (X_n---X_2-X_1)\)。前推和回代的计算量一样,为\( \frac{n^2}{2} \)次乘法和加减法以及n次除法。

b. 高斯消去法
利用消去法,将方程组变换为上三角形方程组;整个消去过程需完成\( O(\frac{1}{3}n^3) \)次乘法和加法运算; 回代过程需\( \frac{n^2}{2} \)次乘法和加减法以及n次除法,故用消去法求解n阶方程组的计算量约为\( O(\frac{2}{3}n^3+2n^2) \);
从高斯消去法进一步完善,产生了列主元和全主元消去法,这两种方法在消去过程中的计算量进一步增加,但方法上更严谨。
每一步消去过程对应系数阵A左乘了一个初等变换矩阵,这一系列初等变换矩阵的乘积对应一个下三角矩阵L,故高斯消去法理论上等价与LU分解法。

c. LU分解法
将系数阵A直接分解成两个三角阵的乘积,根据矩阵运算的规则计算每个三角阵的元素。分解后\( AX=B \)的计算转化为两个三角形方程组的求解:
\( LY=B \) (前推,计算出Y)
\( UX=Y \) (回代,计算出X)
算法复杂度为 \( O(\frac{2}{3}n^3+2n^2) \),所以直接分解法与消去法的计算工作量基本上是相同的。

求解逆阵的算法复杂度为\( O(2n^3) \),是求解线性方程组的3倍。

d. 正交分解法
将矩阵A分解为一个正交阵和一个上三角阵的乘积,\( A=QR \)。根据分解方法,通常有Householder方法(镜像映射法)和Schmidt正交化方法。
运算复杂度为:\( O(\frac{4}{3}n^3+2n^2) \),与上面两种方法相比,运算量多一倍。
该方法在求解超定方程组时,较为优越,原因如下:
 \( A^TAX=A^TB \)  with \( A=QR \), then \( R^TQ^TQRX=R^TQ^TB \) and finally, \( RX=Q^TB \),因此,QR分解大大减少了计算量。

e. 对称正定矩阵的平方根法和\( LDL^T\)分解法
对称正定矩阵是特殊矩阵,可以用平方根法和\( LDL^T\)分解法(通常也叫做Cholesky decomposition),其运算量和存储量较普通消去法和LU分解法均节省一半,为\( O(\frac{1}{3}n^3+2n^2) \)
平方根分解:\( A=LL^T \)
\( LDL^T\)分解:\( L \) 为单位下三角阵

2> 迭代法
对于阶数不高的线性方程组,直接法有效,但对于阶数很高的矩阵,有时需要迭代法来解决。迭代的规则不同,迭代法也就不同。通常分为:线性迭代和非线性迭代;一阶迭代和P阶迭代;定常迭代和非定常迭代。具体,可参考教科书,如“数值计算方法(冯康)”。
共轭梯度法:非线性迭代法,适用于对称正定阵,不需选取任何迭代参数,使用方便。
此外,对于高阶方程组的处理通常还采用分块矩阵处理方法。节省内存需要量,但增加了计算量,需要更多的计算时间(由于内外存交换数据需要时间)。

4. 矩阵求逆
除了必须要求矩阵的逆,否则尽量不采用求逆阵的方法来求解线性方程组。
求逆阵的算法复杂度为\( O(2n^3) \),大约是同等方法求线性方程组\( O(\frac{2}{3}n^3) \)的3倍。
矩阵乘积的算法复杂度和矩阵求逆是等价的。
矩阵求逆当前最快方法的复杂度为\( O(n^{2.37}) \)
高斯消去法,LU分解法,SVD等,复杂度都为\( O(n^3) \),差别在于前面的系数。

特殊矩阵的处理通常会有特殊的方法,能大大减少运算量和存储量。

2013年3月16日星期六

imagesc函数 NaN值颜色设定

imagesc函数主要是用来显示图片,其作用与pcolor类似,两者之间的比较见另一篇帖子。

这里主要介绍利用imagesc函数绘图时,矩阵值为NaN的通常用blue色来表示。如图1所示:
图1. NaN值对应为blue

如果想要将NaN值对应的颜色用白色表示,可以用如下语句:
h=imagesc(C);
set(h,'alphadata',~isnan(C));
所得新的图片如图2:
图2: NaN对应white





matlab图形边框不完整

在用matlab绘图时,有时会出现图形的边框缺少一边或两边,如图所示:
图1:图形边框不完整
解决此问题的方法如下:
方法一:将图片保存成jpg, png等格式时,边框可能会自动出现(不是确定管用的方法);
方法二:设置图形的“渲染”属性,如:h=figure; set(h,'Renderer','opengl')
方法三:开启opengl software,即添加语句:opengl software

关于matlab函数opengl的用法,可以查看说明。

利用上述方法后,得到的图片如下:
图2 完整的图形边框

2012年11月22日星期四

过采样和下采样

数字信号处理中,多速率(Multirate)滤波中经常用到的两个概念:过采样和下采样。

过采样(Oversampling):
使用远大于Nyquist频率进行采样,设原来的采样频率为fs,将采样频率提高到R×fs,R>1。
在这种采样的数字信号中,总的量化噪声功率不变,但这时量化噪声的频谱分布发生了变化,即将原来均匀分布在0 ~ fs/2频带内的量化噪声分散到了0 ~ Rfs/2的频带上。若R>>1,则Rfs/2就远大于音频信号的最高频率fm,这使得噪声大部分分布在频带之外的高频区域,而分布在频带之内的噪声就会相应的减少,于是,通过低通滤波器滤掉fm以上的噪声分量,就可以提高系统的信噪比。
优点:提高信噪比;
缺点:处理数据量大;
目的:改变噪声的分布,减少噪声在有用信号的带宽内,然后通过低通滤波器滤除掉噪声,达到较好的信噪比。

与过采样相对应的是欠采样(R<1),这里不做论述。

下采样(降采样,downsampling):
下采样就是抽取,对于一个样值序列间隔几个样值取样一次,这样得到的新序列就是原序列的下采样。下采样还是要满足采样定理才行,否则这样的下采样会引起信号成分的混叠。
好处:较少数据样点,减少运算时间。
matlab函数:y=downsample(x,n)
其中,x为原始采样数据,n为采样间隔,y为返回的降采样数据。

与下采样相对应的是上采样(upsampling),上采样就是内插,根据原始采样数据进行内插,这样得到的新序列就是原序列的上采样。

过采样和欠采样是原始采样;下采样和上采样是基于原始采样数据进行重采样

过采样——低通滤波——下采样


2012年11月16日星期五

firls和remez函数(最优滤波器设计)

firls和remez是比fir1和fir2更为通用的FIR滤波器设计函数。

firls从实际和理想频率响应之间误差平方和最小(最小二乘LS)的观点出发;
remez从实际和理想频率响应之间最大误差最小化的观点出发。
两者都称为最优滤波器设计,调用格式和语法规则相同,只是优化算法不同。

firls函数:
b=firls(n,f,a); or b=firls(n,f,a,w) (后者为加权最优滤波器)
b=remez(n,f,a); b=remez(n,f,a,w); (后者为加权最优滤波器)
式中n为滤波器阶数;f为滤波器期望频率特性归一化频率向量,范围为0~1;a为滤波器期望频率特性的幅值向量,a和f同长度,且为偶数;b为返回滤波器系数,长度为n+1.


fir1和fir2函数介绍(窗函数法)

fir1和fir2都是基于窗函数法设计FIR数字滤波器的函数。所谓滤波器设计,其实就是确定转换函数H的分子b和分母a。对于FIR滤波器,分母a=1,故只需确定分子b.

fir1用经典的窗函数法设计FIR滤波器,在通带波段的幅值响应为0db,fir2同样利用窗函数法,但其可处理任意的频率响应。

首先介绍fir1的用法:
b=fir1(n,wn[,'ftype',window])
其中,n为滤波器的阶数,对于高通、带阻滤波器,n需取偶数;wn为滤波器截止频率,范围为0~1(归一化频率);ftype为滤波器类型,缺省时为低通或带通滤波器;'high'为高通,'stop'为带阻;window为窗函数列向量,其长度为n+1,缺省时自动取hamming窗。b为滤波器系数向量,长度为n+1。

fir2函数:用于设计具有任意形状频率响应的FIR滤波器,调用格式为b=fir2(n,f,m[,npt,window]);
n为滤波器阶数;f和m分别为滤波器幅频响应的频率向量和幅值向量,取值为0~1(归一化频率);m和f具有相同的长度,window为窗函数,长度为n+1,缺省时取hamming窗;npt为对频率响应进行内插的点数,缺省时为512;b为滤波器系数向量,长度为n+1。



matlab freqz函数说明

freqz函数:计算数字滤波器的频率响应(frequency response)

调用形式:
1. [h,w]=freqz(b,a,n)
返回频率响应矢量h(复数)以及相对应的角频率矢量w(取值范围是0-pi). 输入值b和a是转换函数的分子和分母系数。n是一个正整数,返回值h,w的维数都为n。如果不给出n值,默认是512.

2. h=freqz(b,a,w)
b,a的意义同上,w是输入角频率矢量(维数至少为2),返回对应角频率的频率响应矢量h.

3. [h,w]=freqz(b,a,n,'whole')
b,a,n的意义同用法1,区别在于范围的角频率向量w的取值范围是0-2pi,h是对应的频率响应。

注:以上返回的频率都为角频率,以w表示,单位为rad。

4. [h,f]=freqz(b,a,n,fs)
b,a,n意义同上,fs为采样频率,h为返回的频率响应矢量,f为对应的频率(单位为Hz,取值范围为0-fs/2)。

5. h=freqz(b,a,f,fs)
对应用法2,区别在于输入的不是角频率w,而是频率f,fs为采样频率,返回h为频率响应矢量。

6. [h,f]=freqz(b,a,n,'whole',fs)
对应用法3,输出频率f的范围为0-fs.

7. freqz(b,a,...)
绘制滤波器的幅频、相频响应。

8. freqz(Hd)
用fdesign设计好滤波器Hd后,freqz(Hd)在fvtool中绘制幅频、相频响应。


2012年10月22日星期一

matlab库函数

将自己编写的函数库添加到matlab search path中,这些函数即可被其他函数调用,具体步骤如下:
file--set path--Add Folder--save

当然也可以使用addpath命令:
addpath D:/works/MyMatlabFunctions -end 
该语句将D:/works/MyMatlabFunctions文件夹加到matlab默认搜索路径的最后。


图片空白边缘处理

用latex撰写文档时,插入图片常用的格式为pdf, png和ps格式。在插入图片时,经常遇到的一个问题是:图片的空白边缘,会让生成的latex文档图片周围有大量空白,从而导致页面布局难看。最好的处理方式就是对图片进行编辑,去除图片的空白边缘。以下介绍几种去除图片边缘的方法。 

1. 用matlab绘制图形,保存图形时去除白边
用matlab绘图,如果将图片保存成pdf格式,会导致pdf图片空白边缘非常大。matlab file exchange里面提供了一些函数用来定制图形输出,其中一个很重要的功能就是裁剪白边。
函数文件的地址:http://www.mathworks.com/matlabcentral/fileexchange/23629-exportfig
在使用这些函数时,如果将图片保存成pdf或eps文件时,需要安装gphostscript,具体安装参见该博客另一篇帖子。
举例:export gcf -pdf -r720 'test'   %生成test.pdf文件,图片分辨率为720,默认裁剪。

2. 用GMT绘制的图形(ps),在转换成pdf或png的过程中可以去除白边
ps2raster test.ps -A -E720 -Tg(去除白边)  <====>  ps2raster test.ps -E720 -Tg(不去白边)   png
ps2raster test.ps -A -E720 -Tf (去除白边)  <====>  ps2raster test.ps -E720 -Tf (不去白边)  pdf

3. pdfcrop裁剪pdf
pdfcrop是texlive的一部分,可以用其很方便的裁剪pdf图片的空白边缘。
例:pdfcrop old.pdf new.pdf (生成的new.pdf边缘大小为0,默认)
pdfcrop --margins "5 10 5 10" old.pdf new.pdf (new.pdf边缘<left top right bottom>为5,10,5,10)
pdfcrop --margins 2 old.pdf new.pdf (new.pdf边缘<left top right bottom>都为2)
pdfcrop --margins "2 5" old.pdf new.pdf (new.pdf边缘<left top right bottom>为2,5,2,5)
margins的size单位为bp(bigpoint)

4. pdfedit裁剪
打开pdf文件,选择page--Edit Page Metrics--输入裁剪点的坐标--change。

5.  illustrator, adobe acrobat, inkscape
用这种大型的软件处理和编辑pdf文件,当然也包括裁剪。
注:inkscape是一个矢量图软件。

2012年10月20日星期六

matlab 正态分布密度曲线

本文主要包含两个内容:如何绘制正态分布曲线;如何将直方图与概率密度图联系起来。

绘制正态分布曲线:
norx=normpdf(x,mu,sigma)
其中:x为数据分布区间,如-1:0.1:1; mu为均值; sigma为标准差; norx为对应x区间的密度。
如果直接用normpdf(x),默认是标准正态分布(即mu=0,sigma=1)
norx=norx.*100  %转化成百分比
plot(x,norx,'r-') %绘制密度曲线
注:如果mu和sigma不知道,需要先求出;此外,还有一些normfit函数可以估计一组正态分布数据的均值和标准差。

直方图与概率密度图:
直方图的纵坐标:频率/组距,这样直方图每个bar的面积表示的就是概率。所以在将直方图和概率密度图联系起来时,一定要注意直方图纵坐标的意义(别忘了除以组距)。


2012年10月19日星期五

matlab 绘制统计直方图

这里介绍hist函数结合bar函数绘制统计直方图

一组原始采集数据,如:data=[2 3 -4 -1 4 -5 1 5 -2 -3]; 数据范围为range=-5:5;
首先可以采用hist函数进行分组:
n=hist(data,range);  将数据data根据range进行分组;返回数组n,n的维数同range;
然后用bar画图:
bar(range,n,'hist');   绘制直方图(柱状图),对分组较少的适用。

有时并没有给定分组范围range,而是希望分成count组:
还是使用hist函数分组:
n=hist(data,count); 将原始数据data自动分成count组,根据原始数据值函数自动设定分组范围,返回值n为数组,维数为count,内容为每一分组的频数;
bar(n); 绘制直方图;
如果这里没有给定count,hist(data)默认分成10组。

hist(data,range)直接绘制直方图,但是每个bar之间有间隙,所以,如果想没有间隙的直方图,推荐使用第一种方法。分组如果较多的话,推荐这种方法。


2012年10月13日星期六

matlab几个常用的快捷键

matlab常用的几个快捷键:
  • ctrl+r    注释
  • ctrl+t    取消注释
  • ctrl+i    自动对齐程序
  • ctrl+]    增加缩进
  • ctrl+[    减少缩进
  • ctrl+y   恢复撤销的更改
  • ctrl+w  关闭当前窗口
  • ESC    清除命令行中一行
  • ctrl+u   同ESC
  • ctrl+k   清除光标后至行尾的字符

2012年4月2日星期一

matlab计时

1. tic, toc函数


tic; %计时开始
program body;
toc;   %计时结束


2. cputime函数    %  显示matlab启动后,所占用cpu的时间


t0=cputime;
program body;
t=cputime-t0;


3. clock, etime函数
clock: 显示系统时间;etime: 计算两次调用clock的时间差;


t0=clock;
program body;
t=etime(clock, t0);



2012年3月16日星期五

matlab 拟合

多项式拟合
p=polyfit(x,y,n)
其中x,y是输入数据,对应自变量和应变量;n表示多项式拟合的阶数。
函数的结果p是多项式的系数;
Y=polyval(p,x1)
根据拟合求出的多项式系数p,求解x1变量对应的y值;

2012年1月2日星期一

matlab 画图技巧总结(持续更新中)

1. 坐标轴刻度设置
set(gca, ’XTick’, [0 1 2]) X坐标轴刻度数据点位置,在值为0,1,2的地方显示刻度
set(gca,'XTickLabel',{'a','b','c'}) X坐标轴刻度处显示的字符
因此,set(gca,'xtick',[100 200 300],'xticklabel',[1 2 3]) X轴在值为100,200,300的地方显示刻度1,2,3
例1:y_tick = {'1.00e-004','1.01e-002','2.01e-002','3.01e-002','4.01e-002',...
          '5.01e-002','6.01e-002','7.01e-002','8.01e-002','9.01e-002'}
          set(gca, 'YtickLabel',y_tick);

例2:set(gca,'xticklabel',sprintf('%03.4f|',get(gca,'xtick')));
例1中,当tick值较复杂时,可将tick的值提前赋值到一个变量中,随后利用变量即可;
例2中,在坐标轴刻度的显示过程中可以用sprintf函数,这样即可根据用户的需要显示坐标刻度;注:"|"不可省略


set(gca,'xtick',[]) 不显示x轴的坐标刻度
set(gca,'FontName','Times New Roman','FontSize',14)设置坐标轴刻度字体名称,大小
‘FontWeight’,’bold’ 加粗 ‘FontAngle’,’italic’ 斜体
对字体的设置也可以用在title, xlabel, ylabel等中


2. 坐标轴范围设置
axis(gca,[xmin xmax ymin ymax]) 设置坐标轴范围
axis auto 根据数据自动设置坐标轴范围
axis off  关闭坐标轴
set(gca,'xlim',[-20 20],'ylim',[-20 20]);设置当前图像的坐标轴范围,等同于axis(gca,[xmin xmax ymin ymax])语句
xlim(gca,[-20 20]);设置当前图像的x坐标轴范围
ylim(gca,[-20 20]);设置当前图像的y坐标轴范围

3. 坐标轴网格
set(gca,'xgrid','on');开启x轴网格
grid on;开启坐标轴网格