[关闭]
@hainingwyx 2017-06-01T09:33:43.000000Z 字数 12214 阅读 3297

MATLAB学习总结

matlab


写在之前

本文是学习Matlab所遇到的各个知识点,因为个人原因,比较偏向计算和信号方向。本文会持续更新。如需转载,请注明出处。如有问题,烦请指正。

MATLAB基本数据类型

双精度/单精度/整形

数据的范围

数据类型 数值范围
int8
int16
int32
int64
uint8
uint16
uint32
uint64
single
double

务必注意溢出的问题。

函数

class

isa(x, 'double')

intmax, intmin

realmax,realmin

intmax('uint32')

int8(x), uint32(x), double(x)

字符串

ASCII: AmericanStandard Code for Information.

MATLAB将字符串当作一个行向量,每个元素对应一个字符,其标识方法和数值向量相同。

若需要查询与字符串或者字符相关的指令,可以输入

  1. help strfun
  2. help strings

存储多个字符串

函数

结构体

结构体是一种数据容器,可以包含不同的类型的元素。大多数图像处理应用中,元素对元素的组织方式不是最佳的,经常需要访问元素的域时,可以选用结构体。

函数
struct2cell:转换为胞体
isfield:是否含有一定键值
isstruct():是否是结构体
fieldname():返回所有成员名
rmfield()
getfield()
示例程序

  1. r.ssn =12345678
  2. r.address.street = '742 Evergreen Terrace'
  3. field = 'f';
  4. value = {'some text';
  5. [10, 20, 30];
  6. magic(5)}
  7. s = struct(field,value)
  8. # Multiple Fields
  9. field1 = 'f1'; value1 = zeros(1,10);
  10. field2 = 'f2'; value2 = {'a', 'b'};
  11. field3 = 'f3'; value3 = {pi, pi.^2};
  12. field4 = 'f4'; value4 = {'fourth'};
  13. s = struct(field1,value1,field2,value2,field3,value3,field4,value4)
  14. %The cell arrays for value2 and value3 are 1-by-2, so s is also 1-by-2
  15. s(1)
  16. s(2)
  17. % with empty field
  18. s = struct('f1','a','f2',[])
  19. % contain cell Arrays
  20. field = 'mycell';
  21. value = {{'a','b','c'}};
  22. s = struct(field,value)
  23. % empty structure
  24. s = struct('a',{},'b',{},'c',{})
  25. s(1).a = 'a' %asign a value
  26. %nested structure
  27. a.b = struct('c',{},'d',{})
  28. fieldnames(a.b)

结构体数组

也叫作元素对元素组织。这种方式访问子集比较容易。

  1. x.a=zeros(...); #初始化
  2. x.b=zeros(...);
  3. x.c=zeros(...);
  4. for j =1:daycount(num) #赋值
  5. m(j).month = monthlist{1,num};
  6. m(j).date = j;
  7. end

元胞

定义:元胞可以把不同类型的数据归并到一个数组中,每一个元素叫做单元。
函数
cellplot:图形显示
celldisp:显示全部内容或者A{:}
iscell:判断是否为胞体
num2cell:数值阵列转换为胞体
mat2cell:数值阵列转换为胞体,可以处理比较复杂的转换
struct2cell :结构体转换为胞体
deal:结构体某一个键值转换为胞体

  1. % 创建:使用赋值语句创建
  2. c(1, 1) ={'Clayton'}
  3. c{1, 1} = 'Clayton'
  4. a = {1, 'str',[11 12 13 14]}
  5. % 使用cell函数创建
  6. arrayName = cell(m,n)
  7. C = cell(3) % square cell array
  8. B = {'James Bond', [1 2;3 4;5 6]; pi, magic(5)}
  9. % {}访问时,返回细胞单元的数据,如:B{1,2}。()访问时返回细胞数组的子数组,可能不返回实际内容,如B(1,2)。
  10. b(1, 1) ={'Clayton'}
  11. b{1, 1} = 'Clayton'
  12. % 两种删除
  13. arrayName{x,y}=[]
  14. B(1,:) = []

嵌套

嵌套单元整列

多重花括号是关键

