MATLAB矩阵.docx

上传人:b****6 文档编号:7922133 上传时间:2023-01-27 格式:DOCX 页数:49 大小:205.25KB
下载 相关 举报
MATLAB矩阵.docx_第1页
第1页 / 共49页
MATLAB矩阵.docx_第2页
第2页 / 共49页
MATLAB矩阵.docx_第3页
第3页 / 共49页
MATLAB矩阵.docx_第4页
第4页 / 共49页
MATLAB矩阵.docx_第5页
第5页 / 共49页
点击查看更多>>
下载资源
资源描述

MATLAB矩阵.docx

《MATLAB矩阵.docx》由会员分享,可在线阅读,更多相关《MATLAB矩阵.docx(49页珍藏版)》请在冰豆网上搜索。

MATLAB矩阵.docx

MATLAB矩阵

MATLAB矩阵及矩阵操作

数值数组(NumericArray)和数组运算(ArrayOperations)始终是MATLAB的核心内容。

自MATLAB5.x版起,由于其“面向对象”的特征,这种数值数组(以下简称为数组)成为了MATALB最重要的一种内建数据类型(Built-inDataType),而数组运算就是定义在这种数据结构上的方法(Method)。

本节系统阐述:

一、二维数值数组的创建、寻访;数组运算和矩阵运算的区别;实现数组运算的基本函数;多项式的表达、创建和操作;常用标准数组生成函数和数组构作技法;高维数组的创建、寻访和操作;非数NaN、“空”数组概念和应用;关系和逻辑操作。

顺便指出:

(1)本章所涉内容和方法,不仅使用于数值数组,而且也将部分地延伸使用于在其他数据结构中。

一、变量和数据

1数据类型

MATLAB7.3定义了15种基本的数据类型

1.1建立double类型数据:

例:

(注:

double为系统默认数据类型)

a=3.3

a=

3.3000

小结查看数据类型方法

方法一:

whos要查看的变量名注:

查看多个变量时各变量之间用空格分开,不能用逗号分开

例:

查看上面定义的变量a

whosa

NameSizeBytesClass

a1x18doublearray

Grandtotalis1elementusing8bytes

方法二:

使用class函数,函数调用常用格式:

str=class(object)——函数返回object的类型

例:

class(a)

ans=

double

方法三:

使用isa函数,函数调用常用格式:

n=is(object,'类型')——函数返回值为1,说明object为第二个参数指定的类型,0表示不是。

例:

isa(a,'double')

ans=

1

isa(a,'char')

ans=

0

1.2建立其他数值类型数据的方法

●使用single、int_、uint_分别建立单精度、有符号整型、无符号整型的数据

例:

b=single(a)%建立单精度变量b

b=

3.3000

whosab%查看变量ab的详细信息

NameSizeBytesClass

a1x18doublearray

b1x14singlearray

Grandtotalis2elementsusing12bytes

class(b)%获取变量b的数据类型

ans=

single

isa(b,'single')

ans=

1

c=int8(a)%尝试把变量a的值改为3.8,看结果有何变化,得出什么结论?

c=

3

class(c)%获取变量c的数据类型

ans=

int8

isa(c,'int8')

ans=

1

结论:

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+i34

?

?

?

Undefinedfunctionorvariable'i34'.

z=3.4+j34

?

?

?

Undefinedfunctionorvariable'j34'.

z=3.4+i*34

z=

3.4000+34.0000i

z=3.4+j*34

z=

3.4000+34.0000i

结论:

在创建复数(complex)和复数矩阵时,若虚部为常数,放在系统自定义变量i或j之前可省略星号(*),但若放在其后则不能省略

a=3.4;b=9;

r=a+bi

?

?

?

Undefinedfunctionorvariable'bi'.

 

r=a+bj

Usage:

M=bj(Data,Orders);

M=bj(Data,Orders,Prop/Valuepairs).

r=

[]

r=a+jb

?

?

?

Undefinedfunctionorvariable'jb'.

r=a+i*b

r=

3.4000+9.0000i

r=complex(a,b)

r=

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.00005.4716+0.4177i0.6909

0.70714.82443.5000+1.0000i

whosC

NameSizeBytesClass

C2x396doublearray(complex)

Grandtotalis6elementsusing96bytes

注意:

复数矩阵单个元素所占的字节数为16,而实数矩阵单个元素所占的字节数为8

2)由实部和虚部间接创建

例:

复数数组的另一种输入方式。

M_r=[1,2,3;4,5,6]

M_r=

123

456

M_i=[11,12,13;14,15,16]

M_i=

111213

141516

则复数矩阵可由下面两种方式创建,必须保证上面两个矩阵大小是相同的

CN1=M_r+i*M_i

CN1=

1.0000+11.0000i2.0000+12.0000i3.0000+13.0000i

4.0000+14.0000i5.0000+15.0000i6.0000+16.0000i

CN2=complex(M_r,M_i)

CN2=

1.0000+11.0000i2.0000+12.0000i3.0000+13.0000i

4.0000+14.0000i5.0000+15.0000i6.0000+16.0000i

