Matlab R2016a完全自学一本通
记在前面:
(1)函数中:dim=1 按列;dim=2 按行
(2)这本书很垃圾,不建议买。
(3)在数据库连接中,用两个单引号表示字符串,千万不能用双引号
第2章 Matlab基础知识
2.1 数据类型
数值,逻辑,字符串,函数句柄,结构体,单元数组
2.1.1 数值类型
int8,uint8;int16,uint16;int32,uint32;int64,uint64 整数型
single 单精度
double 双精度 (默认)
示例:int32(820)
查看数值类型 class() 函数
向下取整 floor(x)
向上取整 ceil(x)
四舍五入 round(x)
向0取整 fix(x) 以数轴的思想去思考。正整数时同floor 负整数时同ceil
whos列出当前spacework的所有变量
eps函数 默认是1 eps(1)表示离1最近的浮点数值;因为精度只有这么多,算出的结果会去匹配到系统的精度。一般不影响计算结果,除非对数值有非常苛刻的要求。
复数部分:
complex(a,b) : 构建复数 a+bi
real(z) z的实部;image(z) z的虚部;abs(z) 复数z的模;angle(z) 复数的辐角;conj(z) 复数的共轭复数
无穷量(Inf) 和 非数值量(NaN)
Inf -Inf NaN
2.1.2 逻辑类型
关系操作符:< <= > >= == ~=不等于
逻辑操作符:& | ~
其他操作符:xor(x,y) 异或
any(x)判断如果x是非零元素返回true(即1)否则返回flase(即0)
isfinite() 判断是否有界;isempty()判断空值;global 定义全局变量;ishold 检查图像状态
isinf,isletter,isnan,isreal,isspace,isstr,isstudent,isunix
2.1.3 字符和字符串
字符串在matlab中是以ASCII存储的,所以可以和数值进行计算
2.1.4 函数句柄
@是句柄创建操作符
F_Handle = @cos;
F_Handle(x) 来计算cos(x)
functions(F_Handle) 返回一个有关函数的结构体;func2str() 返回函数的名称
F_Handle = str2func('cos') 也能创建一个函数句柄
save filename.mat F_Handle 保存在当前目录下filename.mat
load filename.mat funhandle 读取
isa(var,'function_handle') 检测变量var是否是函数句柄
isequal(funhandle1,funhandle2) 检测两个函数句柄是否对应于同一个函数
2.1.5 结构体类型
比如创建student结构
student.name='张庆';student.age=37;student.grade='一年级';
或者:student = struct('name','张庆','age',37,'grade','一年级');
repmat()函数 重复使用,具体参考百度
2.1.6 数组类型
在matlab中所有的运算都是数组运算和矩阵运算。两者不同。
linspace(a,b,100) 在区间[a,b]上创建100个元素向量
2.1.7 单元数组类型
创建单元数组 注意:,分隔 ;分行 {}
(1)C={'x',[1;3;6];10,pi}
(2)cellName = cell(m,n) 创建m*n的空矩阵
单元数组的寻访
C(m,n) 指单元数组中的第m行第n列的单元
C{m,n} 指单元数组中第m行第n列单元中的内容
reshape(C,m,n) 将单元数组C改变成具有m*n的新单元数组
2.1.8 map 容器类型
创建 (1)newMap = containers.Map();newMap('a')='aa';newMap('b')=12;
(2) newMap = containers.Map({key1,key2},{value1,value2});
keys(newMap) 查看所有的key值
values(newMap) 查看所有的value值;values(newMap,{key1,key2}) 查看key1,key2的value值
newMap('a') 查看key='a'的value值
remove(newMap,'a') 删除key-value值
2.2 基本矩阵操作
2.2.1 矩阵和数组的概念及其区别
2.2.2 矩阵的构造
ones(n) 构建一个n*n的1矩阵
ones(m,n,...p) 构建一个m*n*....p的1矩阵
ones(size(A)) 构建一个和A同样大小的1矩阵
zeros(n) 构建一个n*n的0矩阵(其他用法同ones)
eye(n) 构建一个n*n的单位矩阵(其他用法同ones)
magic(n) 构建n阶魔方矩阵
rand(n) 构建0~1随机矩阵;randn(n) 构建0均值、单位方差的正态分布随机数
diag(x,k) 构建一个n维矩阵,他的主对角线元素取自向量x,其余元素的值为0;k性质同下
diag(A,k) 构建一个由矩阵A 第k条对角线的元素组成的列向量;k=0为主对角线,k<0为下第k条对角线,k>0为上第k条对角线
triu(A,k) 构建上三角矩阵,k性质同上
tril(A,k) 构建下三角矩阵
直接建立矩阵:,分隔 ;分行
A = [1,2,3;4,5,6;7,8,9] 3*3矩阵
当m=n=1时,标量
当m=n=0时,空矩阵
2.2.3 矩阵大小及结构的改变
fliplr(A) 矩阵每一行均进行逆序排列
flipud(A) 矩阵每一列均进行逆序排列
flipdim(A,dim) 当dim=1时,每一列进行逆序排序,等价于flipud(A);当dim=2时,每一行进行逆序排序,等价于fliplr(A)
rot90(A) 脑袋顺时针转90度看,就是要的结果;rot90(A,k) k的性质是 翻转k*90度
shiftdim(A,n) ***难以理解***
squeeze(A) 返回没有空维的矩阵A;比如4*1*3阶 -> 4*3阶
cat(dim,A,B) 将矩阵A和B组合成一个矩阵;dim=1,水平合并;dim=2,竖直合并
permute(A,order) ***难以理解***
ipermute(A,order) permute的逆变换
sort(A,dim,mode) 当dim=1时,对矩阵的每一列排序;当dim=2时,对矩阵的每一行排序;mode=ascend 升序(默认),mode=descend 降序
2.2.4 矩阵下标引用
双下标索引 和 单下标索引
下标访问:
A(1) 将二维矩阵A重组为一维数组,返回第一个元素
A(:,j) 返回二维矩阵A中第j列列向量
A(i,:) 返回A中第i行行向量
A(i:Inc1:j,m:inc2:n) 表示访问从第 i 行至第 j 行,行间隔为 inc1 行
线性引用:
sub2ind(size(A),i,j) 得到矩阵A的第i行第j列的下标值;也即双下标值转单下标值
[i,j] = ind2sub(size(A),ind) 单下标值转双下标值
sum(A(:,end)) 代表最后一列求和
2.2.5 矩阵信息的获取
矩阵的结构:
isempty(A) 检测矩阵是否为空
isscalar(A) 检测矩阵是否是单元素的标量矩阵
isvector(A) 检测矩阵是否是只具有一行或一列元素的一维向量
issparse(A) 检测数组是否是稀疏矩阵
矩阵大小:
ndims(A) 获取A的维数;经测试最小为2
size(A)
length(A)
numel(A) 获取矩阵元素的个数
矩阵维度:空矩阵、标量矩阵、一维矩阵、二维矩阵都是2维
矩阵的数据类型:
isnumeric 数值型
isreal 实数数值
isfloat 浮点数
isinteger 整数
islogical 逻辑
ischar 字符
isstruct 结构体
iscell 元胞,就是单元数组
iscellstr 结构体的元胞型变量
矩阵占用的内存:whos A 查看矩阵A的情况
2.3 运算符
算术运算符、关系运算符、逻辑运算符
2.3.1 算术运算符
A + B | A与B相加 (A、B为数值或矩阵) |
A - B | A与B相减 (A、B为数值或矩阵) |
A * B | A与B相乘 (A、B为数值或矩阵) |
A .* B | A与B相应元素相乘 (A、B为相同维度的矩阵) |
A / B | A与B相除 (A、B为数值或矩阵) |
A ./ B | A与B相应元素相除 (A、B为相同维度的矩阵) |
A ^ B | A的B次幂 (A、B为数值或矩阵) |
A .^ B | A的每个元素的B次幂 (A为矩阵,B为数值) |
exp(x) => e的x次幂;log(x);log10(x);sqrt(x) x的平方根
sin(x);cos(x);tan(x);
asin(x) 反正弦函数;acos(x);atan(x);
mod(a,b) 取余数;min(a,b) 取最小数;max(a,b);
mean(x) 均值;median(x) 中位数;sum(x);prod(x) 计算x阵列的连乘值;
cumsum(x,dim)累计总和;cumprod(x,dim)累计连乘
sign(x) 符号函数;rem(x,y) 返回x/y余数,与mod有区别,可百度
diff(x) x向量的差分;fft(x) x向量的离散傅里叶变换;rank(x) 矩阵的秩
2.3.2 关系运算符
< <= > >= == ~=
返回值为1,比较结果是真;返回值为0,比较结果是假
2.3.3 逻辑运算符
& | ~
xor(x,y)异或;any(x) 有任何元素非零 ;all(x) 所有元素非零
2.3.4 运算优先级
优先级 | |
1 | () |
2 | 转置和乘幂:' ^ .^ |
3 | + - ~ |
4 | * / .* ./ |
5 | : |
6 | > >= < <= == ~= |
7 | & |
8 | | |
9 | 捷径逻辑与:&& |
10 | 捷径逻辑或:|| |
2.4 字符串处理函数
字符串函数 | 函数功能 |
eval(string) | 作为一个matlab命令求字符串的值 |
blanks(n) | 返回一个n个零或空格的字符串 |
deblank | 去掉字符串中后拖的空格 |
feval | 求由字符串给定的函数值 |
findstr | 从一个字符串内找出字符串 |
isletter | 字母存在时返回真值 |
isspace | 空格字符存在时返回真值 |
isstr | 输入一个字符串,返回真值 |
lasterr | 返回上一个产生matlab错误的字符串 last error |
strcmp | 字符串相同,返回真值 |
strrep | 字符串替换 |
strtok | 在一个字符串里找出第一个标记 |
2.4.1 字符串的构造
[] 中的字符串必须长度相同
{} 中的字符串长度可以不同
str = ['abc','bcd'];str={'a','bc'};
2.4.4 字符串--数值转换
函数名称 | 函数功能 |
abs | 字符串转ASCII |
dec2hex | 十进制->十六进制 |
fprintf | 打印 |
hex2dec | 十六进制->十进制 |
hex2num | |
int2str | 整数 -> 字符串 |
lower | 转小写 |
num2str | 数字转字符串 |
setstr | ASCII转字符串 |
sprintf | 打印 |
sscanf | 数字转字符串(有格式) |
str2mat | 字符串 -> 矩阵 |
str2num | 字符串转数字 |
upper | 大写 |
第三章 数组和矩阵
3.1 数组运算
3.1.1 数组的创建和操作
A([1 6]) 获取矩阵A中第1和6的元素
logspace(a,b,n) 创建第一个元素10^a,最后一个10^b,形成n个元素的等比数列
linespace(a,b,n) 创建第一个元素a,最后一个元素b,形成总数为100个元素的线性间隔向量
3.1.2 数组的常见运算
左除 \ 右除 / (A \ B = B / A) 右除是正常情况
dot(A,B,dim) 数组元素的乘积之和
3.2.1 创建矩阵
函数名称 | 表示意义 |
compan(p) | 生成一个特征多项式为p的二维矩阵 |
hadamard(k) | 返回一个阶数为n=2k的Hadamard矩阵,只有当n能被4整除时Hadamard矩阵才存在 |
hankel(x) | 返回一个由向量x定义的Hankel方阵。该矩阵是一个对称矩阵,其元素为h(ij) = x(i+j-a),第1列为向量x,反三角以下的元素为0 |
hankel(x,y) | 返回一个m*n的Hankel矩阵,它的第1列为向量x,最后一行为向量y |
magic(n) | 返回一个n*n的魔方矩阵 |
pascal(n) | 返回一个n*n的Pascal矩阵 |
rosser | 给出Rosser矩阵,这是一个经典对称特征测试问题,它的大小是8*8 |
vander(x) | 返回一个Vandermonde矩阵,其元素为v(ij)=x(i)^(n-j),n为向量x的长度 |
wilkinson(n) | 返回一个m*n的Wilkinson特征值测试矩阵 |
注意:()中表示下标
Hilbert 希尔伯特矩阵,也称H阵 hilb(x)
invhilb(n) 逆矩阵
Toeplitz 托普利兹矩阵 toeplitz(k,r)
随机矩阵 rand(m,n)
正态分布随机矩阵 randn(m,n)
3.2.2 改变矩阵大小
合并 [a b] 水平合并 [a;b] 竖直合并
删除 赋[]
3.2.3 重构矩阵
转置( ' ) 第一行变第一列 共轭转置( .' )
3.3 矩阵元素的运算
加减:(1)交换律 A+B=B+A(2)结合律 A+(B+C)=(A+B)+C (3)零元 A+0=0+A=A (4)负元 A+(-A)=(-A)+A
乘法(数组和矩阵):(1)1A=A (2)x(A+B)=xA+xB (3)(x+y)A=xA+yA (4)(xy)A=x(yA)=y(xA)
乘法(矩阵和矩阵):(1)结合律 (A*B)*C=A*(B*C) (2)左分配率 A*(B+C)=A*B+A*C (3)右分配率 (B+C)*A=B*A+C*A (4)单位矩阵的存在性 E*A=A,A*E=A
除法(矩阵间):矩阵的除法是乘法的逆运算
示例:A/B=AB^-1 ; A\B=A^-1B
3.3.9 矩阵元素的差分
Y=diff(X,n,dim) 计算矩阵的n阶差分;
3.4 矩阵运算
3.4.1 矩阵分析
函数名 | 功能描述 |
norm | 求矩阵或者向量的范数 |
normest | 估计矩阵的2阶范数 |
rank | 矩阵的秩,即求对角元素的和 |
det | 矩阵的行列式 |
trace | 矩阵的迹 |
null | 0的空间 |
orth | 正交化空间 |
rref | 约化行阶梯形式 |
subspace | 求两个矩阵空间的角度 |
3.4.2 矩阵分解
函数 | 功能描述 |
chol | Cholesky分解 |
cholinc | 稀疏矩阵的不完全Cholesky分解 |
lu | 矩阵的LU分解 |
luinc | 稀疏矩阵的不完全LU分解 |
qr | 正交三角分解 |
svd | 奇异值分解 |
gsvd | 一般奇异值分解 |
schur | 舒尔分解 |
3.4.3 特征值和特征向量
eig,balance,eigs,condeig 等函数是计算特征值和特征向量,原文看不懂
3.5 稀疏矩阵
3.5.1 稀疏矩阵的存储方式
matlab中对稀疏矩阵中的0并不存储,如果矩阵有m个值,物理形式m*3(1行下标占4字节2列下标占4字节3值占4字节),所以存储空间是16*m
3.5.2 稀疏矩阵的生成
sparse函数 从满矩阵->稀疏矩阵
full函数 从稀疏矩阵->满矩阵
spy函数 对稀疏矩阵中非零元素的分布进行图形化显示
特殊稀疏矩阵:
函数 | 调用格式 | 描述 |
speye | S = speye(m,n) | 创建单位稀疏矩阵 |
epones | S = spones(X) | 创建非零元素为1的稀疏矩阵 |
sprand | S = sprand(X) | 创建非零元素为均匀分布的随机数的稀疏矩阵 |
sprandn | S = sprandn(X) | 创建非零元素为高斯分布的随机数的稀疏矩阵 |
sprandsym | S = sprandsym(X) | 创建非零元素为高斯分布的随机数的对称稀疏矩阵 |
spdiags | S = spdiags(X) | 创建对角稀疏矩阵 |
spalloc | S = spalloc(X) | 为稀疏矩阵分配空间 |
第四章 MATLAB编程基础
4.1 M文件编辑器
4.2 变量
4.2.1 变量的命名
(1)大小写敏感
(2)字母开头
(3)不能使用matlab的关键字
(4)最多63个字符
isvarname函数 验证用户指定的变量名是否被matlab接收的合法变量名
4.2.2 变量的类型
(1)局部变量
(2)全局变量:开头大写 global X_Val
(3)永久变量:persistent 关键字声明
4.2.3 MATLAB默认的特殊变量
特殊变量 | 功能描述 |
ans | 系统默认的用来保存运算结果的变量名 |
pi | 圆周率 |
eps | 机器零阈值,MATLAB中最小数 |
inf | 无穷大 |
Nan 或 nan | 不定数 |
i 或 j | 虚数 |
nargin | 函数的输入参数个数 |
nargout | 函数的输出参数个数 |
realmin | 可用最小正实数 |
realmax | 可用的最大正实数 |
bitmax | 可用的最大正整数(双精度) |
varargin | 可变的函数输入参数个数 |
varargout | 可变的函数输出参数个数 |
beep | 使计算机发出“嘟嘟”声音 |
4.2.4 关键字
iskeyword 函数可查询关键字
4.3 MATLAB的控制流
4.3.1 顺序结构
4.3.2 if-else-end 分支结构
if expression1
commands1
elseif expression2
commands2
else
commands3
end
4.3.3 switch-case 结构
switch value
case test1
command1
case test2
command2
otherwise
commands
end
4.3.4 try-catch 结构
try
command1
catch
command2
end
4.3.5 for 循环结构
for x=array
commands
end
while expression
commands
end
4.4 控制程序流的其他常用指令
return,input,keyboard 用于调试的指令,pause 暂停执行文件,按任意键继续,continue,break
error('Message'),errortrap,lasterr;warning('Message'),lastwarn
4.5 脚本和函数
function [x,y,z] = sphere(param1,param2,param3)
4.5.4 匿名函数、子函数、私有函数与私有目录
匿名函数: f = @(input,input,...) expression;f 函数句柄
子函数:不是主函数的都是子函数。放后面就行,申明同主函数
私有函数:
4.5.6 eval和feval
eval函数
内联函数
4.5.8 向量化和预分配
4.5.9 函数的函数
fminsearch(@func,param)
就是有些函数是以函数为参数
4.5.10 P码文件
内部伪代码:pcode FunName 生成P码文件
4.6 M文件中变量的检测与传递
4.6.1 输入/输出变量检测指令
4.6.2 “可变数量” 输入/输出变量
varargin
varargin
说明:在正常变量之后
4.6.3 跨空间变量传递和赋值
evalin('工作区','expression')
工作区:base,caller
assignin
4.7 MATLAB程序的调试
4.7.2 直接调试法
(1)去掉分号
(2)在适当位置,添加输出变量值的语句
(3)keyboard
(4)函数-》脚本,然后设断点调试
4.7.3 使用调试函数进行调试
help debug 列出所有调试函数
dbstop 设置断点
dbclear 清除断点
dbstatus 列出所有的断点
dbcont 恢复执行函数
dbstack 调用堆栈函数 (不知道有毛用)
dbstep 执行一行或多行数据
dbtype 列出M文件内容函数
dbup、dbdown 切换工作区函数
dbquit 退出
4.7.4 工具调试法
快捷键 F5 保存并运行
快捷键 F12 设置或清除断点
快捷键 F10 过程单步(不进子函数)
快捷键 F11 单步执行
快捷键 F11+shift 执行到下一个断点
4.7.5 程序的性能优化技术
书里的观点很浅薄,百度找这方面的信息。
总结:基础知识主要有:
(1)数组和矩阵的基本操作(加,减,乘,除)
(2)MATLAB编程基础(if,for,函数)