简单例子:A(1,1)= {{'第二层',[1;2;3;4]; [-1,-1], {'第三层', 17}}}

  1. function m = year2016(num)
  2. % month,day is cell
  3. daylist = {'Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat', 'Sun'};
  4. monthlist = {'January', 'February','March', 'April','May','June',...
  5. 'July', 'August', 'September', 'October', 'November','December'};
  6. daycount = [31,29,31,30,31,30,31,31,30,31,30,31];
  7. cal = cell(1,12);
  8. for i = 1:12
  9. cal{1,i} = cell(1,daycount(i));
  10. end
  11. for i =1:12
  12. for j = 1:daycount(i)
  13. cal{1,i}{1,j}.month = monthlist{1,i};
  14. cal{1,i}{1,j}.date = j;
  15. daynumber = 0;
  16. for k = 1:i-1
  17. daynumber = daynumber + daycount(k);
  18. end
  19. daynumber = daynumber + j;
  20. % first day in 2016 is Friday
  21. daymark = rem((daynumber +3), 7) +1;
  22. cal{1,i}{1,j}.day =daylist{1, daymark};
  23. end
  24. end
  25. m = cal{1, num};
  26. end

常量

  1. persistent name;
  2. if isempty(name)
  3. %...
  4. end
  5. output = name;

符号变量

  1. a = sym('a');
  2. syms a

符号常量

  1. c = sym('3');

符号表达式

  1. syms x
  2. f = 3*x + 6;

函数

  1. syms n %级数求和
  2. f = 1/n^2;
  3. s1 = symsum(f,n, 1, inf)
  1. syms x
  2. y = (1 + x +x^2)/(1 - x + x^2);
  3. taylor(y, 6, 1)
  1. clear
  2. syms x
  3. solve(x + x*exp(x) - 10)
  4. clear
  5. eval(solve('x + x*exp(x) - 10'))
  6. % 方程组
  7. [x y] = solve('x + y - 98', 'x^(1/3) + y^(1/3) - 2', 'x, y')
  1. dsolve('Dy -(x^2 + y2)/x2/2', 'x')
  1. syms x
  2. f = cos(x) + x;
  3. subs(f, x, 1)

变量为空

如果"没赋值"表示变量不存在,那么可以用如下语句

  1. if~exist('x','var')
  2.   x = 1;
  3. end

如果"没赋值"表示变量为空(实际在workspace中存在),那么可以使用如下语句

  1. if isempty('x')
  2. x = 1;
  3. end

空变量可以通过x = zeros(1,0)或者zeros(0,1)或者x= []实现
fix:判断是否整数:fix(x)~= x:
ismember:判断是否是成员。可用于矩阵、向量标量。
rem(a, b):求余数
prod(X):对X元素求积
换行继续写:…
辅助函数who\whos\clear\save

  1. save filename
  2. save filename x y z

数据输出时用户可以用format命令设置或改变数据输出格式。format命令的格式为:
format  格式符
其中格式符决定数据的输出格式.
format rat:转换为分数

常用数学函数

函数 意义 函数 意义 函数 意义
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 雅可比椭圆函数

remmod函数的相同和区别:rem(x,y)mod(x,y)都是取余数的函数,要求x,y必须为相同大小的实矩阵或为标量。rem的返回值与被除数符号相同,mod的返回值与除数符号相同。
randperm(n):返回1-n个数值随机排列的行向量
randperm(n, k):返回k个数值随机排列的行向量
b = nchoosek(n,k):二项式系数
C = nchoosek(v,k):返回所有V向量中选取k个值的所有排列的向量
X = randi(imax):产生伪随机数,这里是可以重复的。

内存变量

save 文件名 [变量名表][-ascii]

load  文件名 [变量名表]  [-ascii]

其中,文件名可以带路径,但不需带扩展名.mat,命令隐含一定对.mat文件进行操作。变量名表中的变量个数不限,只要内存或文件中存在即可,变量名之间以空格分隔。当变量名表省略时,保存或装入全部变量。-ascii选项使文件以ASCII格式处理,省略该选项时文件将以二进制格式处理。

矩阵

;表示换行

特殊矩阵

zreos\ones\eye\randn\magic\Hilbert\Toeplitz

范得蒙(Vandermonde)矩阵最后一列全为1,倒数第二列为一个指定的向量(基础向量),其他各列是其后列与倒数第二列对应元素的乘积(或基础向量的n-1次幂)。可以用一个指定向量生成一个范得蒙矩阵,函数vander(V)生成以向量V为基础向量的范得蒙矩阵。

其中p是一个多项式的系数向量,高次幂系数排在前,低次幂排在后