(3)MATLAB提供的复数和复数矩阵操作函数

复数

直角坐标表示和极坐标表示之间转换的MATLAB指令如下:

real(z)z的实部a=rcosθ

imag(z)z的虚部b=rsinθ

abs(z)z的模r=√(a2+b2)

angle(z)z的相角θ=arctg(b/a)

求其共轭的函数为:

conj(z)z的共轭a-bi

如果z是复数矩阵,则上述函数是对矩阵里的每个元素做同样的操作。

二、MATLAB矩阵(二维数组)的创建——共6种方法

1、直接输入矩阵元素法

对于一般较小的简单的矩阵,用户可以从键盘上直接输入一系列的元素生成矩阵。

规则:

矩阵元素必须用[]括住

⏹矩阵元素必须用逗号或空格分隔

⏹在[]内矩阵的行与行之间必须用分号(;)或Enter键分隔

例:

在MATLAB中创建矩阵

矩阵元素可以是任何matlab表达式,可以是实数,也可以是复数

实现方法如下:

A=[123;456]

A=[1,2,3;4,5,6]

A=[123

456]

练习:

在MATLAB中创建矩阵

总结:

如何获取一个已建立矩阵的信息?

调用MATLAB提供的函数——class(),size(),length(),ndims()

class(A)%类型

ans=

double

size(A)%大小

ans=

23

length(A)%长度

ans=

3

ndims(A)%维数

ans=

2

2、利用冒号表达式建立一个向量

冒号表达式可以产生一个行向量,一般格式是:

其中e1为初始值,e2为步长缺省为1,e3为终止值。

注意:

该方法产生的行向量的最后一个元素的值小于等于e3,并不一定是e3

例如:

1:

6:

5

ans=

1

在MATLAB中,还可以用linspace函数产生行向量。

其调用格式为:

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函数创建矩阵

系统中提供了多个命令用于输入特殊的矩阵:

函数

功能

函数

功能

compan

伴随阵

toeplitz

Toeplitz矩阵

diag

对角阵

vander

Vandermonde矩阵

hadamard

Hadamard矩阵

zeros

元素全为0的矩阵

hankel

Hankel矩阵

ones

元素全为1的矩阵

invhilb

Hilbert矩阵的逆阵

rand

元素服从均匀分布的随机矩阵

kron

Kronercker张量积

randn

元素服从正态分布的随机矩阵

magic

魔方矩阵

eye

对角线上元素为1的矩阵

pascal

Pascal矩阵

meshgrid

由两个向量生成的矩阵

上面函数的具体用法,可以用帮助命令help得到。

如:

eye、zeros、ones、rand这几个函数的调用格式相似,下面以产生零矩阵的zeros函数为例进行说明。

其调用格式是:

●zeros(m)产生m×m零矩阵

●zeros(m,n)产生m×n零矩阵。

●zeros(size(A))产生与矩阵A同样大小的零矩阵

例如:

zeros

(2)%产生2×2零矩阵

ans=

00

00

zeros(2,3)%产生2×3零矩阵

ans=

000

000

A=2:

5

A=

2345

zeros(size(A))%产生与矩阵A同样大小的零矩阵

ans=

0000

4、利用M文件建立矩阵

例:

创建和保存数组AM的MyMatrix.m文件。

%MyMatrix.mCreationandpreservationofmatrixAM

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];

以后创建矩阵AM只需要运行:

MyMatrix指令即可。

5、把外部数据调入矩阵法

(1)选择File——>ImportData菜单操作,可打开任意类型的数据文件

(2)用户能够通过load命令,将MATLAB外部数据文件中的内容调入到工作空间中创建矩阵,外部数据文件的扩展名为“.mat“

6、建立大矩阵

大矩阵可由方括号中的小矩阵建立起来。

例如

A=[123;456;789]

A=

123

456

789

 

C=[A,eye(size(A));ones(size(A)),A]

C=

123100

456010

789001

111123

111456

111789

即矩阵的元素可以是矩阵,但必须保证同行的矩阵行数相同,同列的矩阵列数相同。

三、矩阵(二维数组)元素的标识

1、“全下标”标识(row-columnsubscripts)

“全下标”标识法:

即指出是“第几行,第几列”的元素。

对于二维数组(矩阵)来说,“全下标”标识由两个下标组成:

行下标,列下标。

格式:

矩阵名(m,n)

2、“单下标”标识(linearindexing)

“单下标(LinearIndex)”标识:

就是“只用一个下标来指明元素在数组中的位置”。

“一维编号”:

先设想把二维数组的所有列,按先左后右的次序、首尾相接排成“一维长列”;然后,自上往下对元素位置进行编号。

¢“单下标”与“全下标”的转换关系:

函数调用格式:

[I,J]=ind2sub(siz,IND)

IND=sub2ind(siz,I,J)

以(m×n)的二维数组A为例,若“全下标”元素位置是“第i行,第j列”,那么相应的“单下标”为l=(j-1)×m+i。

¢MATLAB有两个指令可实现以上表示方法间的转换:

●sub2ind据全下标换算出单下标。

