您的位置:首页 > 编程语言 > MATLAB

matlab常用函数及功能

2017-02-17 00:00 260 查看
摘要: matlab做数据处理时常用的一些函数的使用和技巧

matlab 程序变成可执行行exe程序

电脑安装MATLAB,MATLAB compiler 以及一个MATLAB compiler 支持的第三方C/C++编译器(比如VS)。

配置编译器
mbuild -setup


安装MCR
D:\Program Files\MATLAB\R2014a\toolbox\compiler\deploy\win64
双击 MCRInstaller.exe 安装。

新建test.m 文件
在命令行输入
mcc -m test.m
= = = = = =安装VS的过程中出现了:
VS2010不能正确加载 'VSTS for Database Professionals Sql Server Data-tier Application'包,
== = == = = = = = 这是由于 以前安装过VS,后来卸载了,但是没有完全卸载。所以两者冲突。Start->Microsoft Visual Studio 2010->Visual Studio Tools-->Visual studio Command Prompt (2010)输入:devenv /resetskippkgs回车 亲试已经解决问题!

MATLAB 编辑器 文本内加横线,让程序更加可视化。

%%注释即可加横线,代码分块。直至遇到下一个 %% e.g.:

%% 设定时间
Ntc  = 100;                      % 每个光周其100个点,对应dt=1.0857
dt = T0/(Ntc-1);
%% 基本参数
c=3e8;
lamda=800e-9;                   % wavelenth (m)
I=1.8e14;

%%生成随机数 
randint(m,n,[x,y]) %在[x,y]之间产生m行n列随机整数。
rand(m,n)%产生m行n列在0~1之间的随机数。

%% pcolor 演示,pcolor(X,Y,Z),X是二维矩阵,Y也是二维矩阵,Z为二维矩阵
x=-10:10;
y=-10:10;
[X,Y]=meshgrid(x,y);%产生对应的格点。X对应于Z的列,X(1,:)与X(2,:)相同;Y对应于Z的行,X(:,1)与X(:,2)相同
Z=X.^2+Y.^2;
pcolor(X,Y,Z)

%%暂停n秒
pause(n)

%%将数字转化为字符并进行格式控制
n=10;
str=num2str(n,'%7.7d')       %将n转化为字符,并以七位数字符输出,不够前面补零。

%控制坐标轴标签的字体,颜色,
figure
plot((1:10).^2)
xlabel('str','FontSize',16,)

%控制输入输出
disp(['原子单位制下时间为:']);
a=input('inptu two number:');%a可以为矩阵。比如:输入矩阵时:[1,2,3],或者[1 2 3]

continue与break
continue 跳出本此循环,执行下次循环,
break 跳出距离break最近的循环,不在执行循环

for i=1:4
if i==3
continue;
end
i
end

输出结果为:
i =
1
i =

2

i =
4

for i=1:4
if i==3
break;
end
i
end

i =
1

i =
2

ezplot 画隐函数,从变量中画。

the_C5=3;
ezplot(['(x-0)^2+(y-0)^2=' num2str(th_C5^2)]);%C2
text(0,0,'C2')

控制图片大小,图片更好看

t = 0:0.01:2;
x = sin(2*pi*t);
figure
subplot(2,1,1)
plot(t,x,'k','linewidth',2)
h1=gca;
subplot(2,1,2)
plot(t,-x,'b','linewidth',2)
h2=gca;
set(gcf,'unit','centimeters','position',[3 5 7 5])
% 3和5指定figure在屏幕上的位置,据左边屏幕3cm,据下面屏幕边5cm。7和5指定figure大小。7cm×5cm
set(h1,'Position',[0 0  .5 .4]);
set(h2,'Position',[.6 .6 .3 .3]);
% set(h,'Position',[x1 y1 x2 y2]),x1和y1:h1对应的图的起点在整个图中x轴(y轴)方向的位置,用比例表示。x2,y2,表示h1对应的图片在这个figure中的比例。
%set(h2,'Position',[.3 .3 .5 .5])
xlabel('\fontsize{20} \bftime') %x轴标签,设置字体为20号(默认14号),\bf表示黑体。然后紧跟着是字符‘time’

提高速度