二次项(x+y)n展开后的系数随n的增大组成一个三角形表,称为杨辉三角形。由杨辉三角形表组成的矩阵称为帕斯卡(Pascal)矩阵。函数pascal(n)生成一个n阶帕斯卡矩阵。

矩阵聚合是通过连接一个或多个矩阵来形成一个新的矩阵。矩阵的行列数会自动增加,以容纳新增加的元素。C=[A B]水平。C=[A;B]竖直聚合。repmat函数可以利用已有矩阵的多个拷贝来创建大矩阵。repmat(A,v,h)

 矩阵运算

  1. find(A == 8); %返回8的序号数
  2. sub2ind(size(A),m,n); %位置转序号
  3. ind2sub(size(A),9);
  4. repmat(A, m , n); %复制
  5. unique(A); %去掉重复的内容
  6. Jordan(A); %求解Jordan标准型
  7. eig(A); %求解特征值
  8. norm(A, n); %求解矩阵的n范数
  9. diff(A, n); %求解n阶导数
  10. fumn(A, @exp); %求解矩阵函数
  11. expm(A); %求解expA 
  12. size(A); %返回矩阵每一维的长度(大小)。
  13. length(A); %测矩阵的各维数的最大值(长度)。
  14. ndims(A); %返回矩阵的维数。
  15. numel(A); %返回矩阵的元素个数。 
  16. reshape (A,m,n); %重塑矩阵
  17. rot90(A,k); %将矩阵A逆时针旋转90º的k倍,当k1时可省略。
  18. fliplr(A); %左右翻转函数
  19. flipud(A); %上下翻转函数
  20. flipdim(A,dim) %按维翻转函数

复数矩阵

C=[1 2;34]+1i*[5 6;7 8]

值1i中的1一般不能省略,因为尽管i变量通常表示虚单位,但是有可能被用户事先更改过,而1i是常数而不是变量,其值是固定的。

稀疏矩阵

大部分元素都是0,只存储非0元素的位置及其值。

函数

矩阵索引

“单下标”标识

采用矩阵元素的序号来引用矩阵元素。矩阵元素的序号就是相应元素在内存中的排列顺序。在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))
C = bsxfun(fun,A,B):一般用于需要将某个变量扩展之后再与另一个变量进行运算的场合,fun是一个二元运算的函数,A,B是两个输入的变量

矩阵函数

  1. B = repmat(A, m, n); %矩阵复制
  2. n = nnz(X); %返回矩阵中非0元素的个数
  3. A = eye(10000);
  4. S = sparse(A); % S存储格式是系数矩阵,省内存
  5. B = full(S); % 还原存储格式
  6. fun = @(A,B) A.*sin(B);%自定义函数
  7. A = 1:7;
  8. B = pi*[0 1/4 1/3 1/2 2/3 3/4 1].';
  9. C = bsxfun(fun,A,B)%对A分别做B中元素的fun运算

画图

基本绘图函数

平面绘图

  1. plot(x, y); %x:vector,y:matrix,多条曲线按行对应  
  2. %x:matrix,y:matrix,列对应多条  
  3. %可以加颜色和标识:k, *…
  4. xlabel('');
  5. ylabel('');
  6. title('');
  7. text(pos_x,pos_y, '')
  8. legend('', '') %增加两个图例
  9. axis off/on %坐标轴控制,需在plot指令之后呼叫才能有用
  10. axis square hold on/off %图形保持
  11. subplot(2, 2,1) %窗口划分
  12. semilogx(x,sin(x));    % 使x轴為对数刻度,对其三角函数作图
  13. plotyy(x, y1,x, y2);   % 画出刻度不同的 y轴,分別是 y1, y2
  14. plot(x, y,'CLM') %C:曲线的颜色 (Colors)
  15. %L:曲线的样式 (Line Styles)
  16. %M:曲线标记(Markers)
  17. plot(x, y,'k:diamond'); %其中k代表黑色,:代表点%diamond则指定菱形為曲线的标记
  18. axis([xmin,xmax, ymin, ymax])
  19. set(gca, 'ytick',[-1 -0.3 0.1 1]);         %在y轴加格线点
  20. grid on                                  % 加上格线
  21. set(gca,'ytick', [-1 -0.3 0.1 1]);           %改变格线点
  22. set(gca, 'yticklabel', {'极小','临界值','崩溃值','极大'}); % 改变格线点的文字
  23. %colordef:改变背景颜色先呼叫 colordef 指令,然后 plot 指令产生的图像才有效;
  24. %用box on 画出外围的长方形gtext
  25. %用鼠标决定文字的位置

(1)hold off 使当前轴及图形不在具备被刷新的性质。
(2)hold on 和hold off是相对使用的:
前者的意思是,你在当前图的轴(坐标系)中画了一幅图,再画另一幅图时,原来的图还在,与新图共存,都看得到;后者表达的是,你在当前图的轴(坐标系)中画了一幅图,此时,状态是hold off,则再画另一幅图时,原来的图就看不到了,在轴上绘制的是新图,原图被替换了。

图表指令

立体绘图

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 如何以不同颜色来代表曲面的高度

底层绘图函数

  1. h=line('pro1',val1,'pro2',val2, 'lineWidth', 1,'lineStyle', ':', 'Color', 'r', 'MarkerSize', 1 )
  2. htext = text(0,0, 'Sin(x)');
  3. set(htext, ht,'FontSize', 20,String, 'Cos(x)');
  4. hf=figure;
  5. ha=axes('Parent', hf, 'Units', 'pixels', 'position', [10, 10, 10, 10])

循环

 e1:e2:e4初始:步长:终止

linspace不指定元素之间的增量,而是指定等间隔分布的元素个数,logspace按对数值等间隔分布。

linspace(a,b,n)

logspace(a,b,n)

其中a和b是生成向量的第一个和最后一个元素,n是元素总数。

输入输出

nargin:输入个数
nargout:输出个数
varargin:输入参数,默认元胞类型
varargout:输出参数
error(nargchk(2,4, nargin)):检测输入个数是不是在2-4,否则产生error
isscalar(m):m是否是一个标量

  1. % Set and parse parameters in a function
  2. if (~exist('opts','var'))
  3. opts = [];
  4. end
  5. p = 1000;
  6. if isfield(opts,'p')
  7. p = opts.p;
  8. end

notebook in matlab

从MATLAB中启动Notebook:notebook 或者notebook 文件名

定义输入单元,可以使用Notebook菜单,或者组合键“Alt+D”;

选择菜单中的“Evaluate Cell”或者组合键“Ctrl+Enter”执行单元,直接显示输出。

定义自动初始化单元:选择菜单中的“DefineAutoInit Cell”

单元组定义:一般程序是按行单独运行的,for循环就会有问题。所以有这个。

符号计算

多项式化简:

  1. syms x;
  2. simplify(sin(x)^2+ cos(x)^2)
  3. ans = 1
  4. simplify((x^2 +5*x + 6)/(x + 2))
  5. ans = x + 3

多项式展开

  1. syms s
  2. ps=((s^2+1))^3*(s+5)^2*(s^4+4*s^2+7)
  3. ps1=expand(ps)

获取多项式系数

  1. syms x
  2. f=3*x^5 + 2*x^2;
  3. A=sym2poly(f)

求方程零点

  1. syms t
  2. ft = exp(t)- t^2 -6;
  3. s = slove(ft, t);

文件输入和输出

CMD命令

  1. % make sure we add the correct folders even if this file is
  2. % not called from the current folder
  3. fileName = mfilename();
  4. filePath = mfilename('fullpath');
  5. filePath = filePath(1:end-size(fileName, 2));
  6. % Add folders to current path
  7. path(genpath([filePath 'files']), path);
  8. % 一般可以这么写
  9. addpath(genpath(pwd))
  10. % request a numeric input
  11. prompt = 'What is the original value? ';
  12. x = input(prompt)
  13. y = x*10
  14. % Request a simple text
  15. prompt = 'Do you want more? Y/N [Y]: ';
  16. str = input(prompt,'s');
  17. if isempty(str)
  18. str = 'Y';
  19. end

Excel函数

xlsread:

  1. [num,txt,raw]= xlsread('Nashville_climate.xlsx');
  2. num =xlsread('Nashville_climate.xlsx', 1, 'D15:E17'); 

xlswrite

text函数

打开:fid =fopen(filename, permission)

关闭:fclose(fid)

  1. function view_text_file(filename)
  2. fid = fopen(filename,'rt');
  3. if fid < 0
  4. error('error opening file %s\n\n', filename);
  5. end
  6. % Read file as a set of strings, one string per line:
  7. oneline = fgets(fid);
  8. while ischar(oneline)
  9. fprintf('%s',oneline) % display one line
  10. oneline = fgets(fid);
  11. end
  12. fprintf('\n');
  13. fclose(fid);
  14. end