●ind2sub据单下标换算出全下标

例:

在MATLAB中创建下列矩阵,并取出方框内的数组元素

A=[2.3-41;592;62.53]%直接输入法创建矩阵

A=

2.3000-4.00001.0000

5.00009.00002.0000

6.00002.50003.0000

A(1,1)%全下标访问2.3

ans=

2.3000

A

(1)%单下标访问2.3

ans=

2.3000

A(3,1)%全下标访问6

ans=

6

A(3)%单下标访问6

ans=

6

A(2,2)%全下标访问9

ans=

9

A(5)%单下标访问9

ans=

9

A(1,3)%全下标访问1

ans=

1

A(7)%单下标访问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”标识(logicalIndexing)

所谓“逻辑1”标识法是:

通过与A同样大小的逻辑数组L中“逻辑值1”所在的位置,指出A中元素的位置。

例1:

找出数组

中所有绝对值大于3的元素。

A=zeros(2,5);%预生成一个(2*5)全零数组

A(:

)=-4:

5%运用“全元素”赋值法获得A

A=

-4-2024

-3-1135

L=abs(A)>3%产生与A同维的“0-1”逻辑值数组

L=

10001

00001

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=

11111

11111

c_N=class(Num)%用class指令检查Num的类属

c_N=

double

c_L=class(L)%用class指令检查L的类属

c_L=

logical

whosNumL

NameSizeBytesClass

L2x510logicalarray

Num2x580doublearray

Grandtotalis20elementsusing90bytes

(2)逻辑数组与一般双精度数组的差别

islogical(Num)%检查Num是否属于逻辑数组类

ans=

0

Y=A(Num)%试探Num能否象L一样具有标识作用

?

?

?

Subscriptindicesmusteitherberealpositiveintegersorlogicals.

(2)逻辑数组的另外一种创建方法——logical()函数

LN=logical(Num)%将双精度数值数组转换为逻辑数组

LN=

10001

00001

islogical(LN)%检查LN是否属于逻辑数组类

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)%单下标访问

单下标和全下标之间的相互转换

[mn]=ind2sub(size(A),l)

S=[mn]

sub2ind(size(A),m,n)

四、子矩阵的寻访和赋值

子矩阵寻访

子矩阵的赋值——实现对矩阵的修改

方法一:

全下标

要修改已经定义矩阵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可以是一个矩阵、向量或标量

子数组寻访和赋值格式汇总表

子数组寻访和赋值

使用说明

A(r,c)

它由A的“r指定行”和“c指定列”上的元素组成

A(r,:

它由A的“r指定行”和“全部列”上的元素组成

A(:

c)

它由A的“全部行”和“c指定列”上的元素组成

A(:

“全元素”寻访。

它由A的各列按自左到右的次序,首尾相接而生成“一维长列”数组

A(s)

“单下标”寻访。

生成“s指定的”一维数组。

S若是“行数组”(或“列数组”),则A(s)就是长度相同的“行数组”(或“列数组”)

A(L)

“逻辑1”寻访。

生成“一维”列数组:

由与A同样大小的“逻辑数组”L中的“1”元素选出A的对应元素;按“单下标”次序排成长列组成。

A(r,c)=Sa

以“双下标”方式,对子数组A(r,c)进行赋值;Sa的“行宽、列长”必须与A(r,c)的“行宽、列长”相同

A(:

)=D(:

全元素赋值方式。

结果:

保持A的“行宽、列长”不变。

条件:

A、D两个数组的总元素相等,但“行宽、列长”不一定相同

A(s)=Sa

按“单下标”方式,对A的部分元素重新赋值。

结果:

保持A的“行宽、列长”不变。

条件:

s单下标数组的长度必须与“一维数组”Sa的长度相等,但是s、Sa不一定同是“行数组”或“列数组”

例:

不同寻访和赋值方式示例。

在MATLAB中创建下面的矩阵

clear

a=1:

8

a=

12345678

A=[a;a;a;a;a;a;a;a]

A=

12345678

12345678

12345678

12345678

12345678

12345678

12345678

12345678

1)如何获取矩阵的第3行;

A(3,:

ans=

12345678

2)如何获取矩阵的第4列;

A(:

4)

ans=

4

4

4

4

4

4

4

4

3)如何获取矩阵的第2到6行,3到7列;

A(2:

6,3:

7)

ans=

34567

34567

34567

34567

34567

4)如何获取矩阵的第1、2、7、8行,2、5、7列;

A([1278],[257])

ans=

257

257

257

257

5)如何实现矩阵第1列和第4列数据的交换;

A(:

[42315:

8])

ans=

42315678

42315678

42315678

42315678

42315678

42315678

42315678

42315678

6)如何获取矩阵按列的倒序排列矩阵

A(:

end:

-1:

1)

ans=

87654321

87654321

87654321

87654321

87654321

87654321

87654321

87654321

7)如何获取矩阵单下标号为奇数的元素

A(1:

2:

64)

ans=

Columns1through23

11112222333344445555666

Columns24through32

677778

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 初中教育 > 其它课程

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1