无用的注释删掉
1、尽量避免使用循环
(1)尽量使用像量化的运算代替循环操作,可明显提高执行效率;
(2)在必须使用多冲循环时,尽量将循环次数少的放在外层,较多的在内层。
2、大型矩阵预先定维
给大型矩阵动态定位是很费时的事情,在定义大型矩阵时,首先用Matlab的内建函数,
如zeros()或ones()对变量进行定维,然后赋值,可显著减少时间。
3、二重循环的矩阵代替
使用meshgrid()函数构造两个m×n的矩阵i,j,从而直接得出所需矩阵。如:
[i,j]=meshgrid(1:m,1:n);%m=10,n=1000
H=1./(i+j-1) %此例生成了一个m×n的Hillbert长方形矩阵

4、优先考虑内建函数
它们是由更底层的C语言实现的,执行效率显然要快于使用循环的矩阵运算。

5、采用更有效的算法
你如quad()和quad8(),后者无论在速度上还是在精度上都要明显优于前者。

6、应用Mex技术
比如,当好事的循环不可避免时,可考虑C语言,按Mex技术要求的格式编写相应部分的程序,
通过编译连接,形成Matlab中可直接调用的动态链接库(dll)文件。

7、遵守Performance Acceleration的规则(可以参考帮助文档,总结为以下七条)
1、只有使用以下数据类型Matlab才会对程序加速:
logical,char,int8,uint8,int16,int32,uint32,double,对其它类型不予加速;

2、Matlab不会对超过三维的数组加速;

3、当使用for循环时,只有当for循环的范围内只使用标量来表示并且每一条语句只使用支持加速的数据类型,只是用三维以下的数组,只调用了内建函数时才予以加速;

4、当使用if,elseif,while和switch时,条件测试语句只是用了标量才会予以加速;

5、不要在同一行写入多条操作,这样会减慢执行速度;

6、当某条操作改变了原来的数据类型和形状(大小或维数)时,会减慢速度;

7、应带使用这样的复常量如x=1+2i,而x=1+2*i会减慢速度。


可以使用一对tic/toc来查看某段程序的执行时间。

取整函数 fix 和round

fix, 舍去小数部分 round,四舍五入

fix(-2.03)
ans = -2
fix(-2.96)
ans = -2 >>round(4.3)
ans = 4
round(4.8)
ans = 5

semilogy 函数,y轴用对数坐标。x轴用线性坐标。

x=1:6;
y=10.^(x)
figure
semilogy(x,y)

set(gca, 'fontsize', 12); % 更改当前坐标轴字体大小

当前路径下 (mat和m文件在一起): load *.mat;
在下一级路径下: load .\下一级路径的文件名*
.mat;
在上一级路径下: load ..*.mat;
在平行文件夹内: load ..\平行的文件夹*
.mat;

例如,读写当前目录下aaaa文件夹中的x.txt文件

saveas, 保存图片

fid = fopen('.\aaaa\x.txt', 'wt');
fprintf(fid, '%s\n', '1234');
fclose(fid);

name='wd';

a=1:8;

for i=1:3

b=a.^i;

plot(a,b)

h=gca;

saveas(h,['E:\牛刀小试\aa\aaaa',name,num2str(i,'%4.4d'),'.jpg'])

end

旋转电场 rotation electric field.

t=0:0.01:4*pi;
E0=1;
w=1;
phi=pi/2;
a=0.3;% a is the elliticity
ex=a/sqrt(1+a^2);
ey=1/sqrt(1+a^2);%长轴在y方向

Exx=ex*E0.*cos(w.*t);
Eyy=ey*E0.*cos(w.*t+phi);
theta1=pi/6;%rotation angle.
Ex=cos(theta1)*Exx-sin(theta1)*Eyy; % rotation matrix=[cos(theta1),-sin(theta1);sin(theta1),cos(theta1)];
Ey=sin(theta1)*Exx+cos(theta1)*Eyy; %从时间轴看过去,沿逆时针旋转
figure
plot3(t,Exx,Eyy,'r',t,Ex,Ey,'b')

二维绘图基本指令,plot

离散数据点
符号| 含义 | |符号 |含义 | |符号 |含义

---|--- |---|--- |--- |---|--- |---
d|菱形 diamond | |x|叉形 ||<|
o|空心圆圈 | |.|实心黑点 ||>|
s|方块符 square | |+| ||v|
p|五角星pentagram| |*| | |
h|六角形 hexgram | |^| | |

