监控摄像头网
sxt.afzhan.com仿松下宽动态枪机
:李殷杰,:
3.1 矩阵的生成
1)直接输入 2)函数生成 3)文本文件
? 简单数组
MATLAB的运算事实上是以数组 (array) 及矩阵 (matrix) 方式在做运算,而这二者在MATLAB的基本运算性质不同,数组强调元素对元素的运算,而矩阵则采用线性代数的运算方式。
宣告一变数为数组或是矩阵时,如果是要个别键入元素,须用中括号[ ] 将元素置于其中。数组为一维元素所构成,而矩阵为多维元素所组成,例如
» x=[1 2 3 4 5 6 7 8] ; %一维 1x8 数组
» x = [1 2 3 4 5 6 7 8; 4 5 6 7 8 9 10 11] ;
% 二维 2x8 矩阵,以“;”或回车分隔各行的元素,以“,”或空格分隔各列的元素
» x = [1 2 3 4 5 6 7 8 % 二维 2x8 矩阵,各列的元素分二行键入
4 5 6 7 8 9 10 11] ;
» x(3) % x的第三个元素
» x([1 2 5]) % x的*、二、五个元素
» x(1:5) % x的第前五个元素
ans = 1 4 2 5 3
» x(10:end) % x的第十个元素后的元素
ans = 8 6 9 7 10 8 11
» x(10:-1:2) % x的第十个元素和第二个元素的倒排
ans = 8 5 7 4 6 3 5 2 4
» x(find(x>5)) % x中大于5的元素
» x(4)=100 %给x的第四个元素重新给值
» x(3)=[] % 删除第三个元素
» x(16)=1 % 加入第十六个元素
? 建立数组(向量)
上面的方法只适用于元素不多的情况,但是当元素很多的时候,则须采用以下的方式:
» x=(0:0.02:1); % 以:起始值=0、增量值=0.02、终止值=1的矩阵(用“:”生成)
» x=linspace(0,1,100);
% 利用linspace,以区隔起始值=0终止值=1之间的元素数目=100(线性等分向量)
»a=[] %空矩阵
» zeros(2,2) %全为0的矩阵
» ones(3,3) %全为1的矩阵
» rand(2,4); % 随机矩阵
»a=1:7, b=1:0.2:5; %更直接的方式
»c=[b a]; %可利用先前建立的数组 a 及数组 b ,组成新数组
» a=1:1:10;
» b=0.1:0.1:1;
» a+b*I %复数数组
? 子矩阵
通过一个矩阵产生另一个矩阵的方法(上面已经有例子)
假如一个矩阵A
则 A(m1:m2 ,n1:n2)
3.2 矩阵的运算
? 经典的算术运算符。
运算符 MATLAB表达式
加 + a+b
减 - a-b
乘 * a*b
除 / 或 \ a/b或a\b
幂 ^ a^b
» a=1:1:10;
» b=0:10:90;
» a+b
» a.*b %注意这里a后加了个“.”,表示数组相乘, 是元素对元素的乘积
» a*b %表示矩阵相乘, 要求矩阵a的列数与矩阵b的行数一致
» a/b %矩阵右除 inv(a)*b
» a\b %矩阵左除 a*inv(b)
» a./b %数组右除,数组中对应元素相除, a(i,j)/b(i,j)
» a.\b %数组左除,数组中对应元素相除 b(i,j)/a(i,j)
» a^b %矩阵乘方,涉及到特征值和特征向量的求解。
» a.^b %数组乘方,a和b中对应元素的乘方,即a(i,j)的b(i,j)次方。
说明:在这里特别要注意一下有没有加点“.”之间的区别,这些算术运算符所运算的两个阵列是否需要长度一致。
? 矩阵转置运算
通过在矩阵变量后加’ 的方法来表示转置运算
» a=1:1:10;
» b=0:10:90;
» a'
» c=a+b*i;
» c'
3.3 矩阵函数
? MATLAB常用数学函数
基本数学函数一般都可以作为矩阵函数。如三角函数、指数对数函数等。
» a=1:1:10;
» b=0:10:90;
» sin(a)
» exp(b)
» sign(a)
» mean(b)
? 求矩阵的长度的函数
» A=[10, 2, 12; 34, 2, 4; 98, 34, 6];
» size(A) % 矩阵A的行列大小 3*3
» length(A) % 返回size(A) 中的zui大值
? 矩阵的几种基本变换操作
1) 通过在矩阵变量后加’的方法来表示转置运算
» A=[10,2,12;34,2,4;98,34,6];
» A'
2) 矩阵求逆 inv(A): 返回矩阵a的逆阵。
» A=[1 2 3; 4 5 6; 7 8 9];
» inv(A)
3) 矩阵求伪逆pinv(A):
» A=[1 2 3; 4 5 6; 7 8 0; 2 5 8]; %3个未知量的4个方程
» pinv(A)
4) 矩阵翻转:
左右反转:矩阵关于垂直轴沿左右方向进行列维翻转
fliplr(A)
» A=[1 4; 2 5; 3 6];
» fliplr(A)
上下反转:矩阵关于水平轴沿上下左右方向进行列维翻转
flipud(A)
» A=[1 4; 2 5; 3 6];
» flipud(A)
5) 旋转90度
rot90(A)
例: » A=[1 4; 2 5; 3 6];
» rot90(A)
6) 矩阵的特征值
[U,V]=eig(A): 返回方阵A所有特征值组成的矩阵U和特征向量组成的矩阵V
例: » A=[6 12 19; -9 –20 –33; 4 9 15];
» [U,V]=eig(A)
7) 取出上三角和下三角
triu(A) : 取上三角阵
tril(A) :取下三角阵
[L,U]=lu(A):作LU分解(Gauss消去法),L为主对角线元素都为1的上三角矩阵,U为一个下三角矩阵
例:» A=[1 5 2; 3 4 6; 5 3 2];
» triu(A)
» tril(A)
» [L,U]=lu(A)
8) 正交分解:QR分解,Q为正交矩阵,R为上三角矩阵
[Q,R]=qr(A)
例: » A=[1 2; 5 7; 7 3; 9 1];
» [Q,R]=qr(A)
9) 奇异值分解: [U,S,V]=svd(A),矩阵U和V是正交矩阵,S为A的奇异值矩阵。
例: » A=[9 4; 6 8; 2 7];
» [U,S,V]=svd(A)
10) 求矩阵的范数
norm(A,1) 计算矩阵A的1范数
norm(A,2) 计算矩阵A的2范数
norm(A,inf) 计算矩阵A的无穷范数
例:» A=rand(3);
» norm(A,1)
» norm(A,2)
» norm(A,inf)
11) 求矩阵的行列式的值 det(A)
例: » A=[1 2 3; 4 5 6; 7 8 9]
» det(A)
3.4 基本二维绘图命令
MATLAB不但擅长于矩阵相关的数值运算,也适合用在各种科学可视化(Scientific visualization)。下面介绍MATLAB基本二维和三维的各项绘图命令,包含一维曲线及二维曲面的绘制、打印及保存。
? plot是绘制一维曲线的基本函数,但在使用此函数之前,我们需先定义曲线上每一点的x及y坐标。下例可画出一条正弦曲线:
» x=linspace(0, 2*pi, 100); % 100个点的x坐标
» y=sin(x); % 对应的y坐标
» plot(x,y);
? 若要画出多条曲线,只需将坐标对依次放入plot函数即可:
» plot(x, sin(x), x, cos(x));
? 若要改变颜色,在坐标对后面加上相关字符串即可:
» plot(x, sin(x), 'c', x, cos(x), 'g');
? 若要同时改变颜色及线型(Line style),也是在坐标对后面加上相关字符串即可:
» plot(x, sin(x), 'co', x, cos(x), 'g*');
plot绘图函数的参数
字符 颜色 字符 图线型态
黄色 . 点
k 黑色 o 圆
w 白色 x x
b 蓝色 + +
g 绿色 * *
r 红色 - 实线
c 亮青色 : 点线
m 锰紫色 -. 点虚线
-- 虚线
? 图形完成后,我们可用axis([xmin,xmax,ymin,ymax])函数来调整坐标轴的范围:
» axis([0, 6, -1.2, 1.2]);
? MATLAB也可对图形加上各种注解与处理:
» xlabel('Input Value'); % x轴注解
» ylabel('Function Value'); % y轴注解
» title('Two Trigonometric Functions'); % 图形标题
» legend('y = sin(x)','y = cos(x)'); % 图形注解
» grid on; % 显示格线
? 用subplot来同时画出数个小图形于同一个窗口之中:
» subplot(2,2,1); plot(x, sin(x)); %把窗口分成2*2个子窗口,在*个子窗口绘图
» subplot(2,2,2); plot(x, cos(x)); %在第二个子窗口绘图
» subplot(2,2,3); plot(x, sinh(x)); %在第三个子窗口绘图
» subplot(2,2,4); plot(x, cosh(x)); %在第四个子窗口绘图
? MATLAB还有其他各种二维绘图函数,以适合不同的应用,详见下表。
Bar 长条图
Errorbar 图形加上误差范围
Fplot 较的函数图形
Polar 极坐标图
Hist 累计图
Rose 极坐标累计图
Stairs 阶梯图
Stem 针状图
Fill 实心图
Feather 羽毛图
Compass 罗盘图
Quiver 向量场图
以下我们针对每个函数举例。
? 当数据点数量不多时,条形图是很适合的表示方式:
» close all; % 关闭所有的图形窗口
» x=1:10;
» y=rand(size(x));
» bar(x,y);
? 如果已知数据的误差量,就可用errorbar来表示。下例以单位标准差来做数据的误差量:
» x = linspace(0,2*pi,30);
» y = sin(x);
» e = std(y)*ones(size(x));
» errorbar(x,y,e)
? 对于变化剧烈的函数,可用fplot来进行较的绘图,会对剧烈变化处进行较密集的取样,如下例:
» fplot('sin(1/x)', [0.02 0.2]); % [0.02 0.2]是绘图范围
? 若要产生极坐标图形,可用polar:
» theta=linspace(0, 2*pi);
» r=cos(4*theta);
» polar(theta, r);
? 对于大量的数据,我们可用hist来显示数据的分布情况和统计特性。下面几个命令可用来验证randn产生的高斯随随机数分布:
» x=randn(5000, 1); % 产生5000个 m=0,s=1 的高斯随机数
» hist(x,20); % 20代表长条的个数
? rose和hist很接近,只不过是将数据大小视为角度,数据个数视为距离,并用极坐标绘制表示:
» x=randn(1000, 1);
» rose(x);
? stairs可画出阶梯图:
» x=linspace(0,10,50);
» y= sin(x).*exp(-x/3);
» stairs(x,y);
? stems可产生针状图,常被用来绘制数位讯号:
» x=linspace(0,10,50);
» y=sin(x).*exp(-x/3);
» stems(x,y);
? fill将数据点视为多边行顶点,并将此多边行涂上颜色:
» x=linspace(0,10,50);
» y=sin(x).*exp(-x/3);
» fill(x,y,'b'); % 'b'为蓝色
? feather将每一个数据点视复数,并以箭号画出:
» theta=linspace(0, 2*pi, 20);
» z = cos(theta)+i*sin(theta);
» feather(z);
? compass和feather很接近,只是每个箭号的起点都在圆点:
» theta=linspace(0, 2*pi, 20);
» z = cos(theta)+i*sin(theta);
» compass(z);










