matlab笔记

显示中文帮助的方法

预设→常规→帮助→在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);

matlab笔记_第1张图片

% 上面是使用了每列进行绘图,这样绘制了很多条曲线。
% 如果想要使用每一行来绘图,
% 那么需要将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);

matlab笔记_第2张图片

% 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);
matlab笔记_第3张图片

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

你可能感兴趣的:(matlab笔记)