MATLAB矩阵
MATLAB 矩阵及矩阵操作
数值数组(Numeric Array)和数组运算(Array Operations)始终是MATLAB 的核心内容。自MATLAB5.x 版起,由于其“面向对象”的特征,这种数值数组(以下简称为数组)成为了MATALB 最重要的一种内建数据类型(Built-in Data Type),而数组运算就是定义在这种数据结构上的方法(Method )。
本节系统阐述:一、二维数值数组的创建、寻访;数组运算和矩阵运算的区别;实现数组运算的基本函数;多项式的表达、创建和操作;常用标准数组生成函数和数组构作技法;高维数组的创建、寻访和操作;非数NaN 、“空”数组概念和应用;关系和逻辑操作。
顺便指出:(1)本章所涉内容和方法,不仅使用于数值数组,而且也将部分地延伸使用于在其他数据结构中。
一、 变量和数据
1 数据类型
MATLAB7.3定义了15种基本的数据类型
1.1 建立double 类型数据:例:(注:double 为系统默认数据类型)
a=3.3 a =
3.3000
方法一:whos 要查看的变量名 注:查看多个变量时各变量之间用空格分开,不能用逗号分开
例:查看上面定义的变量a whos a
Name Size Bytes Class a 1x1 8 double array Grand total is 1 element using 8 bytes
方法二:使用class 函数,函数调用常用格式: str = class(object) ——函数返回object 的类型 例:class(a) ans = double
方法三:使用isa 函数,函数调用常用格式: n = is(object,'类型') ——函数返回值为1,说明object 为第二个参数指定的类型,0表示不是。
isa(a,'char') 例:isa(a,'double')
ans = ans =
0 1
1.2建立其他数值类型数据的方法
● 使用single 、int_、uint_分别建立单精度、有符号整型、无符号整型的数据
例:
b=single(a)%建立单精度变量b b =
3.3000
whos a b %查看变量a b的详细信息 Name Size Bytes Class a 1x1 8 double array b 1x1 4 single array Grand total is 2 elements using 12 bytes
isa(b,'single') class(b) %获取变量b 的数据类型
ans = ans =
1 single
c=int8(a) %尝试把变量a 的值改为3.8,看结果有何变化,得出什么结论? c = 3
isa(c,'int8') class(c)%获取变量c 的数据类型
ans = ans =
1 int8
结论:a 的值改为3.8后变量c 的值变为4,说明在MATLAB 中将一个浮点型数据转换为整型数
据是遵循“四舍五入”的法则
2、数值
● 需了解MATLAB 表达方式的组成、类型
● 了解数组(array )、矩阵(matrix )、向量(vector)、标量(数字)(scalar)的概念和它
们之间的关系。
● 标量和向量是矩阵的特例,而矩阵是数组的特例。
● 复数(complex)和复数矩阵——实数矩阵是复数矩阵的特例,虚部为0
MATLAB 把复数作为一个整体处理,虚数单位用自定义变量i 或j 表示。 (1)复数标量
z=3.4+34i z =
3.4000 +34.0000i
z=3.4+34j z =
3.4000 +34.0000i
z=3.4+j34
??? Undefined function or variable 'j34'.
z=3.4+i34
??? Undefined function or variable 'i34'.
z=3.4+i*34 z=3.4+j*34 z = z = 3.4000 +34.0000i 3.4000 +34.0000i
结论:在创建复数(complex)和复数矩阵时,若虚部为常数,放在系统自定义变量i 或j 之前可省略星号(*),但若放在其后则不能省略 a=3.4;b=9; r=a+bj r=a+bi Usage: M = bj(Data,Orders); ??? Undefined function or M = bj(Data,Orders,Prop/Value pairs). variable 'bi'. r = []
r=a+jb
??? Undefined function or variable 'jb'. r=a+i*b r=complex(a,b) r = r = 3.4000 + 9.0000i 3.4000 + 9.0000i
结论:在创建复数(complex)和复数矩阵时,若虚部为变量,则与系统自定义变量i 或j 之间必须加星号(*),无论其在前还是在后。另:complex (a,b )可将实数矩阵a,b 构成复数矩阵a+b*i.
(2)复数矩阵——矩阵元素是复数 方法: 1)直接输入法
例:在MATLAB 环境下,用下面三条指令创建复数矩阵C 。 a=2.7358; b=33/79;
C=[1,2*a+i*b,b*sqrt(a);sin(pi/4),a+5*b,3.5+i] C =
1.0000 5.4716 + 0.4177i 0.6909 0.7071 4.8244 3.5000 + 1.0000i whos C
Name Size Bytes Class
C 2x3 96 double array (complex) Grand total is 6 elements using 96 bytes
!!!注意:复数矩阵单个元素所占的字节数为16,而实数矩阵单个元素所占的字节数为8 2)由实部和虚部间接创建 例:复数数组的另一种输入方式。 M_r=[1,2,3;4,5,6]
M_r =
1 2 3 4 5 6
M_i=[11,12,13;14,15,16] M_i =
11 12 13 14 15 16
则复数矩阵可由下面两种方式创建,必须保证上面两个矩阵大小是相同的
CN1=M_r+i*M_i
CN1 =
1.0000 +11.0000i 2.0000 +12.0000i 3.0000 +13.0000i 4.0000 +14.0000i 5.0000 +15.0000i 6.0000 +16.0000i CN2=complex(M_r,M_i) CN2 =
1.0000 +11.0000i 2.0000 +12.0000i 3.0000 +13.0000i 4.0000 +14.0000i 5.0000 +15.0000i 6.0000 +16.0000i (3)MATLAB 提供的复数和复数矩阵操作函数
复数Z =a +bi =re 直角坐标表示和极坐标表示之间转换的MATLAB 指令如下: real(z) z的实部a=rcosθ imag(z) z的虚部b=rsinθ abs(z) z的模r=√(a2+b2) angle(z) z的相角θ=arctg(b/a)
求其共轭的函数为:
j θ
conj(z) z的共轭a-bi
如果z 是复数矩阵,则上述函数是对矩阵里的每个元素做同样的操作。
二、MATLAB 矩阵(二维数组)的创建——共6种方法
1、直接输入矩阵元素法
对于一般较小的简单的矩阵,用户可以从键盘上直接输入一系列的元素生成矩阵。 规则:
⏹ 矩阵元素必须用[ ]括住
⏹ 矩阵元素必须用逗号或空格分隔
⏹ 在[ ]内矩阵的行与行之间必须 用分号(; )或Enter 键分隔 例:在M A T L A B 中创建矩阵 实现方法如下: A=[1 2 3;4 5 6]
A=[1,2,3;4,5,6]
⎡
3442⎤A=[1 2 3
4 5 6] ⎢6. 7-13⎥ ⎢⎥练习:在M A T L A B 中创建矩阵 ⎢66⎥⎣4⎦3⨯3
⎡123⎤
⎢456⎥⎣⎦
总结:如何获取一个已建立矩阵的信息?
调用M A T L A B 提供的函数——class(),size(),length(),ndims()
class(A)%类型
ans =
double
size(A)%大小 ans = 2 3
length(A)%长度
ans = 3
ndims(A)%维数 ans = 2
2、利用冒号表达式建立一个向量
冒号表达式可以产生一个行向量,一般格式是:e 1:e 2:e 3 其中e1为初始值,e2为步长缺省为1,e3为终止值。
注意:该方法产生的行向量的最后一个元素的值小于等于e3,并不一定是e3 例如:1:6:5 ans = 1
在MATLAB 中,还可以用l i n s p a c e 函数产生行向量。其调用格式为:linspace(a,b,n) 其中a 和b 是生成向量的第一个和最后一个元素,n 是元素总数。 显然,linspace(a,b,n)与a:(b-a)/(n-1):b等价。
例:要求在闭区间[0,2π ]上产生50个等距采样的一维数组。试用两种不同的指令实现。 法一:linspace 函数 linspace(0,2*pi,50);
法二:冒号表达式: 0 : 2*pi/(50-1) : 2*pi;
3、用matlab 函数创建矩阵
的调用格式相似,下面以产生零矩阵的zeros 函数为例进行说明。其调用格式是:
● zeros(m) 产生m ×m 零矩阵 ● zeros(m,n) 产生m ×n 零矩阵。
● zeros(size(A)) 产生与矩阵A 同样大小的零矩阵
例如:
zeros(2) %产生2×2零矩阵 zeros(2,3) %产生2×3零矩阵 ans = ans = 0 0 0 0 0 0 0 0 0 0
A = 2:5 A =
2 3 4 5
zeros(size(A)) %产生与矩阵A 同样大小的零矩阵 ans =
0 0 0 0
4、利用M 文件建立矩阵
例:创建和保存数组 AM的 MyMatrix.m 文件。
% MyMatrix.m Creation and preservation of matrix AM
AM=[101,102,103,104,105,106,107,108,109;... 201,202,203,204,205,206,207,208,209;... 301,302,303,304,305,306,307,308,309]; 以后创建矩阵A M 只需要运行:MyMatrix 指令即可。
5、把外部数据调入矩阵法
(1) 选择F i l e ——>I m p o r t D a t a 菜单操作,可打开任意类型的数据文件
(2) 用户能够通过load 命令,将MATLAB 外部数据文件中的内容调入到工作空间中创建矩阵,外部数据文件的扩展名为“.mat “
6、建立大矩阵
大矩阵可由方括号中的小矩阵建立起来。例如 A=[1 2 3;4 5 6;7 8 9] C=[A,eye(size(A)); ones(size(A)),A] A = C = 1 2 3 1 2 3 1 0 0 4 5 6 4 5 6 0 1 0 7 8 9 7 8 9 0 0 1 1 1 1 1 2 3 1 1 1 4 5 6 1 1 1 7 8 9
即矩阵的元素可以是矩阵,但必须保证同行的矩阵行数相同,同列的矩阵列数相同。
三、 矩阵(二维数组)元素的标识
1、“全下标”标识(row-column subscripts)
“全下标”标识法:即指出是“第几行,第几列”的元素。对于二维数组(矩阵)来说, “全下标”标识由两个下标组成:行下标,列下标。
格式:矩阵名(m , n )
2、“单下标”标识(linear indexing)
“单下标(L i n e a r I n d e x ) ”标识:就是“只用一个下标来指明元素在数组中的位置”。
“一维编号”:先设想把二维数组的所有列,按先左后右的次序、首尾相接排成“一维长列”;然后,自上往下对元素位置进行编号。 “单下标”与“全下标”的转换关系:
● 以(m ×n ) 的二维数组A 为例,若“全下标”元素位置是“第i 行,第j 列”,那么相应
的“单下标”为l =(j -1) ×m +i 。
M A T L A B 有两个指令可实现以上表示方法间的转换
● s u b 2i n d 据全下标换算出单下标。
● i n d 2s u b 据单下标换算出全下标
例:在MATLAB 中创建下列矩阵,并取出方框内的数组元素
A = [2.3 -4 1;5 9 2;6 2.5 3]%直接输入法创建矩阵 A =
2.3000 -4.0000 1.0000 5.0000 9.0000 2.0000 6.0000 2.5000 3.0000 A(1,1) %全下标访问2.3 A(1) %单下标访问2.3 ans = ans = 2.3000 2.3000
A(3,1) %全下标访问6 ans = 6
A(2,2) %全下标访问9 ans = 9
A(3) %单下标访问6 ans = 6
A(5) %单下标访问9 ans = 9
A(7) %单下标访问1 ans = 1
A(1,3) %全下标访问1 ans = 1
例:将全下标(3,1)转换为单下标 sub2ind(size(A),3,1)
ans = 3
例:将单下标7转换为全下标
[m,n]=ind2sub(size(A),7) m = 1 n = 3
3、“逻辑1”标识(logical Indexing)
所谓“逻辑1”标识 法是:通过与A 同样大小的逻辑数组L 中“逻辑值1”所在的位置,指出A 中元素的位置。
例1:找出数组A =
⎡-4-2024⎤
⎢-3-1135⎥中所有绝对值大于3的元素。 ⎣⎦
A=zeros(2,5); %预生成一个(2*5)全零数组
A(:)=-4:5 %运用“全元素”赋值法获得A A =
-4 -2 0 2 4 -3 -1 1 3 5
L=abs(A)>3 %产生与A 同维的“0-1”逻辑值数组 L =
1 0 0 0 1 0 0 0 0 1
islogical(L) %判断L 是否逻辑值数组。输出若为1,则是。 ans = 1
X=A(L) %把L 中逻辑值1对应的A 元素取出 X = -4 4 5
例:演示逻辑数组与一般双精度数值数组的关系和区别。(本例在上例基础上进行)。
(1)逻辑数组与双精度数组的相同之处
Num=[1,0,0,0,1;0,0,0,0,1]; %产生与L 数组外表完全相同的“双精度数组” N_L=Num==L %假如Num 与L 数值相等,则应得 1 。 N_L =
1 1 1 1 1 1 1 1 1 1
c_N=class(Num) %用class 指令检查Num 的类属 c_N = double
c_L=class(L) %用class 指令检查L 的类属 c_L = logical
whos Num L
Name Size Bytes Class L 2x5 10 logical array Num 2x5 80 double array Grand total is 20 elements using 90 bytes (2)逻辑数组与一般双精度数组的差别
islogical(Num) %检查Num 是否属于逻辑数组类 ans = 0
Y=A(Num) %试探Num 能否象L 一样具有标识作用
??? Subscript indices must either be real positive integers or logicals.
(2)逻辑数组的另外一种创建方法——logical()函数
LN = logical(Num) %将双精度数值数组转换为逻辑数组 LN =
1 0 0 0 1 0 0 0 0 1
islogical(LN) %检查L N 是否属于逻辑数组类 ans = 1
Z=A(LN) %试探LN 能否象L 一样具有标识作用 Z = -4 4 5
总结
1、逻辑数组的元素或是0或是1,但是元素或是0或是1的矩阵并不一定是逻辑矩阵。是一种特殊的数据类型。
2、逻辑数组具有标识作用,但是元素或是0或是1的数值矩阵不具有标识作用 3、逻辑数组只能通过logical()函数或逻辑、关系运算这两种方式获得。 4、可用class 、islogical 两个函数来判断一个数组是否逻辑数组。
l=find(A>=60) %返回的是A 中元素值大于等于60的元素的单下标号 A(l) %单下标访问
单下标和全下标之间的相互转换
[m n]=ind2sub(size(A),l) S=[m n]
sub2ind(size(A),m,n)
四、子矩阵的寻访和赋值
子矩阵寻访
1)“全下标”标识
m , n 为标量 (A c c e s s i n g S i n g l e E l e m e n t s ) A (m , n m , n 有一为冒号(:) (A c c e s s i n g M u l t i p l e E l e m e n t s ) m , n 为行向量 2)“单下标”标识 s 为标量 A (s ) s 为冒号(:) s 为向量、矩阵 3)“逻辑1”标识
子矩阵的赋值——实现对矩阵的修改
方法一:全下标
要修改已经定义矩阵A 语法:A(m,n)=B 注:
● m,n 可以是向量或标量
● A (:,:)=B ——全元素赋值
● 要求A(m,n)、B 两矩阵的大小必须是相同的,即B 大小必须是length(m)行,
length(n)列
方法二:单下标
要修改已定义矩阵A 语法:A(l)=B 注:
⏹ l 可以是一个矩阵、向量或标量 ⏹ A (:)=B ——全元素赋值
⏹ 要求A(s)、B 两矩阵的元素个数必须是相同的,B 可以是一个矩阵、向量或标量 ⏹
子数组寻访和赋值格式汇总表
不同寻访和赋值方式示例。在MATLAB 中创建下面的矩阵
clear 1) 如何获取矩阵的第3行; a= 1:8
A(3,:)
a =
1 2 3 4 5 6 7 8
ans =
1 2 3 4 5 6 7 8
A=[a;a;a;a;a;a;a;a]
2) 如何获取矩阵的第4列; A =
A(:,4) 1 2 3 4 5 6 7 8 ans = 1 2 3 4 5 6 7 8 4 1 2 3 4 5 6 7 8 4 1 2 3 4 5 6 7 8 4 1 2 3 4 5 6 7 8 4 1 2 3 4 5 6 7 8 4 1 2 3 4 5 6 7 8 4 1 2 3 4 5 6 7 8
4 4
3) 如何获取矩阵的第2到6行,3到7
列;
4) 如何获取矩阵的第1、2、7、8行,2、
A(2:6,3:7)
5、7列;
A([1 2 7 8],[2 5 7])
ans =
3 4 5 6 7 ans =
3 4 5 6 7 2 5 7 3 4 5 6 7 2 5 7 3 4 5 6 7 2 5 7 3 4 5 6 7
2 5 7
5) 如何实现矩阵第1列和第4列数据的交
换;
A(:,[4 2 3 1 5:8]) ans =
4 2 3 1 5 6 7 8 4 2 3 1 5 6 7 8 4 2 3 1 5 6 7 8 4 2 3 1 5 6 7 8 4 2 3 1 5 6 7 8 4 2 3 1 5 6 7 8 4 2 3 1 5 6 7 8 4 2 3 1 5 6 7 8
7) 如何获取矩阵单下标号为奇数的元素 A(1:2:64)
ans =
Columns 1 through 23
1 1 1 1 2 2 2 2 3 3 3 3 4 4 4 4 5 5 5 5 6 6 6
Columns 24 through 32
6 7 7 7 7 8 8 8 8
9) 如何将矩阵的第4列的元素全修改为
[24 6 8 10 12 14 16]; A(:,4)=2:2:16
A =
1 2 3 2 5 6 7 8 1 2 3 4 5 6 7 8 0 0 0 6 0 0 0 0 1 2 3 8 5 6 7 8 1 2 3 10 5 6 7 8 1 2 3 12 5 6 7 8 1 2 3 14 5 6 7 8 1 2 3 16 5 6 7 8
11) 如何删除矩阵的第2、5、7列; A(:,[2 5 7]) = [] A =
1 3 2 6 8 1 1 6 16 8 0 2 7 17 0
6) 如何获取矩阵按列的倒序排列矩阵 A(:,end:-1:1) ans =
8 7 6 5 4 3 2 1 8 7 6 5 4 3 2 1 8 7 6 5 4 3 2 1 8 7 6 5 4 3 2 1 8 7 6 5 4 3 2 1 8 7 6 5 4 3 2 1 8 7 6 5 4 3 2 1 8 7 6 5 4 3 2 1
8) 如何将矩阵的第3行的元素全修改为
0;
A(3,:)=zeros(1,8)
A =
1 2 3 4 5 6 7 8 1 2 3 4 5 6 7 8 0 0 0 0 0 0 0 0 1 2 3 4 5 6 7 8 1 2 3 4 5 6 7 8 1 2 3 4 5 6 7 8 1 2 3 4 5 6 7 8 1 2 3 4 5 6 7 8
10) 如何获取矩阵的第2到6行,3到7列
的元素改为1:25;
A(2:6,3:7)= 1:25 ——出错原因是全
下标寻访赋值必须保证赋值号两边矩阵大小相同
??? Subscripted assignment dimension mismatch.
A(2:6,3:7)= reshape(1:25,5,5) A =
1 2 3 2 5 6 7 8 1 2 1 6 11 16 21 8 0 0 2 7 12 17 22 0 1 2 3 8 13 18 23 8 1 2 4 9 14 19 24 8 1 2 5 10 15 20 25 8 1 2 3 14 5 6 7 8 1 2 3 16 5 6 7 8 1 3 8 18 8 1 4 9 19 8 1 5 10 20 8 1 3 14 6 8 1 3 16 6 8
12) 如何删除矩阵的第2、5、7行; A([2 5 7],:) = [] A =
1 3 2 6 8
0 2 7 17 0 1 3 8 18 8 1 5 10 20 8 1 3 16 6 8
例:不同赋值方式示例。
A=zeros(2,4) %创建(2 4) 的全零数组
A =
0 0 0 0 0 0 0 0
A(:)=1:8 %全元素赋值方式
A =
1 3 5 7 2 4 6 8
s=[2 3 5]; %产生单下标数组行数组 A(s) %由“单下标行数组”寻访产生A 元素组成的行数组
ans =
2 3 5
Sa=[10 20 30]' %Sa是长度为3的“列数组”
Sa = 10 20 30
A(s)=Sa %单下标方式赋值 A =
1 20 30 7 10 4 6 8
A(:,[2 3])=ones(2) %双下标赋值方式:把A 的第2、3列元素全赋为1
A =
1 1 1 7 10 1 1 8
五、数组运算和矩阵运算 概述
算术运算(Arithmetic Operators) 关系运算(Relational Operators) 逻辑运算(Logical Operators)
表 数组运算和矩阵运算指令对照汇总
算术运算
1两种不同转置的比较
共轭转置(' )——矩阵运算,除了行列互换外,还要对矩阵求共轭 非共轭转置(.' )——数组运算,只进行行列互换外
clear;B=zeros(2,3); B(:)=1:6; %全元素赋值法
1) 对实数矩阵的操作
x=B.' %非共轭转置
y=B' %共轭转置
x =
1 2 3 4 5 6
y =
1 2 3 4 5 6
?? 问题:如何判断两个矩阵是否相同——调用isequal()函数
isequal(x,y) %判断是否x==y,结果为1表示相等,为0表示不等
ans = 1
法二:调用any()函数
any(x-y) ans = 0 0
结论:对于实数矩阵来说,共轭转置(' )与非共轭转置(.' )无区别
2) 对复数矩阵的操作
A=B*(1+i) %运用标量与数组乘产生复数矩阵
A =
1.0000 + 1.0000i 3.0000 + 3.0000i 5.0000 + 5.0000i 2.0000 + 2.0000i 4.0000 + 4.0000i 6.0000 + 6.0000i
A_A=A.' %数组转置,即非共轭转置
A_M=A' %矩阵转置,即共轭转置
A_A =
1.0000 + 1.0000i 2.0000 + 2.0000i 3.0000 + 3.0000i 4.0000 + 4.0000i 5.0000 + 5.0000i 6.0000 + 6.0000i
A1 = conj(A') A1 =
1.0000 + 1.0000i 2.0000 + 2.0000i 3.0000 + 3.0000i 4.0000 + 4.0000i 5.0000 + 5.0000i 6.0000 + 6.0000i
A_M =
1.0000 - 1.0000i 2.0000 - 2.0000i 3.0000 - 3.0000i 4.0000 - 4.0000i 5.0000 - 5.0000i 6.0000 - 6.0000i
?? 问题:能不能用isequal()函数比较复数矩阵x2,x3是否相同;大小呢?原因? isequal(A_A,A_M) isequal(A_A,A1) ans = ans = 0 1
说明可以用isequal()函数比较复数矩阵是否相同,但一定不能去比较复数矩阵的大小,因为复数没有大小的概念.
例如已知A_A、A_M不相同,根据我们的认识,它们应该要不满足A_A>A_M,要不满足A_A A_M A_A
2、标量和数组(矩阵)的运算
● 赋值
D=zeros(2,3);%创建2X3的全0矩阵 s=2.5;%创建标量变量s D=s %将变量s 赋给变量D D =
2.5000
如果要实现将一个标量的值赋给矩阵里的每个元素,应使用全元素赋值法,即: D=zeros(2,3);%重新创建2X3的全0矩阵 D(:)=s %全元素赋值法 D =
2.5000 2.5000 2.5000 2.5000 2.5000 2.5000
● 运算(算术、关系、逻辑) 已知矩阵A
创建矩阵
A=[1 2 1;2 2 3;1 3 3]
⎡121⎤
⎥A =⎢223⎢⎥
⎢⎣133⎥⎦
A =
1 2 1 2 2 3 1 3 3
A+s %加法 ans =
3.5000 4.5000 3.5000 4.5000 4.5000 5.5000 3.5000 5.5000 5.5000
A*2 %乘法 ans =
2 4 2 4 4 6 2 6 6
考虑计算s+A,2*A——结果肯定不变
算术运算的重难点——除法(注:把操作数都是矩阵的情况也包括在内) 右除/ ——除数在运算符右边,A/B等价于
A B
左除\ ——除数在运算符左边,A\B等价于B
A
⎡b ⎤ ⎢A ⎥⇔A \b ⎣⎦
在线性代数中我们要求解线性方程组Ax =b 则x =A -1b
线性方程组xA
b ⎤=b 的解为x =bA -1⎡
⎢⎥⇔x =b /A
⎣A ⎦
2\A %左除 ans =
0.5000 1.0000 0.5000 1.0000 1.0000 1.5000 0.5000 1.5000 1.5000
A/2 %右除 ans =
0.5000 1.0000 0.5000 1.0000 1.0000 1.5000 0.5000 1.5000 1.5000
2/A
??? Error using ==> mrdivide Matrix dimensions must agree.
A\2
?? 问题:为什么,如何完成让一个标量去处以数组里的每个元素?——数组运算
2./A A.\2 ans = ans = 2.0000 1.0000 2.0000 2.0000 1.0000 2.0000 1.0000 1.0000 0.6667 1.0000 1.0000 0.6667 2.0000 0.6667 0.6667 2.0000 0.6667 0.6667 问题:
如何实现2÷A 的矩阵相除——2*inv (A )
函数inv(A)——求方阵A 的逆矩阵
2*inv(A) ans =
1.2000 1.2000 -1.6000 1.2000 -0.8000 0.4000 -1.6000 0.4000 0.8000
3、数组(矩阵)和数组(矩阵)的运算 已知矩阵A 、B
⎡121⎤⎡123⎤
⎥⎢⎥A =⎢223 B =456
⎢⎥⎢⎥⎢⎢⎣133⎥⎦⎣789⎥⎦
A=[1 2 1;2 2 3;1 3 3] A =
1 2 1 2 2 3 1 3 3
B=[1 2 3;4 5 6;7 8 9]
B =
1 2 3 4 5 6 7 8 9
A*B ans =
16 20 24 31 38 45 34 41 48
A.*B ans =
1 4 3 8 10 18 7 24 27 20 38
A*B(:,2) ans =
41
A.*B(:,2)
??? Error using ==> times
Matrix dimensions must agree.
A\B %左除,等价于inv(A)*B ans =
-2.6000 -2.2000 -1.8000 0.4000 0.8000 1.2000 2.8000 2.6000 2.4000
B/A %右除、等价于B*inv(A) ans =
-0.6000 0.4000 0.8000 0.6000 1.6000 0.2000 1.8000 2.8000 -0.4000
注意:参与数组运算的数组的大小必须是相同的
inv(A)*B ans =
-2.6000 -2.2000 -1.8000 0.4000 0.8000 1.2000 2.8000 2.6000 2.4000 B*inv(A) ans =
-0.6000 0.4000 0.8000 0.6000 1.6000 0.2000 1.8000 2.8000 -0.4000
A*inv(B)
Warning: Matrix is close to singular or badly scaled.
Results may be inaccurate. RCOND = 1.541976e-018. ans =
1.0e+016 *
0.9007 -1.8014 0.9007 -0.4504 0.9007 -0.4504 0.9007 -1.8014 0.9007
A/B %等价于A*inv(B)
Warning: Matrix is singular to working precision. ans =
NaN -Inf Inf NaN Inf -Inf NaN -Inf Inf
singular:奇[异]矩阵的; 新变量系数矩阵的; 行列式有等于零的特性的
det(A) det(B) %求方阵行列式的值调用det()函
ans = 数
-5 ans =
B\A %等价于inv(A)*B
Warning: Matrix is close to singular or badly scaled.
Results may be inaccurate. RCOND = 1.541976e-018. ans =
1.0e+016 *
0.9007 -0.4504 0.9007 -1.8014 0.9007 -1.8014 0.9007 -0.4504 0.9007
inv(B)*A
Warning: Matrix is close to singular or badly scaled.
Results may be inaccurate. RCOND = 1.541976e-018. ans =
1.0e+016 *
0.9007 -0.4504 0.9007 -1.8014 0.9007 -1.8014 0.9007 -0.4504 0.9007
B([2 3],:) = [] %删除矩阵的第二、三行 B =
1 2 3
考虑再去执行上面的除法运算,结果如何? 这时候我们应该如何再将B 的大小修改为3X3? B(2,:) = [2 5 1] B(3,:) = [6 1 9]
B([2 3],:) = [2 5 1;6 1 9]
练习删除B 的第二、三列,然后在把其扩充为4X4的矩阵
4、关系和逻辑运算——数组运算
关系逻辑函数
关系操作
【*例】关系运算示例。
A=1:9,B=10-A,r0=(A
1 2 3 4 5 6 7 8 9 B =
9 8 7 6 5 4 3 2 1 r0 =
1 1 1 0 0 0 0 0 0 r1 =
0 0 0 0 1 0 0 0 0
逻辑操作
【*例】逻辑操作示例。
A=1:9,L1=~(A>5) %判断A 中,哪些元素不大于5 L2=(A>3)&(A
1 2 3 4 5 6 7 8 9 L1 =
1 1 1 1 1 0 0 0 0 L2 =
0 0 0 1 1 1 0 0 0
六、数组操作函数汇总
【*例 】diag 与reshape 的使用演示。 a=-4:4 %产生一维数组 A=reshape(a,3,3) %把一维数组a 重排成(3 3) 的二维数组 a =
-4 -3 -2 -1 0 1 2 3 4 A =
-4 -1 2 -3 0 3 -2 1 4
a1=diag(A,1) %取A 阵“第一上对角线”的元素 a1 = -1 3
A1=diag(a1,-1) %产生以a1数组元素为“第一下对角线”元素的二维数组 A1 =
0 0 0 -1 0 0 0 3 0
【*例】数组转置、对称交换和旋转操作后果的对照比较。 A -3 0 3 A = -4 -1 2 -4 -1 2 fliplr(A) %左右对称交换 -3 0 3 ans = -2 1 4 2 -1 -4 A.' %转置 3 0 -3 ans = 4 1 -2 -4 -3 -2 -1 0 1 rot90(A) %逆时针旋转90度 2 3 4 ans = flipud(A) %上下对称交换 2 3 4 ans = -1 0 1 -2 1 4 -4 -3 -2
【*例】演示Kronecker 乘法不具备“可交换规律”。
ans = B=eye(2) %产生(2⨯2) 单位 1 3 0 0 阵 2 4 0 0 C=reshape(1:4,2,2) %利用重组操作 0 0 1 3 产生(2⨯2) 矩阵 0 0 2 4 B = kron(C,B)
1 0 ans = 0 1 1 0 3 0 C = 0 1 0 3 1 3 2 0 4 0 2 4
kron(B,C) 0 2 0 4
七、数组构作技法综合
例:数组的扩展。
(1)数组的赋值扩展法
A=reshape(1:9,3,3) %创建(3⨯3) 数组A
A =
1 4 7
2 5 8
3 6 9
A(:,6)=222 %标量对子数组赋值,并扩展A(5,5)=111 %扩展为(5⨯5) 数组。扩展
部分除(5,5)元素为111外,其余均为0。 为(5⨯6) 数组。
A = A =
1 4 7 0 0 1 4 7 0 0 222
2 5 8 0 0 2 5 8 0 0 222
3 6 9 0 0 3 6 9 0 0 222
0 0 0 0 0 0 0 0 0 0 222
0 0 0 0 111 0 0 0 0 111 222
(2)多次寻访扩展法
AA=A(:,[1:6,1:6]) %相当于指令repmat(A,1,2),读者可以试试。
AA =
1 4 7 0 0 222 1 4 7 0 0 222
2 5 8 0 0 222 2 5 8 0 0 222
3 6 9 0 0 222 3 6 9 0 0 222
0 0 0 0 0 222 0 0 0 0 0 222
0 0 0 0 111 222 0 0 0 0 111 222
(3)合成扩展法
B=ones(2,6) %创建(2⨯6) 全1数组
B =
1 1 1 1 1 1
1 1 1 1 1 1
AB_r=[A;B] %行数扩展合成
AB_r =
1 4 7 0 0 222
2 5 8 0 0 222
3 6 9 0 0 222
0 0 0 0 0 222
0 0 0 0 111 222
1 1 1 1 1 1
1 1 1 1 1 1
AB_c=[A,B(:,1:5)'] %列数扩展合成
AB_c =
1 4 7 0 0 222 1 1 2 5 8 0 0 222 1 1
3 6 9 0 0 222 1 1
0 0 0 0 0 222 1 1
0 0 0 0 111 222 1 1
【*例】提取子数组,合成新数组。
A %重显A 数组
A =
1 4 7 0 0 222
2 5 8 0 0 222
3 6 9 0 0 222
0 0 0 0 0 222
0 0 0 0 111 222
AB_BA=triu(A,1)+tril(A,-1) %利用操作函数,使主对角元素为全0
AB_BA =
0 4 7 0 0 222
2 0 8 0 0 222
3 6 0 0 0 222
0 0 0 0 0 222
0 0 0 0 0 222
AB1=[A(1:2,end:-1:1);B(1,:)] %灵活合成
AB1 =
222 0 0 7 4 1
222 0 0 8 5 2
1 1 1 1 1 1
【*例】单下标寻访和reshape 指令演示。
clear %清除内存变量
A=reshape(1:16,2,8) %变一维数组成(2⨯8) 数组
A =
1 3 5 7 9 11 13 15
2 4 6 8 10 12 14 16
reshape(A,4,4) %变(2⨯8) 数组为(4⨯4) 数组
ans =
1 5 9 13
2 6 10 14
3 7 11 15
4 8 12 16
s=[1 3 6 8 9 11 14 16]; %定义“单下标”数组
A(s)=0 %利用“单下标”数组对A 的元素重新赋值
A =
0 0 5 7 0 0 13 15
2 4 0 0 10 12 0 0
【*例】“对列(或行)同加一个数”三种的操作方法。
clear,A=reshape(1:9,3,3)
A =
1 4 7
2 5 8
3 6 9
b=[1 2 3];A_b1=A-b([1 1 1],:) %使A 的第1,2,3行分别减b 向量[1 2 3] A_b1 =
0 2 4
1 3 5
2 4 6
A_b2=A-repmat(b,3,1)
A_b2 =
0 2 4
1 3 5
2 4 6
A_b3=[A(:,1)-b(1),A(:,2)-b(2),A(:,3)-b(3)]
A_b3 =
0 2 4
1 3 5
2 4 6
【*例】逻辑函数的运用示例。
randn('state',1),R=randn(3,6) %创建正态随机阵
R =
0.8644 0.8735 -1.1027 0.1684 -0.5523 -0.6149
0.0942 -0.4380 0.3962 -1.9654 -0.8197 -0.2546
-0.8519 -0.4297 -0.9649 -0.7443 1.1091 -0.2698
L=abs(R)1.5 %不等式条件运算,结果给出逻辑数组
L =
0 0 0 1 0 0
1 1 1 1 0 1
0 1 0 0 0 1
R(L)=0 %“逻辑1”对应的元素赋0值。
R =
0.8644 0.8735 -1.1027 0 -0.5523 -0.6149
0 0 0 0 -0.8197 0
-0.8519 0 -0.9649 -0.7443 1.1091 0
s=(find(R==0))' %利用find 获得符合关系等式条件的元素“单下标” s =
2 5 6 8 10 11 17 18
R(s)=111 %利用“单下标”定位赋值
R =
0.8644 0.8735 -1.1027 111.0000 -0.5523 -0.6149
111.0000 111.0000 111.0000 111.0000 -0.8197 111.0000
-0.8519 111.0000 -0.9649 -0.7443 1.1091 111.0000
[ii,jj]=find(R
3 1 3 3 1 2 1
1 3 3 4 5 5 6
八、“非数”和“空”数组
非数NaN
例:非数的产生和性质演示。
(1)非数的产生
a=0/0,b=0*log(0),c=inf-inf
Warning: Divide by zero.
NaN
Warning: Log of zero.
b =
NaN
c =
NaN
(2)非数的传递性
0*a,sin(a)
ans =
NaN
ans =
NaN
(3)非数的不可比较性
a==nan %该指令想计算“a 等于非数吗?”。但不能给出正确的判断结果。 ans =
(4)非数不能进行关系运算
a~=nan %该指令“a 不是非数吗?”,也不可能给出正确的判断结果。
a==b %两个非数不存在“等”与“不等”的概念
b>c %两个非数不能比较大小
ans =
1
ans =
ans =
(5)非数的属性判断
class(a) %数据类型归属
isnan(a) %该指令是唯一能正确判断非数的指令。
ans =
double
ans =
1
【*例】非数元素的寻访
%创建带非数的二维数组
rand('state',0) %将随机发生器置0。目的是使读者便于把自己运算结果与本书对照。 R=rand(2,5);R(1,5)=NaN;R(2,3)=NaN
R =
0.9501 0.6068 0.8913 0.4565 NaN
0.2311 0.4860 NaN 0.0185 0.4447
isnan(R) %对数组元素是否非数进行判断
ans =
0 0 0 0 1
0 0 1 0 0
%找出非数元素的位置标识
Linear_index=find(isnan(R)) %非数的“单下标”标识
[r_index,c_index]=ind2sub(size(R),Linear_index); %转换成“全下标”标识 disp('r_index c_index'),disp([r_index c_index])
Linear_index =
6
9
r_index c_index
2 3
0 5
“空”数组
“空”数组([])是MATLAB 为操作和表述需要而专门设计的一种数组。某维长度为0或若干维长度均为0的数组都是“空”数组。
“空”数组的功用:
在没有“空”数组参与的运算时,计算结果中的“空”可以合理地解释“所得结果的含义”; 运用“空”数组对其他非空数组赋值,可以改变数组的大小,但不能改变数组的维数。 例:关于“空”数组的算例。
(1)创建“空”数组的几种方法
a=[],b=ones(2,0),c=zeros(2,0),d=eye(2,0),f=rand(2,3,0,4)
a =
[]
b =
Empty matrix: 2-by-0
c =
Empty matrix: 2-by-0
d =
Empty matrix: 2-by-0
f =
Empty array: 2-by-3-by-0-by-4
(2)“空”数组的属性
class(a) %“空”的数据类别
ans =
double
isnumeric(a) %是数值数组类吗
ans =
1
isempty(a) %唯一可正确判断数组是否“空”的指令
ans =
1
which a %变量a 是什么
ndims(a) %数组a 的维数
size(a) %a数组的大小
a is a variable.
ans =
2
ans =
0 0
(3)“空”数组不具备一般的传递性
b_c1=b.*c %两个空阵的点乘
b_c2=b'*c %矩阵乘一。注意:生成矩阵为0-by-0,故“空”。 b_c3=b*c' %矩阵乘二。注意:生成矩阵为2-by-2。 b_c1 =
Empty matrix: 2-by-0
b_c2 =
[]
b_c3 =
0 0
0 0
(4)“空”数组的比较要谨慎
a==b %结果解释不合理
??? Error using ==> eq
Matrix dimensions must agree.
b==c %结果可合理解释为“无法比较”
ans =
Empty matrix: 2-by-0
c>d %结果可合理解释“无法比较”
ans =
Empty matrix: 2-by-0
a==0 %结果可解释为“不等于”
ans =
[]
a~=0 %结果解释为“是不等”
ans =
[]
(5)没有“空”数组参与运算时,结果中的“空”有合理的解释 A=reshape(-4:5,2,5) %创建一个数值数组A
A =
-4 -2 0 2 4
-3 -1 1 3 5
L2=A>10 %检查A 中大于10的元素位置
L2 =
0 0 0 0 0
0 0 0 0 0
find(L2) %找出L2逻辑数组中非0元素的“单下标”标识。 ans =
Empty matrix: 0-by-1
结果表示矩阵中没有满足条件的元素
(6)“空”数组用于子数组的删除和大数组的维数收缩
A(:,[2,4])=[] %删除A 的第二、四列
A =
-4 0 4
-3 1 5