连续线型

符号含义符号含义
-细实线-.点划线
虚点线--虚划线
颜色
| | ||||||
---|---|---|---|---|---|---|---
b:blue|g:green|r:red|c:青色|y:yellow|k:黑色(black,b被蓝色占了)|w:white

三维绘图

[X,Y]meshgrid(x,y)
x为长度为n的行向量,y为长度为m行向量
则X为m行n列的矩阵,每一行为x。Y为m行n列的矩阵,每一列为y。例如:

x=1:3;
y=10:14;
[X,Y]=meshgrid(x,y)

结果为:
X =

1     2     3
1     2     3
1     2     3
1     2     3
1     2     3

x作为它的行,列数为length(y)

Y =

10    10    10
11    11    11
12    12    12
13    13    13
14    14    14

peaks函数,产生二维高斯分布。有三个极大值点,三个极小值点。

pcolor 二维
mesh 三维网线图
surf 三维曲面图

向量点乘,叉乘

cross,求向量的叉积(cross product)

dot,求向量点积(dot product)
matlab 中 $ f()$

画高斯函数

$$ f(x,\sigma,c)=e^{\frac{-(x-c)^2} {2\sigma^2}} $$

x=-10:0.01:10;
y=gaussmf(x,[2 0]) %y=gaussmf(x,[sig c])
figure
plot(x,y)

比较两个字符串,strcmp(str1,str2)
clear 在函数内部,只能清除函数里面,并且是clear之前的变量。对于主程序的变量,无能为力。

画动态图

1.画彗星轨迹图
comet(x,y,p),commet3(x,y,z)(3D).从初始点到终点的动态轨迹图,p*length(y)为尾巴长度,默认p=0.1例如

t=0:0.01:2*pi;
x=cos(2*t).*(cos(t).^2);
y=sin(2*t).*(sin(t).^2);
comet(x,y);

2.movie,画多个图,动态图片然后保存。

nFrames = 20;

% Preallocate movie structure.
mov(1:nFrames) = struct('cdata', [],...
'colormap', []);

% Create movie.
Z = peaks; surf(Z);
axis tight manual
set(gca,'nextplot','replacechildren');
for k = 1:nFrames
surf(sin(2*pi*k/20)*Z,Z)
mov(k) = getframe(gcf);
end

% Create AVI file.
movie2avi(mov, 'myPeaks.avi', 'compression', 'None');

符号计算

syms x a b %定义符号 x,a,b

f1=x*log(x);
s1=int(f1,x) % f(x)dx  indefinite integral
s2=int(f1,x,a,b) % 定积分,积分上下限为a,b
pretty(s2)   %把s2转化为易读形式。

对于复数矩阵A,max 函数取得是A中模最大的元素。

反向排序矩阵

a=0:10;
b=a(end:-1:1)

b = 10 9 8 7 6 5 4 3 2 1 0

对文件夹和文件的操作

创建文件夹,复制文件

mkdir('a/b');%在当前目录的a文件夹下,创建名为b的子文件夹
copyfile('source','destination')
copyfile('E:\a\','E:\b')%把a文件夹下的所有文件复制到b文件夹里
%copies the file or folder named source to the file or folder destination
%多个文件
[a,b]=copyfile('sf','df') ;%把sf文件下的a,b复制到df文件夹下。

读写文件

fid=fopen('a.txt','r')
%读取文件a.txt,读取正确,fid为正整数。fid=-1,读取失败。
frewind(fid)      %返回到文件的开头
fgets()  %从文件中读行,返回行结束符

eval 函数的使用

对文件重命名

eval(['!rename',',a.txt' ',b.txt']); %把a.txt重命名为b.txt

矩阵求和

A为二维矩阵m×n,b=sum(A,2) 对所有的行求和,b为m×1.例如:

计算程序所用时间

tic toc 组合

tic
程序
toc


clock 和estime()

t1=clock
程序
t2=clock
estime(t1,t2)  %调用windows的系统时钟来计算


cputime函数 根据cpu的主频来判断时间,与前两个不同

t1=cputime
函数
t2=cputime
t=t2-t1

cumsum()函数进行含变量上限的积分

$$A\left( t \right) =- \int_0^t {E\left( {t'} \right)dt'} $$

Ax = -cumsum(Ex).*dt;
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: