Matlab学习总结
MATLAB基本数据类型
双精度/单精度/整形
数据的范围
数据类型 | 数值范围 |
---|---|
int8 | -27,27-1 |
int16 | -2{15},2{15}-1 |
int32 | -2{31},2{31}-1 |
int64 | -2{63},2{63}-1 |
uint8 | 0,2^{8}-1 |
uint16 | 0,2^{16}-1 |
uint32 | 0,2^{32}-1 |
uint64 | 0,2^{64}-1 |
single | $$-3.4\times 10^{38}, 3.4\times 10^{38} $$ |
double | $$-1.79\times 10^{308}, 1.79\times 10^{308} $$ |
务必注意溢出的问题。
函数
- 类型检查
class
isa(x, ‘double’)
- 范围检查
intmax, intmin
realmax,realmin
intmax(‘uint32’)
- 类型转换
int8(x), uint32(x), double(x)
字符串
ASCII: AmericanStandard Code for Information.
MATLAB将字符串当作一个行向量,每个元素对应一个字符,其标识方法和数值向量相同。
若需要查询与字符串或者字符相关的指令,可以输入
help strfun
help strings
存储多个字符串
- 二元字符串序列:保证每个单词长度相同。
- char指令:departments = char('ee', 'cs', 'econ')
函数
- length:字符串长度
- ischar,class:判断字符串:
- strcmp,strcmpi,strncmp:比较异同
- strrep:字符串查找并替换:
- strtok:字符串分解
- strvcat:分解字符串重组
- 字符串数值转换:int2str, num2str, dec2hex, hex2num, hex2dec,bin2dec
- sprintf:输出
- fprintf('%s',char(ii))
-
abs\double:字符转ASCII值
-
char:ASCII转字符
-
str2num:字符串转数字
-
num2str:数字转字符串
-
[str1, str2]:字符串连接
-
upper:将string变为大写的
结构体
结构体是一种数据容器,可以包含不同的类型的元素。一个结构体对象就是1*1的结构体数组。大多数图像处理应用中,元素对元素的组织方式不是最佳的,经常需要访问元素的字迹时,可以选用结构体,根据
1:r.ssn =12345678,r.address.street = '742 Evergreen Terrace',
2:patient =struct(‘name’, {‘Tom’, ‘lili’, []}), ‘billing’, {11, 23, []})
函数
struct2cell:转换为胞体
isstruct:是否为结构阵列
isfield:是否含有一定键值
3元胞
定义:元胞可以把不同类型的数据归并到一个数组中,每一个元素叫做单元。
创建:1、使用赋值语句创建的两种创建方法;2、使用cell函数创建
- c(1, 1) ={‘Clayton’}
c{1, 1} = ‘Clayton’
- arrayName = cell(m,n)
- B = {'James Bond', [1 2;3 4;5 6]; pi, magic(5)}
访问:{}访问时,返回细胞单元的数据,如:B{1,2}。()访问时返回细胞数组的子数组,可能不返回实际内容,如B(1,2)。
删除:arrayName{x,y}=[] 或者B(1,:) = []
函数
cellplot:图形显示
celldisp:显示全部内容或者A{:}
iscell:判断是否为胞体
num2cell:数值阵列转换为胞体
mat2cell:数值阵列转换为胞体,可以处理比较复杂的转换
struct2cell :结构体转换为胞体
deal:结构体某一个键值转换为胞体
嵌套
结构体数组
也叫作元素对元素组织。这种方式访问子集比较容易。
x.a=zeros(...); #初始化
x.b=zeros(...);
x.c=zeros(...);
for j =1:daycount(num) #赋值
m(j).month = monthlist{1,num};
m(j).date = j;
end
嵌套单元整列
多重花括号是关键
简单例子:A(1,1)= {{‘第二层’,[1;2;3;4]; [-1,-1], {‘第三层’, 17}}}
function m = year2016(num)
% month,day is cell
daylist = {'Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat', 'Sun'};
monthlist = {'January', 'February','March', 'April','May','June',...
'July', 'August', 'September', 'October', 'November','December'};
daycount = [31,29,31,30,31,30,31,31,30,31,30,31];
cal = cell(1,12);
for i = 1:12
cal{1,i} = cell(1,daycount(i));
end
for i =1:12
for j = 1:daycount(i)
cal{1,i}{1,j}.month = monthlist{1,i};
cal{1,i}{1,j}.date = j;
daynumber = 0;
for k = 1:i-1
daynumber = daynumber + daycount(k);
end
daynumber = daynumber + j;
% first day in 2016 is Friday
daymark = rem((daynumber +3), 7) +1;
cal{1,i}{1,j}.day =daylist{1, daymark};
end
end
m = cal{1, num};
end
常量
persistent name;
if isempty(name)
%...
end
output = name;
符号变量
a = sym(‘a’);
syms a
符号常量
c = sym(‘3’);
符号表达式
syms x
f = 3*x + 6;
函数
- simplify(S):化简
- eval(S):符号转数值
- factor、expand、collect:符号表达式的因式分解、展开、合并同类项
- subs:符号函数值的求解
- limit:符号极限
- diff:符号微分
- int:符号积分
- symsum:符号级数求和
syms n %级数求和
f = 1/n^2;
s1 = symsum(f,n, 1, inf)
- taylor:泰勒级数
syms x
y = (1 + x +x^2)/(1 - x + x^2);
taylor(y, 6, 1)
- solve:符号代数方程和方程组
clear
syms x
solve(x + x*exp(x) - 10)
clear
eval(solve('x + x*exp(x) - 10'))
% 方程组
[x y] = solve('x + y - 98', 'x^(1/3) + y^(1/3) - 2', 'x, y')
- dsolve:符号常微分方程
dsolve('Dy -(x^2 + y2)/x2/2', 'x')
- subs:代入真实值
syms x
f = cos(x) + x;
subs(f, x, 1)
变量为空
如果"没赋值"表示变量不存在,那么可以用如下语句
if~exist('x','var')
x = 1;
end
如果"没赋值"表示变量为空(实际在workspace中存在),那么可以使用如下语句
if isempty('x')
x = 1;
end
空变量可以通过x = zeros(1,0)或者zeros(0,1)或者x= []实现
fix:判断是否整数:fix(x)~= x:
ismember:判断是否是成员。可用于矩阵、向量标量。
rem(a, b):求余数
prod(X):对X元素求积
换行继续写:…
辅助函数:who\whos\clear\save
save filename
save filename x y z
数据输出时用户可以用format命令设置或改变数据输出格式。format命令的格式为:
format 格式符
其中格式符决定数据的输出格式.
format rat:转换为分数
结构体
isstruct():是否是结构体
fieldname():返回所有成员名
isfield(a, x1):判断是否是结构体成员
rmfield()
getfield()
cell
cell:成员可以不同类型。
a = {1, ‘str’, [11 12 13 14]}
常用数学函数
函数 | 意义 | 函数 | 意义 | 函数 | 意义 |
---|---|---|---|---|---|
abs | 绝对值或复数的模 | ceil | 向正方向取整 | sign | 符号函数 |
angle | 相位角 | floor | 向负方向取整 | rem | 求余函数 |
sqrt | 平方根 | fix | 截尾取整 | exp | 指数函数 |
real | 实部 | round | 四舍五入取整 | log | 自然对数 |
imag | 虚部 | conj | 共轭复数 | log10 | 常用对数 |
sin | 正弦 | cos | 余弦 | tan | 正切 |
asin | 反正弦 | acos | 反余弦 | atan | 反正切 |
sinh | 双曲正弦 | cosh | 双曲余弦 | tanh | 双曲正切 |
asinh | 反双曲正弦 | acosh | 反双曲余弦 | atanh | 反双曲正切 |
bessel | 贝塞尔函数 | rat | 有理逼近 | ellipj | 雅可比椭圆函数 |
rem与mod函数的相同和区别:rem(x,y)和mod(x,y)都是取余数的函数,要求x,y必须为相同大小的实矩阵或为标量。rem的返回值与被除数符号相同,mod的返回值与除数符号相同。
内存变量
save 文件名 [变量名表][-ascii]
load 文件名 [变量名表] [-ascii]
其中,文件名可以带路径,但不需带扩展名.mat,命令隐含一定对.mat文件进行操作。变量名表中的变量个数不限,只要内存或文件中存在即可,变量名之间以空格分隔。当变量名表省略时,保存或装入全部变量。-ascii选项使文件以ASCII格式处理,省略该选项时文件将以二进制格式处理。
矩阵
;表示换行
特殊矩阵
zreos\ones\eye\randn\magic\Hilbert\Toeplitz
- 范得蒙矩阵A=vander(v)
范得蒙(Vandermonde)矩阵最后一列全为1,倒数第二列为一个指定的向量(基础向量),其他各列是其后列与倒数第二列对应元素的乘积(或基础向量的n-1次幂)。可以用一个指定向量生成一个范得蒙矩阵,函数vander(V)生成以向量V为基础向量的范得蒙矩阵。
- 伴随矩阵compan(p)
其中p是一个多项式的系数向量,高次幂系数排在前,低次幂排在后
- 帕斯卡矩阵pascal(n)
二次项(x+y)n展开后的系数随n的增大组成一个三角形表,称为杨辉三角形。由杨辉三角形表组成的矩阵称为帕斯卡(Pascal)矩阵。函数pascal(n)生成一个n阶帕斯卡矩阵。
- 聚合矩阵
矩阵聚合是通过连接一个或多个矩阵来形成一个新的矩阵。矩阵的行列数会自动增加,以容纳新增加的元素。C=[A B]水平。C=[A;B]竖直聚合。repmat函数可以利用已有矩阵的多个拷贝来创建大矩阵。repmat(A,v,h)
矩阵运算
find(A == 8); %返回8的序号数
sub2ind(size(A),m,n); %位置转序号
ind2sub(size(A),9);
repmat(A, m , n); %复制
unique(A); %去掉重复的内容
Jordan(A); %求解Jordan标准型
eig(A); %求解特征值
norm(A, n); %求解矩阵的n范数
diff(A, n); %求解n阶导数
fumn(A, @exp); %求解矩阵函数
expm(A); %求解expA
size(A); %返回矩阵每一维的长度(大小)。
length(A); %测矩阵的各维数的最大值(长度)。
ndims(A); %返回矩阵的维数。
numel(A); %返回矩阵的元素个数。
reshape (A,m,n); %重塑矩阵
rot90(A,k); %将矩阵A逆时针旋转90º的k倍,当k为1时可省略。
fliplr(A); %左右翻转函数
flipud(A); %上下翻转函数
flipdim(A,dim) %按维翻转函数
复数矩阵
C=[1 2;34]+1i*[5 6;7 8]
值1i中的1一般不能省略,因为尽管i变量通常表示虚单位,但是有可能被用户事先更改过,而1i是常数而不是变量,其值是固定的。
稀疏矩阵
大部分元素都是0,只存储非0元素的位置及其值。
函数
- sparse:转换成稀疏矩阵
- spdiags:对角元素构建稀疏矩阵
- spconvert:将一个$$m\times 3$$矩阵转换为稀疏矩阵
矩阵索引
“单下标”标识
采用矩阵元素的序号来引用矩阵元素。矩阵元素的序号就是相应元素在内存中的排列顺序。在MATLAB中,矩阵元素按列存储,先第一列,再第二列,依次类推。A(3)。
end-表示某一维的末尾元素下标。
命令 | 使 用 说 明 |
---|---|
A(r,c) | 由A的“r”指定行和“c”指定列的元素构成 |
A(r,:) | 由A的“r”指定行和“全部”列的元素构成 |
A(:,c) | 由A的“全部”行和“c”指定列的元素构成 |
A(:) | A的各列按自左到右的次序,首尾相接生成一维数组 |
A(s) | 生成“s指定的”一维数组。s可以是行数组或列数组。 |
A(r,c)=Sa | 以双下标方式对子数组赋值。表达式两边必须同维。 |
A(:)=D(:) | 全元素赋值。两数组总元素数相等即可。 |
A(s)=Sa | 以单下标方式对部分元素赋值。Sa和s元素总数须相同 |
矩阵的伪逆
如果矩阵A不是一个方阵,或者A是一个非满秩的方阵时,矩阵A没有逆矩阵,但可以找到一个与A的转置矩阵A‘同型的矩阵B,使得:A·B·A=A;B·A·B=B。此时称矩阵B为矩阵A的伪逆,也称为广义逆矩阵。在MATLAB中,求一个矩阵伪逆的函数是pinv(A)。
矩阵的迹
矩阵的迹等于矩阵的对角线元素之和,也等于矩阵的特征值之和。在MATLAB中,求矩阵的迹的函数是trace(A)。
向量运算
点积dot(a,b)a b必须同维
叉积cross(a,b)a b必须同维且有一维维数为3
混合积dot(a,cross(b,c))ab c必须同维且函数顺序不可颠倒
向量的长度sqrt(dot(a,a))
-
画图
基本绘图函数
平面绘图
x plot(x, y); %x:vector,y:matrix,多条曲线按行对应
%x:matrix,y:matrix,列对应多条
%可以加颜色和标识:k, *…
xlabel(‘’);
ylabel(‘’);
title(‘’);
text(pos_x,pos_y, ‘’)
legend(‘’, ‘’) %增加两个图例
axis off/on %坐标轴控制,需在plot指令之后呼叫才能有用
axis square hold on/off %图形保持
subplot(2, 2,1) %窗口划分
semilogx(x,sin(x)); % 使x轴為对数刻度,对其三角函数作图
plotyy(x, y1,x, y2); % 画出刻度不同的 y轴,分別是 y1, y2
plot(x, y,‘CLM‘) %C:曲线的颜色 (Colors)
%L:曲线的样式 (Line Styles)
%M:曲线标记(Markers)
plot(x, y,‘k:diamond’); %其中k代表黑色,:代表点%diamond则指定菱形為曲线的标记
axis([xmin,xmax, ymin, ymax])
set(gca, ‘ytick’,[-1 -0.3 0.1 1]); %在y轴加格线点
grid on; % 加上格线
set(gca,'ytick', [-1 -0.3 0.1 1]); %改变格线点
set(gca, ‘yticklabel’, {‘极小’,’临界值’,’崩溃值’,’极大’}); % 改变格线点的文字
%colordef:改变背景颜色先呼叫 colordef 指令,然后 plot 指令产生的图像才有效;
%用box on 画出外围的长方形gtext
%用鼠标决定文字的位置
(1)hold off 使当前轴及图形不在具备被刷新的性质。
(2)hold on 和hold off是相对使用的:
前者的意思是,你在当前图的轴(坐标系)中画了一幅图,再画另一幅图时,原来的图还在,与新图共存,都看得到;后者表达的是,你在当前图的轴(坐标系)中画了一幅图,此时,状态是hold off,则再画另一幅图时,原来的图就看不到了,在轴上绘制的是新图,原图被替换了。
图表指令
- 柱状图:bar,barh,bar3,bar3h
- 面积图:area
- 扇形图:pie,pie3
- 针头图: stem,stem3
- 阶梯图: stairs
- 实心图: fill,fill3
- 向量场图:quiver,quiver3
- 等高线图:contour,meshc,surfc,contour3,polar
-
立体绘图
mesh:可立体的网状图(Mesh Plots)
surf:立体的曲面图Surface Plots)
meshgrid 的作用是产生 x 及 y (均是向量) 为基准的格子点(GridPoints),其输出为 xx 及 yy(均为矩阵),分別代表格子点的 x 坐标及 y 坐标。
meshz 指令有将曲面加上「围裙」或「舞台」的效果
waterfall 指令可在 x 方向或 y 方向产生水流效果
meshc 可同时画出网状图形「等高线」
plot3 指令可画出三度空间中的曲线
在绘制网状图时,MATLAB会隐藏被遮盖的网线,若要使被遮盖的网线亦能呈现出來,可用 hidden off 指令
rotate3d on/off允许(on)或取消(off)以拖动鼠标来旋转三维轴。
colorbar:利用 colorbar 指令,可显示 MATLAB 如何以不同颜色来代表曲面的高度
底层绘图函数
h=line(‘pro1’,val1,’pro2’,val2, ‘lineWidth’, 1,’lineStyle’, ‘:’, ‘Color’, ‘r’, ‘MarkerSize’, 1 )
htext = text(0,0, ‘Sin(x)’);
set(htext, ht,‘FontSize’, 20,String, ‘Cos(x)’);
hf=figure;
ha=axes(‘Parent’, hf, ‘Units’, ‘pixels’, ‘position’, [10, 10, 10, 10])
循环
e1:e2:e4初始:步长:终止
linspace不指定元素之间的增量,而是指定等间隔分布的元素个数,logspace按对数值等间隔分布。
logspace(a,b,n)
其中a和b是生成向量的第一个和最后一个元素,n是元素总数。
输入输出
nargin:输入个数
nargout:输出个数
varargin:输入参数,默认元胞类型
varargout:输出参数
error(nargchk(2,4, nargin)):检测输入个数是不是在2-4,否则产生error
isscalar(m):m是否是一个标量
notebook in matlab
从MATLAB中启动Notebook:notebook 或者notebook 文件名
定义输入单元,可以使用Notebook菜单,或者组合键“Alt+D”;
选择菜单中的“Evaluate Cell”或者组合键“Ctrl+Enter”执行单元,直接显示输出。
定义自动初始化单元:选择菜单中的“DefineAutoInit Cell”
单元组定义:一般程序是按行单独运行的,for循环就会有问题。所以有这个。
符号计算
多项式化简:
syms x;
simplify(sin(x)^2+ cos(x)^2)
ans = 1
simplify((x^2 +5*x + 6)/(x + 2))
ans = x + 3
多项式展开
syms s
ps=((s^2+1))^3*(s+5)^2*(s^4+4*s^2+7)
ps1=expand(ps)
获取多项式系数
syms x
f=3*x^5 + 2*x^2;
A=sym2poly(f)
求方程零点
syms t
ft = exp(t)- t^2 -6;
s = slove(ft, t);
文件输入和输出
CMD命令
- ls:显示当前目录文件
- ls(‘wen’):显示文件夹内部文件
- cd(dictionary):切换到指定目录
- pwd:返回当前目录
- cd(‘..’):后退
- cd(‘name’):切换到子文件夹
Excel函数
xlsread:
[num,txt,raw]= xlsread('Nashville_climate.xlsx');
num =xlsread('Nashville_climate.xlsx', 1, ‘D15:E17’);
xlswrite
text函数
打开:fid =fopen(filename, permission)
关闭:fclose(fid)
function view_text_file(filename)
fid = fopen(filename,'rt');
if fid < 0
error('error opening file %s\n\n', filename);
end
% Read file as a set of strings, one string per line:
oneline = fgets(fid);
while ischar(oneline)
fprintf('%s',oneline) % display one line
oneline = fgets(fid);
end
fprintf('\n');
fclose(fid);
end
操作 | |
---|---|
‘rt’ | 读操作 |
'wt' | 写操作 |
'at' | 打开或者创建新文件,并在文件的最后添加数据 |
'r+t' | 打开文本文件用于读和写 |
'w+t' | 打开或者创建文本文件用于读和写,丢弃原有的内容 |
'a+t' | 打开或者创建文本文件用于读和写,在文件的末尾增加数据 |
二进制函数
写:
function write_array_bin(A,filename)
fid = fopen(filename,'w+');
if fid < 0
error('error opening file %s\n‘, filename);
end
fwrite(fid,A,'double');
fclose(fid);
end
读:
function A = read_bin_file(filename,data_type)
fid =fopen(filename,'r');
if fid < 0
error('erroropening file %s\n',filename);
end
A =fread(fid,inf,data_type);
fclose(fid);
end
信号
高斯白噪声
- wgn:产生高斯白噪声
- y = wgn(m,n,p) 产生一个m行n列的高斯白噪声的矩阵,p以dBW为单位指定输出噪声的强度。
- y =wgn(m,n,p,imp) 以欧姆(Ohm)为单位指定负载阻抗。
- y =wgn(m,n,p,imp,state) 重置RANDN的状态。
在数值变量后还可附加一些标志性参数:
- y = wgn(…,POWERTYPE) 指定p的单位。POWERTYPE可以是'dBW','dBm'或'linear'。线性强度(linear power)以瓦特(Watt)为单位。
-
y = wgn(…,OUTPUTTYPE)指定输出类型。OUTPUTTYPE可以是'real'或'complex'。
-
awgn:在某一信号中加入高斯白噪声
- y = awgn(x,SNR) 在信号x中加入高斯白噪声。信噪比SNR以dB为单位。x的强度假定为0dBW。
- y =awgn(x,SNR,SIGPOWER) 如果SIGPOWER是数值,则其代表以dBW为单位的信号强度;如果SIGPOWER为'measured',则函数将在加入噪声之前测定信号强度。
- y =awgn(x,SNR,SIGPOWER,STATE) 重置RANDN的状态。
y = awgn(…,POWERTYPE) 指定SNR和SIGPOWER的单位。POWERTYPE可以是'dB'或'linear'。如果POWERTYPE是'dB',那么SNR以dB为单位,而SIGPOWER以dBW为单位。如果POWERTYPE是'linear',那么SNR作为比值来度量,而SIGPOWER以瓦特为单位。
- 分贝(decibel,dB):分贝(dB)是表示相对功率或幅度电平的标准单位,换句话说,就是我们用来表示两个能量之间的差别的一种表示单位,它不是一个绝对单位。例如,电子系统中将电压、电流、功率等物理量的强弱通称为电平,电平的单位通常就以分贝表示,即事先取一个电压或电流作为参考值(0dB),用待表示的量与参考值之比取对数,再乘以20作为电平的分贝数(功率的电平值改乘10)。
- 分贝瓦(dBW, dBWatt):指以1W的输出功率为基准时,用分贝来测量的功率放大器的功率值。
- dBm(dB-milliWatt):即与1milliWatt(毫瓦)作比较得出的数字。
0 dBm = 1 mW
10 dBm = 10 mW
20 dBm = 100 mW
也可直接用randn函数产生高斯分布序列,例如:
y=randn(1,2500);
y=y/std(y);
y=y-mean(y);
a=0.0128;
b=sqrt(0.9596);
y=a+b*y;
均匀分布白噪声
% L 为信号长度
% mean为均值
% var为方差
% rand函数产生的是幅值为【0,1】均匀分布的白噪声,均值为1/2,方差为1/12
% 使用下面的公式可以产生指定均值和方差的均匀分布的白噪声
% 在matlab中,可以使用函数:mean(white_noise)来检验其均值
% 使用函数:var(white_noise)来检验其方差
white_noise= (rand(1,L) - 0.5 ) * sqrt( 12 * var )+ mean;
指数分布白噪声:exprnd(mu, m, n)
逆z变换
syms z
f = 2*z/(z-2)^2
iztrans(f)
内插法
interp1原理是运用夺下你给是来进行内插运算。
method说明:
- nearest:最近点內插法
- linear:线性內插法
- spline:片段式的三次 Spline 內插法
- pchip:保持形状的片段式三次內插,相当于不会高于最高点,不会产生过拟合
- cubic:和pchip 一样
interpft,可进行基于FFT(Fast Fourier Transform,快速傅里叶变换)的內插法
interp2 ,指令可进行二维內插
griddata ,分散无规律点的内插
interp3:可进行 3 维內插
曲线拟合
polyfit:多项式拟合
编程效率
循环的执行效率低下,因为这是一个解释型语言。
提高效率的办法:矩阵或者向量操作,避免2重以上的循环;预分配。
计时方法
tic\toc用于计算程序运行时间。
个别函数的计时方法
profile on -detail mmex % 启动定时器
% ```
%functions here
% ```
profile off % 停止计时器
profile report % 计时报告