操作
'rt' 读操作
'wt' 写操作
'at' 打开或者创建新文件,并在文件的最后添加数据
'r+t' 打开文本文件用于读和写
'w+t' 打开或者创建文本文件用于读和写,丢弃原有的内容
'a+t' 打开或者创建文本文件用于读和写,在文件的末尾增加数据

二进制函数

写:

  1. function write_array_bin(A,filename)
  2. fid = fopen(filename,'w+');
  3. if fid < 0
  4. error('error opening file %s\n', filename);
  5. end
  6. fwrite(fid,A,'double');
  7. fclose(fid);
  8. end

读:

  1. function A = read_bin_file(filename,data_type)
  2. fid =fopen(filename,'r');
  3. if fid < 0
  4. error('erroropening file %s\n',filename);
  5. end
  6. A =fread(fid,inf,data_type);
  7. fclose(fid);
  8. end

信号

高斯白噪声

在数值变量后还可附加一些标志性参数:

y = awgn(…,POWERTYPE) 指定SNR和SIGPOWER的单位。POWERTYPE可以是'dB'或'linear'。如果POWERTYPE是'dB',那么SNR以dB为单位,而SIGPOWER以dBW为单位。如果POWERTYPE是'linear',那么SNR作为比值来度量,而SIGPOWER以瓦特为单位。

  1. 分贝(decibel,dB):分贝(dB)是表示相对功率或幅度电平的标准单位,换句话说,就是我们用来表示两个能量之间的差别的一种表示单位,它不是一个绝对单位。例如,电子系统中将电压、电流、功率等物理量的强弱通称为电平,电平的单位通常就以分贝表示,即事先取一个电压或电流作为参考值(0dB),用待表示的量与参考值之比取对数,再乘以20作为电平的分贝数(功率的电平值改乘10)。
  2. 分贝瓦(dBW, dBWatt):指以1W的输出功率为基准时,用分贝来测量的功率放大器的功率值。
  3. dBm(dB-milliWatt):即与1milliWatt(毫瓦)作比较得出的数字。

0 dBm = 1 mW

10 dBm = 10 mW

20 dBm = 100 mW

也可直接用randn函数产生高斯分布序列,例如:

  1. y=randn(1,2500);
  2. y=y/std(y);
  3. y=y-mean(y);
  4. a=0.0128;
  5. b=sqrt(0.9596);
  6. y=a+b*y;

均匀分布白噪声

  1. % L 为信号长度
  2. % mean为均值
  3. % var为方差
  4. % rand函数产生的是幅值为【01】均匀分布的白噪声,均值为1/2,方差为1/12
  5. % 使用下面的公式可以产生指定均值和方差的均匀分布的白噪声
  6. % matlab中,可以使用函数:mean(white_noise)来检验其均值
  7. % 使用函数:var(white_noise)来检验其方差
  8. white_noise=  (rand(1,L) - 0.5 ) * sqrt( 12 * var )+ mean;

指数分布白噪声:exprnd(mu, m, n) 

逆z变换

  1. syms z
  2. f = 2*z/(z-2)^2
  3. iztrans(f)

内插法

interp1原理是运用夺下你给是来进行内插运算。

method说明:

interpft,可进行基于FFT(Fast Fourier Transform,快速傅里叶变换)的內插法

interp2 ,指令可进行二维內插

griddata ,分散无规律点的内插

interp3:可进行 3 维內插

曲线拟合

polyfit:多项式拟合

编程效率

循环的执行效率低下,因为这是一个解释型语言。
提高效率的办法:矩阵或者向量操作,避免2重以上的循环;预分配。

程序调试

  1. assert(flase, 'warning message');%if false display the error message

例子1

在ML课程中的Kmeans有nxk的矩阵X和对应的标签向量y(标签取值是1-10的整数),对于所有相同标签的数据求平均,输出结果矩阵Z。

计时方法

tic\toc用于计算程序运行时间。

个别函数的计时方法

  1. profile on -detail mmex % 启动定时器
  2. %
  3. %functions here
  4. %
  5. profile off % 停止计时器
  6. profile report % 计时报告



添加新批注
在作者公开此批注前,只有你和作者可见。
回复批注