基本命令
clear all %清除Workspace中的所有变量
clc %清除Command Window中的所有命令
%和%%是注释
whos%显示当前内存中的变量信息
语句最后带分号,表示执行过程不显示
Inf为无穷大
-Inf为负无穷大
global定义全局变量
如果想一次输入多条命令,可以用eval函数。
eval('grid on;set(gca,"box","on")');
注释方法
常用有两种,一种是单行注释,一种是多行注释。
单行注释
%第1行代码
%第2行代码
%第3行代码
多行注释
%{
第1行代码
第2行代码
第3行代码
%}
基础函数
abs()%取绝对值或复数的模
char(65)%将ASCII码数值变成字符
num2str(65)%将里面的内容变成字符串
length()%对象的长度,不把字符串'/0'的长度计算进去
path()%将路径添加到搜索路径表的最后
sqrt()%开方
complex()%创建复数,z是以x为实部、y为虚部的复数,y可以省略默认为0
exp()%指数运算,e的多少次方
log()%以e为底的对数
log10()%以10为底的对数
log2()%以2为底的对数
uint16(num)%改变数据类型
logical(num)%布尔类型,0为FLASE,非0为true
矩阵
创建
A=1:2:10%创建向量初始值1步长2最大值10,向量也是一种矩阵
B=-2.5:2.5%步长可省略,默认为1
A=linspace(1,10)%1~10的100个等间距元素
B=linspace(1,5,6)%1~5的6个等间距元素
C=logspace(0,4)%1(10^0)~10000(10^4)的50个对数等分元素
D=logspace(0,4,5)%1~10000的5个对数等分元素
A[1 2 3;4 5 2;3 2 7]%创建矩阵
A'%矩阵转置
A(:)%展开矩阵成一列
inv(A)%方阵求逆,矩阵和自己的逆矩阵相乘等于单位矩阵
E=zeros(10,5,3)%创建10行5列3层的三维矩阵
E(:,:,1)=rand(10,5)%创建一个10行5列的矩阵,其中的元素是从0到1之间的随机数
,给到E矩阵的第1层
E(:,:,2)=randi(5,10,5)%创建一个10行5列的矩阵,其中的元素是最大为5的正整数的随机数,给到E矩阵的第2层
E(:,:,2)=randi([2,5],10,5)%创建一个10行5列的矩阵,其中的元素是最大为5最小为1的整数的随机数,给到E矩阵的第2层
E(:,:,3)=randn(10,5)%创建一个10行5列的矩阵,其中的元素是标准正态分布中生成的随机数,给到E矩阵的第3层
ones(2,4)%创建一个2行4列元素全是1的矩阵
zero(2,4)%创建一个2行4列元素全是0的矩阵
eye(3)%创建一个3x3的单位矩阵,即主对角线上的元素为1,其它位置的元素为0
magic(5)%生成一个5x5的幻方/魔方矩阵。幻方矩阵是指在每行、每列以及主对角线的元素和均相等的方阵
repmat(B,3,2)%创建一个新的矩阵,将矩阵B纵向复制3次,横向复制2次
基本运算
A+B%加
A-B%减
A*B%乘
A.*B%点乘
A/B%除
A./B%点除
[A B……]%横向合并矩阵
[A;B……]%纵向合并矩阵
基础函数
cat(2,A,B……)%横向合并矩阵
cat(1,A,B……)%纵向合并矩阵
horzcat(A,B……)%横向合并矩阵
vertcat(A,B……)%纵向合并矩阵
repmat(A,M,N)%得到MxN个A的大矩阵
blkdiag(A,B……)%到以矩AB··等为对角块的矩阵
length(A)%最长方向的长度
nndims(A)%矩阵A的维数
numel(A)%矩阵的元素个数
注意:MATLAB的索引值不从0开始,从1开始!!!!!
A(2,3)%2行3列元素
A(3, :)%3行一整行,:代表全部
A(:, 4)%4列全部
A(3,:)=[]%删除矩阵的第3行
[m,n]=find(A > 20)%找到矩阵A中大于20的元素的行列索引,返回行索引和列索引的向量m和n
C=A(1:2:5,2:2:5)%提取第1、3、5行中的第2、4个元素
E=A([1,4],[2,2,5])%提取第1、4行中的第2、2、5个元素
A(21)%第21个元素,按照列的方向来数
结构体
MATLAB的结构体很特别:
1、不需要定义,直接就能赋值
2、赋值的时候就会直接作出一个结构体数组
3、可以合在元胞数组里面
Human.Score = 99%创建结构体并赋值
Human(2).Name='Kitta';%把长度1结构体数组扩展成长度2的结构体数组
Human(2).Score%访问结构体数组的某个元素的某个属性
Human(2).Salary=[21000 180];
Human(2).Salary(2)%访问结构体数组的某个元素的某个属性的元素值
%struct函数创建结构体/结构体数组
Personel(3)=struct('Name','John','Score',85.5,'Salary',[4500])
%Personel(1)和 Personel(2)的属性值都是空矩阵
repmat(struct('Name','John','Score',85.5,'Salary',[4500]),1,3)
%数组的所有元素都具有和输入一样的值
struct('Name',{'Clayton','Dana','John'},'Score',{98.5,100,85.5},'Salary',{[4500],[],[]})
%结构数组的属性值由元胞数组指定
Salary=[Human.Salary]%使用矩阵合并符“[]”合并结果
Salary={Human.Salary}%把结果合并在一个元胞数组里
元胞
%左标志法创建元胞
c{1,1}='Butterfly'
c{1,2}=@cos%@代表函数句柄
c{2,1}=eye(1,2)
c{2,2}=false
%右标志法创建元胞
c(1,1)={'Butterfly'}
c(1,2)={@cos}
%也可以这样创建
c={'Butterfly',@cos;eye(1,2),false};%创建2 * 2元胞数组
A=cell(3,4)%创建一个大小为3x4的空元胞数组
A{2}=eye(3)%创建一个3x3的单位矩阵,放在元胞索引为2的位置
B=A{5}%取出元胞位置为5的对象给到B
A(1,:)%取出元胞数组第一行全部元素
流程控制
if ...
elseif ...
else ...
end
for i=1:3%每次会自增1个步长,步长默认1
end
while
...
end
switch
case ...
otherwise ...
end
绘制二维图像
基础例子
x = 0:0.01:2*pi;%创建向量x
y = sin(x);%创建一一对应的向量y
figure%建立一个幕布
plot(x, y)%画出xy线条
title('y = sin(x)')%增加标题
xlabel('x')% x轴标签
ylabel('sin(x)') % y轴标签
xlim([0 2*pi])%x轴坐标限制
legend('y = sin(x)') % 添加图例
进阶例子
x = 0:0.01:20;
y1 = 200 * exp(-0.05 * x) .* sin(x);
y2 = 0.8 * exp(-0.5 * x) .* sin(10 * x);
figure
[AX,H1,H2] = plotyy(x, y1, x, y2,'plot');
%创建一个具有多个y轴的图
%返回三个句柄:图形对象、第一个数据集的线条对象、第二个数据集的线条对象
set(get(AX(1),'ylabel'),'String','Slow Decay')
%get(AX(1),'ylabel')用于获取第一个y轴的句柄
%然后set函数用于设置该句柄所代表的对象的属性,设置第一个y轴的标签为"Slow Decay"
set(get(AX(2),'ylabel'),'String','Fast Decay')
xlabel('Time (\mu sec)')
title('Multiple Decay Rates')
set(H1,'LineStyle','--')
set(H2,'LineStyle',':')
绘制三维图像
t = 0:pi/50:10*pi;
plot3(sin(t),cos(t),t)
xlabel('sin(t)')
ylabel('cos(t)')
zlabel('t')
grid on%打开网格
axis square%将绘图区域设置为一个正方形
图形窗口分割
x=linspace(0,2*pi,60);%在区间[0,2π]中生成包含60个等间距点的向量
subplot(2,2,1)%设置当前图形为一个2x2的网格,并将绘图焦点设置在第1个子图上
plot(x,sin(x)-1);
title('sin(x)-1');
axis([0,2*pi,-2,0]);%axis设置x和y轴的可视范围,x 轴0到2π,y轴-2 到0
subplot(2,1,2)
plot(x,cos(x)+1);
title('cos(x)+1');
axis([0,2*pi,0,2]);
subplot(4,4,3)
plot(x, tan(x));
title('tan(x)');
axis([0,2*pi,-40,40]);
subplot(4,4,8)%这回不按照顺序排下去了,就会跳开几个位置
plot(x,cot(x));
title('cot(x)');
axis([0,2*pi,-35,35]);
hold on/off
hold on 命令用于将绘图模式设置为保持当前图形,并在其上绘制新的图形,而不清除现有的图形。这样,你可以在同一张图上绘制多个曲线或图形,而不会清除先前的内容。
hold off 命令用于关闭绘图保持功能,这将导致在下一次绘图时清除现有的图形。当不再需要在同一张图上绘制新的内容时,使用 hold off 可以恢复正常的绘图模式。
因为一般是默认hold on的,所以直接执行hold on不会有什么明显的现象。
x = 0:0.1:2*pi;
y1 = sin(x);
y2 = cos(x);
plot(x, y1)
hold off %hold on
plot(x, y2)
xlabel('x')
ylabel('y')
title('Sin(x) and Cos(x)')
legend('sin(x)', 'cos(x)')
图形的保存与导出
(1) 编辑 -> 复制图形
(2) 文件 -> 另存为
(3) 查看 -> 属性编辑器
(4) 调整图片质量:文件 -> 导出设置 -> 大小 设定高度宽度,这时候导出的图形会更加清晰
调用函数
新建一个函数文件funsin.m和一个脚本文件callsin.m,用脚本文件来调用函数文件。
函数文件内容
function f = funsin(var) %定义funsin函数,入参var,输出是变量f。函数的名称必须与文件名相同,并且函数定义必须位于文件的开头
f = sin(var) %将数值给到输出变量f
end
脚本文件内容
type funsin.m%/在命令窗口中显示函数文件的内容
x=[0 pi/2 pi 3*pi/2 2*pi]
sinx=funsin(x)%调用函数
补充内容
搜索路径
当MATLAB 对函数或文件等进行搜索时,都是在其搜索路径下进行的。如果调用的函数在搜索路径之外,那么 MATLAB 会认为该函数不存在。
打印函数
disp()%打印出来
echo on%显示其后所有执行的命令文件的指令
echo off%不显示其后所有执行的命令文件的指令
echo filename on%使filename指定的M文件的执行命令显示出来
echo filename off%使filename指定的M文件的执行命令不显示
echo on all%显示其后的所有M文件的执行指令
echo off all%不显示其后的所有M文件的执行指令
代码调试
函数句柄
可以间接调用函数
fh=@sin%创建函数句柄
fh(e)%计算sin(e)
匿名函数名称=@(参数列表)匿名函数主体定义%匿名函数创建格式,参数列表以逗号分隔
sqr=@(n)n.^2;%创建句柄
sqrx=sqr(3)
myfun=@(x,y)(x^2+y^2+x*y)%多个输入
x=2; y=8
z=myfun(x,y)