Matlab学习总结

MATLAB基本数据类型

双精度/单精度/整形

数据的范围

数据类型数值范围
int8-27,27-1
int16-2{15},2{15}-1
int32-2{31},2{31}-1
int64-2{63},2{63}-1
uint80,2^{8}-1
uint160,2^{16}-1
uint320,2^{32}-1
uint640,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按对数值等间隔分布。

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是否是一个标量

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以瓦特为单位。

  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函数产生高斯分布序列,例如:

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             % 计时报告

    原文作者:hainingwyx
    原文地址: https://www.jianshu.com/p/aace7b5ca203
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