@hainingwyx
2017-06-01T17:33:43.000000Z
字数 12214
阅读 3384
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将字符串当作一个行向量,每个元素对应一个字符,其标识方法和数值向量相同。
若需要查询与字符串或者字符相关的指令,可以输入
help strfun
help strings
存储多个字符串
函数
sprintf:输出
fprintf('%s',char(ii))
abs\double:字符转ASCII值
结构体是一种数据容器,可以包含不同的类型的元素。大多数图像处理应用中,元素对元素的组织方式不是最佳的,经常需要访问元素的域时,可以选用结构体。
函数
struct2cell:转换为胞体
isfield:是否含有一定键值
isstruct():是否是结构体
fieldname():返回所有成员名
rmfield()
getfield()
示例程序
r.ssn =12345678
r.address.street = '742 Evergreen Terrace'
field = 'f';
value = {'some text';
[10, 20, 30];
magic(5)}
s = struct(field,value)
# Multiple Fields
field1 = 'f1'; value1 = zeros(1,10);
field2 = 'f2'; value2 = {'a', 'b'};
field3 = 'f3'; value3 = {pi, pi.^2};
field4 = 'f4'; value4 = {'fourth'};
s = struct(field1,value1,field2,value2,field3,value3,field4,value4)
%The cell arrays for value2 and value3 are 1-by-2, so s is also 1-by-2
s(1)
s(2)
% with empty field
s = struct('f1','a','f2',[])
% contain cell Arrays
field = 'mycell';
value = {{'a','b','c'}};
s = struct(field,value)
% empty structure
s = struct('a',{},'b',{},'c',{})
s(1).a = 'a' %asign a value
%nested structure
a.b = struct('c',{},'d',{})
fieldnames(a.b)
也叫作元素对元素组织。这种方式访问子集比较容易。
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
定义:元胞可以把不同类型的数据归并到一个数组中,每一个元素叫做单元。
函数
cellplot:图形显示
celldisp:显示全部内容或者A{:}
iscell:判断是否为胞体
num2cell:数值阵列转换为胞体
mat2cell:数值阵列转换为胞体,可以处理比较复杂的转换
struct2cell :结构体转换为胞体
deal:结构体某一个键值转换为胞体
% 创建:使用赋值语句创建
c(1, 1) ={'Clayton'}
c{1, 1} = 'Clayton'
a = {1, 'str',[11 12 13 14]}
% 使用cell函数创建
arrayName = cell(m,n)
C = cell(3) % square cell array
B = {'James Bond', [1 2;3 4;5 6]; pi, magic(5)}
% {}访问时,返回细胞单元的数据,如:B{1,2}。()访问时返回细胞数组的子数组,可能不返回实际内容,如B(1,2)。
b(1, 1) ={'Clayton'}
b{1, 1} = 'Clayton'
% 两种删除
arrayName{x,y}=[]
B(1,:) = []
多重花括号是关键
简单例子: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;
函数
syms n %级数求和
f = 1/n^2;
s1 = symsum(f,n, 1, inf)
syms x
y = (1 + x +x^2)/(1 - x + x^2);
taylor(y, 6, 1)
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('Dy -(x^2 + y2)/x2/2', 'x')
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:转换为分数
常用数学函数
函数 | 意义 | 函数 | 意义 | 函数 | 意义 |
---|---|---|---|---|---|
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
的返回值与除数符号相同。
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)
矩阵运算
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元素的位置及其值。
函数
“单下标”标识
采用矩阵元素的序号来引用矩阵元素。矩阵元素的序号就是相应元素在内存中的排列顺序。在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是两个输入的变量
矩阵函数
B = repmat(A, m, n); %矩阵复制
n = nnz(X); %返回矩阵中非0元素的个数
A = eye(10000);
S = sparse(A); % S存储格式是系数矩阵,省内存
B = full(S); % 还原存储格式
fun = @(A,B) A.*sin(B);%自定义函数
A = 1:7;
B = pi*[0 1/4 1/3 1/2 2/3 3/4 1].';
C = bsxfun(fun,A,B)%对A分别做B中元素的fun运算
平面绘图
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,则再画另一幅图时,原来的图就看不到了,在轴上绘制的是新图,原图被替换了。
图表指令
立体绘图
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是否是一个标量
% Set and parse parameters in a function
if (~exist('opts','var'))
opts = [];
end
p = 1000;
if isfield(opts,'p')
p = opts.p;
end
从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);
% make sure we add the correct folders even if this file is
% not called from the current folder
fileName = mfilename();
filePath = mfilename('fullpath');
filePath = filePath(1:end-size(fileName, 2));
% Add folders to current path
path(genpath([filePath 'files']), path);
% 一般可以这么写
addpath(genpath(pwd))
% request a numeric input
prompt = 'What is the original value? ';
x = input(prompt)
y = x*10
% Request a simple text
prompt = 'Do you want more? Y/N [Y]: ';
str = input(prompt,'s');
if isempty(str)
str = 'Y';
end
xlsread:
[num,txt,raw]= xlsread('Nashville_climate.xlsx');
num =xlsread('Nashville_climate.xlsx', 1, 'D15:E17');
xlswrite
打开: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
高斯白噪声
在数值变量后还可附加一些标志性参数:
y = wgn(…,POWERTYPE) 指定p的单位。POWERTYPE可以是'dBW','dBm'或'linear'。线性强度(linear power)以瓦特(Watt)为单位。
y = wgn(…,OUTPUTTYPE)指定输出类型。OUTPUTTYPE可以是'real'或'complex'。
awgn:在某一信号中加入高斯白噪声
y = awgn(…,POWERTYPE) 指定SNR和SIGPOWER的单位。POWERTYPE可以是'dB'或'linear'。如果POWERTYPE是'dB',那么SNR以dB为单位,而SIGPOWER以dBW为单位。如果POWERTYPE是'linear',那么SNR作为比值来度量,而SIGPOWER以瓦特为单位。
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说明:
interpft,可进行基于FFT(Fast Fourier Transform,快速傅里叶变换)的內插法
interp2 ,指令可进行二维內插
griddata ,分散无规律点的内插
interp3:可进行 3 维內插
polyfit:多项式拟合
循环的执行效率低下,因为这是一个解释型语言。
提高效率的办法:矩阵或者向量操作,避免2重以上的循环;预分配。
assert(flase, 'warning message');%if false display the error message
在ML课程中的Kmeans有nxk的矩阵X和对应的标签向量y(标签取值是1-10的整数),对于所有相同标签的数据求平均,输出结果矩阵Z。
计时方法
tic\toc用于计算程序运行时间。
个别函数的计时方法
profile on -detail mmex % 启动定时器
%
%functions here
%
profile off % 停止计时器
profile report % 计时报告