显示中文帮助的方法
预设→常规→帮助→在mathworks.com网站上(需要Internet连接)→语言(简体中文)
/:右除。a/b表示矩阵a乘以矩阵b的逆。a/b == a * inv(b)
\:左除。a\b表示矩阵a的逆乘以b。 a\b == inv(a) * b
./:右除。a./b表示矩阵a中的每个元素除以矩阵b的对应的元素。
.\:左除。a.\b表示矩阵b中的每个元素除以矩阵a的对应的元素。
.*点乘不是矩阵的乘法,是对应元素相乘。
1 MATLAB系统环境与设置
- path函数,可以查看搜索路径包含的所有路径。
- cd返回当前目录。
- userpath('路径名')更改工作目录。改好后用savepath保存路径。
- pathtool是界面工具,设置搜索路径。
2 MATLAB的数据操作及语法
- matlab变量区分大小写,变量不声明,拿来即用。
- 回车表示一句语句结束,语句末尾有分号,只执行,不输出在显示栏。无分号则输出执行结果。
- 一行不够写的话,用...续行。
- who显示在工作空间中滞留的变量名,whos给出变量更详细的信息。
- clear命令清除工作空间中所有变量。clear a,清除变量a
- 保存数据save [文件名] [变量名] [-append] [-ascii]
- load [文件名] 载入变量文件
- format数据输出格式控制,只影响输出格式,不影响计算和存储,默认为short格式。
- class()查看括号里变量的数据类型。
字符串
- matlab中字符串使用单引号''括起来的。
- double函数或abs函数可以获取字符的ASCII值。
- char(63)输出ASCII码为63代表的字符。
- 字符串与数值间互换str2num, num2str
- eval('t=1')执行字符串中的语句,也就是t=1语句。
eval()函数一个很好的功能就是可以自动生成一系列变量
注意eval()中拼接字符串外面要加中括号!
for x = 1:3
eval(['a',num2str(x),' = 7'])
end
%% 相当于执行了下面三条语句
a1 = 7
a2 = 7
a3 = 7
- 想要让标题也自动编号,要注意在字符串内还想输出单引号'的话,需要打两个''
for y = 1:2
eval(['title(''test',num2str(y),''');']);
end
结构体
- 结构体.成员名=表达式
- issturct(a)判断a是不是结构体
- fieldnames(a)返回a中所有成员的成员名,返回类型为字符串数组
- isfield(a, 'x1')判断x1是不是a结构体中的成员。
- rmfield删除结构体中某个成员。
- getfield获得结构体中的某个成员
Cell(单元或元胞)
- 用大括号创建
- a = {1, 'str', [11 22 33 44]}
- 取元胞内容
- 小括号()表示取出指定位置的元胞,还是个元胞,不能用于比较,否则很难找到错误。
- 花括号 { } 取出的是元胞指定位置的内容,可以拿来做比较,或者借助 isempty 判断是否为空。eg:
if(~isempty(tagcity{i,j}))
- 假设a元胞的第二个元素为[]既空元素,那么
isempty(a(2))
返回0,是一个错误的结果。只有写isempty(a{2})
才会返回1,得到正确的判断。
3 MATLAB的矩阵操作
- zeros函数建立0矩阵,幺矩阵ones函数建立元素全为1的矩阵。
- 冒号表达式建立向量。
- e1:e2:e3,其中e1位初始值,e2位步长,e3为结束
- linspace(a, b, n)建立行向量,a和b分别为行向量的第一个和最后一个元素,n为总个数,省略n则默认是产生100个元素。
矩阵索引
- A(2, 3)获得A矩阵的第二行第三列的元素。
- matlab矩阵存放是按列存的,先存完第一列,然后存第二列,也可以用单索引值索引。
- find(A == 8)返回A矩阵中,值为8的元素的位置。
- [m, n] = find(A == 8)返回的是行列索引的形式。
- ind = find(A == 8)返回的是单值索引的形式。
- 两种索引值的转换:ind = sub2ind(size(A), m, n)
- [m, n] = ind2sub(size(A), 3)
重排矩阵
- reshape(A, 9, 1)将A重新排列为9行1列的向量。转换成列向量,也可以这样H = A(:):这个执行效率更高。
- 矩阵转置用一个单引号‘
矩阵拆分
- 获得矩阵中某行某列的部分内容。
- M = A(1, :)获得A矩阵中第一行的所有内容。
- M = A(1, 1:2)获得A矩阵的第一行中的第一列到第二列
- M = A(1, 1:end)获得A矩阵的第一行中的第一列到最后一列
- M = A(1, 1:end - 1)获得A矩阵的第一行中的第一列到倒数第二列
- M = A([1 2], [1 2])获得A矩阵中的第一行第一列,第一行第二列,第二行第一列,第二行第二列。
- P = A(2:3, 1:3)和P = A([2 3], [1 2 3])效果一样。
删除矩阵元素
- 若M是一个一维向量,M(2) = []删除了M的第二个元素。
- A(1, :) = []删除A矩阵的第一行所有元素。
- 上面方法可以看成索引矩阵的赋[]值操作。
扩展矩阵
- Q = repmat(A, 2, 2),将矩阵A看着一个大整体元素,然后复制成两行两列。
压缩矩阵,去除重复元素
- S = unique(R)去除R中重复的元素,但重新排序了。unique还有其他使用形式可查看help。
- unique(R,'stable'),去重且不重新排序。
4 MATLAB矩阵处理基础
特殊矩阵建立
矩阵和向量运算
线性方程组求解
矩阵的相似化简和分解
矩阵和向量的范数
矩阵分析
单位矩阵函数eye
随机矩阵函数rand
从0到10间均匀分布,s = 0 + (10 - 0) * rand(10,1)
从a到b直接均匀分布的随机数S = a + (b - a) * rand
randn产生均值为0,方差为1的随机数。
产生均值为u,方差为s的正态分布的随机矩阵, y = u + sqrt(s)*randn
mean获得序列的均值
std获得序列的方差
魔方矩阵用magic函数
Hilbert矩阵用hilb函数,每个位置的元素为1/(i + j)
Toeplitz矩阵用toeplitz函数
求矩阵A行列式的值det(A)
如果行列式的值不为0 ,则可求矩阵的逆inv(A)
复数可以直接用i或j表示
b的共轭可以用conj(b)函数,如果是复数向量直接用转置b'也表示共轭
内积运算可用dot()函数
若a,b为两个同纬行向量,这三个等式结果一致:
s = sum(conj(b).*a)
s = a*b'
s = dot(b, a)
线性方程组的求解,也可以用左除运算符,效率比较高。
A = [1, 2, 3; 1, 4, 9, 1 8 27];
b = [5, -2, 6]'
x = inv(A)*b
x = A\b %%解出结果与上一行相同
用jordan(A)获得矩阵A的约旦标准型。
[V J] = jordan(A) 得到V为A的相似变换矩阵,J就是约旦标准型。
eig函数可以获得矩阵的特征值。
[E D] = eig(A) 得到E为特征向量,D中主对角线为特征值其余为0。
1范数,2范数,无穷范数以及f范数,都统一使用norm函数。
norm(A, 1) %1范数
norm(A, 2) %2范数
norm(A, inf) %无穷范数
norm(A, 'fro') %f范数
矩阵分析:
-
MATLAB中函数的计算,比如求导数,默认是对每个元素求导。
- 求导函数diff(A)
- 求二阶导数diff(A, 2)
-
建立符号x,类似于代数。
- syms x
矩阵函数,计算矩阵函数eA,sinA,cosA,使用funm函数,使用方法如下:
S = funm(A, @fun);
A = [0 1; 0 -2];
expA = funm(A, @exp)
expA = expm(A) %结果同上
sinA = funm(A, @sin)
cosA = funm(A, @cos)
5 MATLAB程序控制结构
- M文件分类:命令文件(Script File)、函数文件(Function File)。
- 命令文件没有输入,没有返回;命令文件可以对工作空间的变量操作,结果返回工作空间,而函数文件中的变量为局部变量,函数执行完毕,变量被清除。
顺序结构
- 用于顺序结构中的输入和输出(命令交互):
- 数据输入(input函数)
- 数据显示(disp函数)
- 程序暂停(pause函数),设计界面动画时候经常使用。
分支(选择)结构
- y = cos(x(find(x < 10)));这样写没有用分支结构,直接用了索引找到所有x向量中x值小于10的下标,然后对这些数据进行求余弦操作。
x = input('x');
if x < 10
y = log(x);
else
y = cos(x);
end
%多分支if语句
c = input('input a character', 's');
if c >= 'A' & c <= 'Z'
disp(char(abs(c) + abs('a') - abs('A')));
elseif c >= 'a' & c <= 'z'
disp(char(abs(c) - abs('a') + abs('A')));
elseif c >= '0' & c <= '9'
disp(c);
end
%switch分支,在1000不同价格范围有不同的折扣rate
price = input('input price');
switch fix(price/100)
case {0, 1} %可以用单元结构表示当判断条件为0或1的时候
rate = 0;
case {2, 3, 4}
rate = .03;
case {5, 6, 7, 8, 9}
rate = .05;
otherwise
rate = .1;
end
- try是试探性的分支语句,也就是如果这条语句执行有错误,则不执行,或者执行其他的语句,提高了程序的容错性能。如果下面语句组1有错误,则执行语句组2。
try
语句组1
catch %可没有
语句组2 %可没有
end
- 比如需要删除某个变量,但是不知道这个变量有没有,如果直接使用clear或者delete命令,那么这个变量有的话可以,如果这个变量没有呢,那么就出错了,程序就终止了,在一个大程序中,这样是不利的。
循环结构
- for循环的常用语法如下,当然也可以for 循环变量 = 矩阵,这样每次循环,矩阵的每一列就会进入循环体一次。
for 循环变量 = 表达式1:表达式2:表达式3
循环体
end
- 注意循环变量自动增加,在循环体内不要对循环变量进行赋值操作,否则结果不可预料。
- matlab中的for循环中最好不使用i,j做循环变量。
% for循环
A = 1:100;
sumA = 0;
for k = 1:100
sumA = sumA + A(k);
end
- while循环
while 条件
循环体
end
%while循环,下面实现输入字符再输入回车继续执行,直接输入回车退出循环
while 1
c = input('input a character', 's')
if isempty(abs(c)) %isempty函数判断是否为空,输入回车也是空
break;
end
end
- matlab中要避免使用两重以上循环,否则效率很低。
- 怎样避免使用循环和提高循环效率?
- ★有些可以通过matlab的矢量化语言,通过矩阵或者向量操作完成。
- ★有些可以通过matlab提供的一些特殊工具箱函数完成。
- ★预分配的使用,会大大增加循环效率。
6 MATLAB的编辑器和程序调试
函数文件
function [输出形参] = 函数名([输入形参])
[注释说明] %用help或lookfor查看函数帮助即显示这部分内容
函数体
- 通常函数文件名和函数名一致,如果不一致,忽略函数名,调用时使用函数文件名。
- 选中多行内容可以用Ctrl+R注释,用Ctrl+T取消注释。
函数参数可调标识变量
nargin
nargout
varargin
varargout
- 可以完成传递参数的可调功能,类似于其它高级语言中的函数重载和多态。
- 前两者为输入输出参数个数,后两个可以代表未知的输入输出变量。
function re = add_multi(a, b, c, d)
%输入参数可调的函数范例
if nargin == 4
re = a + b + c + d;
elseif nargin == 3
re = a + b + c;
elseif nargin == 2
re = a + b;
else
error('wrong');
end
function [a, b] = add_mu(c, d, e, f)
%输出参数可调范例
if nargout == 2
a = c + d + e + f;
b = c * d * e * f;
else
a = c + d + e + f;
end
function re = add_var(a, b, varargin)
%输入参数个数未知范例
if nargin == 2
re = a + b;
elseif nargin == 3
c = varargin{1}; %用元胞数组来操作
re = a + b + c;
else
re = a + b;
for k = 1:(nargin-2)
re = re + varargin{k};
end
end
- error(nargchk(2, 4, nargin)),检测参数输入范围最小两个,最大4个,如果不是这个范围则输出错误信息。
- 关于varargout的用法可以参考工具箱函数,输入edit pburg可以看。
全局变量
- 使用global声明,可以提供不同的M文件访问同一个变量。在每个文件中都要声明。
调试
- >>执行状态,K>>调试状态
7 MATLAB绘图功能(1) 二维高层绘图操作
基本函数plot
-
二维绘图的辅助操作:
- 标注(图形名称,坐标轴名称,曲线标注,图例)
- 坐标轴控制
- 图形保持(同一坐标轴绘制多个图形)
- 窗口分割(同一个窗口有多个坐标轴)
-
plot(x, y)基本要求:x和y为相同长度的向量,但也有特殊用法:
- x为向量,y为矩阵,其中一维与x长度相同,则绘制多条不同颜色的曲线(颜色确定涉及到底层绘图操作)
- x和y为同维矩阵,以对应列绘制不同色彩的曲线
- 若plot只有一个参数,若x为实数向量,则绘制折线图;若为复数向量,则以实部和虚部为横纵坐标绘图
- 多个输入参数
- 曲线选项
% 基本绘图操作,绘制一个正弦函数
x = 0:0.01:2*pi;
y = sin(x);
plot(x, y);
% y是矩阵的情况
y1 = sin(x);
y2 = cos(x);
z = [y1; y2];
plot(x, z);
%两个参数都是矩阵
x1 = 0:0.01:2*pi;
x2 = -pi:0.01:pi;
x = [x1; x2];
y1 = cos(x1);
y2 = sin(x2);
y = [y1; y2];
plot(x, y);
% 上面是使用了每列进行绘图,这样绘制了很多条曲线。
% 如果想要使用每一行来绘图,
% 那么需要将x和y进行转置,
% 就绘制了一条从0到2π的余弦,
% 一条从-π到π的正弦
x1 = 0:0.01:2*pi;
x2 = -pi:0.01:pi;
x = [x1; x2]';
y1 = cos(x1);
y2 = sin(x2);
y = [y1; y2]';
plot(x, y);
% plot只有一个参数
x = linspace(0, 2*pi, 200);
y = sin(x);
plot(y); %绘出正弦
y2 = cos(x);
y3 = y + i*y2;
plot(y3); %绘出一个椭圆,坐标轴控制axis equal命令可变成一个圆
% plot只有多个参数
x1 = linspace(0, 2*pi, 200);
x2 = linspace(0, 2*pi, 100);
y1 = cos(x1);
y2 = sin(x2);
plot(x1, y1, x2, y2); %不同长度的曲线同时绘制
% plot含有的曲线选项
plot(x, y, 'k'); %r红色,k黑色,g绿色,y黄色,m品红,b蓝色
plot(x, y, '*'); %用'*'来绘图,是离散的图。同理.是点,'p'是五角星,'<' ,'>'是三角星,'--'虚线,'-.'是线和点,':'很小的虚线
plot(x, y, 'r*'); %颜色和线型的结合
%图形标注
plot(x , y);
xlabel('x');
ylabel('y');
title('正弦');
text(2, 0.3, 'y = sin(x)'); %在某个位置显示字符串
legend('cos', 'sin'); %绘制图例
- matlab中可以用LaTex字符,字符串'x_2'显示出来是x2
坐标轴控制
- axis equal
- axis square
- axis auto
- axis off
- axis on
- axis([xmin xmax ymin ymax])
- xlim([xmin xmax])
- ylim([ymin ymax])
图形保持
- hold on
- 关闭图形保持hold off
窗口分割
%窗口分割
x = 0:0.1:2*pi;
y1 = sin(x);
y2 = cos(x);
y3 = tan(x);
y4 = exp(x);
subplot(2, 2, 1) %将窗口分成两行两列4格,绘制第一格
plot(x, y1);
subplot(222) %绘制第二格
plot(x, y2);
subplot(223)
plot(x, y3);
subplot(224)
plot(x, y4);
8 MATLAB绘图功能(2) 二维底层绘图修饰
- matlab把构成图形的各个基本要素称为图形对象,产生每一个图形对象时,matlab会自动分配一个唯一的值用于表示这个对象,称为句柄。
- 对象间基本关系:计算机屏幕 → 图形窗口 → (用户菜单,用户控件,坐标轴)
- 坐标轴 → (曲线,曲面,文字,图像,光源,区域,方框)
- line函数普通用法和plot相同 h = line([-pi:0.01:pi], sin([-pi:0.01:pi]));
hl = line('XData', [-pi:0.01:pi], 'YData', sin([-pi:0.01:pi]),...
'LineWidth', 1, 'LineStyle', ':', 'Color', 'r');
hl = line('XData', [-pi:0.01:pi], 'YData', sin([-pi:0.01:pi]),...
'LineWidth', 1, 'LineStyle', ':', 'Color', 'r');
set(hl, 'LineWidth', 2, 'Marker', 'p', 'MarkerSize', 15);
- text对象返回一个句柄后。也可以用set来更改设置。修饰属性: Color,String, FontSize,Rotation。
底层坐标轴控制
- axes对象和axes函数
- 修饰:
- Box属性,
- GridLineStyle属性,网格的线型,默认是虚线
- Position属性
- Units属性,当该属性为normalized时,子窗口随父窗口变化而变化。
- XLabel、YLabel和ZLabel属性
- Xlim、Ylim和Zlim属性
ha = axes;
get(ha) %获得坐标轴属性
hf = figure;
ha = axes('Parent', hf, 'Unit', 'normalized', 'Position', [.1 .1 .6 .5]);
9 MATLAB Notebook使用简介
- 方便matlab代码直接移到word,方便写文档。
- 在Notebook中,需要运行的代码部分要设置为“输入单元”,使用绿色加粗Courier New字体显示;
- 定义输入单元,可以使用Notebook菜单,或者组合键“Alt+D”;
- 定义输入单元之后,选择Notebook菜单中的“Evaluate Cell”或者组合键“Ctrl+Enter”执行单元,输出直接在相应输入单元之后显示,使用蓝色Courier New字体显示。
- 自动初始化单元可以在打开Notebook时自动执行,这样可以快速恢复所需要的工作空间。
- 定义方式:选择需要定义的单元,选择Notebook菜单中的“Define AutoInit Cell”。
- 定义为自动初始化的单元使用蓝色加粗Courier New字体显示
10 MATLAB符号运算
- 符号计算基础
- 符号常量和符号变量
- 符号四则运算
- 符号表达式的化简
- 符号矩阵运算
- 符号函数
- 极限
- 微分
- 积分
- 符号级数
- 符号方程求解
- 代数方程
- 微分方程
a = sym('a'); %符号变量
syms a; %同上
c = sym('3'); %符号常量
f1 = '3 * x + 4';
class(f1) %得到类型为char
syms x
f2 = 3 * x + 4;
class(f2) %得到类型为sym
f3 = sym('3 * y + 4');
class(f3) %得到类型为sym
f4 = f1 + f2; %得到f4 = 6*x + 8
class(f4) %得到类型为sym
- 符号四则运算有 + - * / ^
符号表达式化简
- simplify
- simple用了很多规则来化简,都列了出来,包含simplify
符号表达式与数值的转化用
- sym 数值转化为符号
- eval 将符号变量转化为数值变量
符号表达式的分解展开合并
- factor因式分解
- expand因式展开
- collect合并同类项
syms a b x y;
f1 = a^3 - b^3;
factor(f1) %得到[ a - b, a^2 + a*b + b^2]
f2 = (3*x^2 + 8*y^2)*(-x^2 + 3*y);
expand(f2) %得到- 3*x^4 - 8*x^2*y^2 + 9*x^2*y + 24*y^3
f3 = 3*x^2 + 4*x^2 + 5*x^2*y;
collect(f3) %得到(5*y + 7)*x^2
符号矩阵
- 构建方式与数值矩阵一致
- 转置和行列式:transpose determ
- 其它使用在数值矩阵中的函数也可以直接用于符号矩阵
- 注意:
- 用transpose(A)的转置相当于AT
- 直接使用单引号‘的转置相当于A的共轭转置,即AH
符号函数
- 用符号函数计算得到的结果类型是sym,如果还需要数值用eval转换一下!
syms x
f1 = x^3 - 9;
subs(f1, 3) %用3来代替原来f1中符号的位置来计算
y = (sin(x + a) - sin(x - a)) / x;
limit(y, 0) %求极限,当x趋于零时,y的值
y2 = sqrt(1 + exp(x));
diff(y2) %求解差分
diff(y2, 2) %求解2阶导数
diff(y2, 3) %求解3阶导数
y3 = (3 - x^2)^3;
int(y3) %求解不定积分
y4 = abs(1 - x);
int(y4, 1, 2) %求解定积分
符号级数
- 符号级数求和symsum,泰勒级数taylor
syms n
f = 1/n^2;
s1 = symsum(f, n, 1, inf) %4个参数意义依次是:第一是通项,第二个规定哪个参数作为求和变量,第三第四参数表示在求和范围
% 泰勒展开
syms x
y = (1 + x + x^2)/(1 - x + x^2);
taylor(y,'order',6)
符号方程求解
- 符号代数方程和方程组solve
- 符号常微分方程dsolve,其中D3y表示与的三阶导数,Dy表示y的一阶导数。
% 方程组,可用=号形式,也可移项到等号同意一边,表示等于0
[x y] = solve('1/x^3 + 1/y^3 = 28', '1/x + 1/y -4', 'x, y')
% 微分方程
dsolve('Dy - (x^2 + y^2)/x^2/2', 'x')
参考《MATLAB基础视频》 作者:lskyp