Matlab中数组元素引用Word格式文档下载.docx

上传人:b****4 文档编号:17380642 上传时间:2022-12-01 格式:DOCX 页数:17 大小:22.06KB
下载 相关 举报
Matlab中数组元素引用Word格式文档下载.docx_第1页
第1页 / 共17页
Matlab中数组元素引用Word格式文档下载.docx_第2页
第2页 / 共17页
Matlab中数组元素引用Word格式文档下载.docx_第3页
第3页 / 共17页
Matlab中数组元素引用Word格式文档下载.docx_第4页
第4页 / 共17页
Matlab中数组元素引用Word格式文档下载.docx_第5页
第5页 / 共17页
点击查看更多>>
下载资源
资源描述

Matlab中数组元素引用Word格式文档下载.docx

《Matlab中数组元素引用Word格式文档下载.docx》由会员分享,可在线阅读,更多相关《Matlab中数组元素引用Word格式文档下载.docx(17页珍藏版)》请在冰豆网上搜索。

Matlab中数组元素引用Word格式文档下载.docx

大家对下标估计比较熟悉,由于在C语言中接触过,但是我这里需要强调的是,Matlab的下标是可以多行多列同时引用的,而像C语言等一次只能引用一个,比如

A(2:

3,3:

-1:

1)表示引用数组中的2~3行,3~1列对应的元素

A(:

end)表示引用最后一列元素,“:

”表示所有列或行,“end”表示最后一列或列,“end-n”表示倒数第n行或列

A(1,end-1)表示引用第1行倒数第2个元素

A([2133],[11221])表示引用按两个向量引用指定的元素,即A中的第2,1,3,3行和第1,1,2,2,1列对应的元素

>

A=magic(3)

A=

1)

ans=

3

4

end)

A(1,end-1)

1

A([2133],[11221])

8

2.索引法引用(说白了索引就是存储顺序)

A(index):

index可以是任意的数组,index的元素必须是正整数,且不大于numel(A),返回的是一个尺寸与index一样的数组

下标和索引之间可以通过ind2sub和sub2ind函数相互转换,具体可以看帮助,很简单

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

IND=sub2ind(siz,I,J)

还有使用A(:

)就可以将数组A转换为列向量

A(8):

表示引用A的第8个元素

B=A([11052213]):

表示依次引用A的第1,10,5,2,2,1,3个元素,返回与index尺寸相同的数组,也就是说size(B)=size(index)

A([259;

111;

856]):

返回的时侯是一个3*3的矩阵

A=magic(5)%括号中为索引值

17

(1) 

24(6) 

1(11) 

8(16) 

15(21)

23

(2) 

5(7) 

7(12) 

14(17) 

16(22)

4(3) 

6(8) 

13(13) 

20(18) 

22(23)

10(4) 

12(9) 

19(14) 

21(19) 

3(24)

11(5) 

18(10) 

25(15) 

2(20) 

9(25)

A(8)

A([11052213])

17 

18 

11 

23 

856])

12

17

24

3.布尔法引用

A(X):

X是一个有0和1组成布尔型数据,且size(A)=size(X),对应位置为1则留下该数据,0则去掉,最后按A中的存储顺序,返回一个列向量

假如说A是3*3的数组

A(logical([100;

010;

001])):

表示引用了数组A的对角线元素,注意必须使用logical将0/1数组转换为布尔型

A=magic(3)%生成一个3*3的数组

x=logical([110;

011;

101])%将double转化为boolean型数据

x=

A(x)%引用对应位置为1的数据,返回列向量

5

x=A>

5%是有了比较语句,返回布尔型数据,对应位置数据大于5的为1,否则为0

A(x)%返回大于A中大于5的元素,其实该命令可以一次性执行A(A>

5)或者find(A>

5),前者返回具体元素,后者返回大于5的数据的索引值

9

A(A>

5)%一次性执行上面的命令

indx=find(A>

5)%查找A中对于5的元素,返回它们的索引(index)值,此时我们可以通过A(index)返回具体的元素

index=

增加内容

1、向量的创建

1)直接输入:

行向量:

a=[1,2,3,4,5]

列向量:

a=[1;

2;

3;

4;

5]

2)用“:

”生成向量

a=J:

K生成的行向量是a=[J,J+1,…,K]

D:

K生成行向量a=[J,J+D,…,J+m*D],m=fix((K-J)/D)

3)函数linspace用来生成数据按等差形式排列的行向量

x=linspace(X1,X2):

在X1和X2间生成100个线性分布的数据,相邻的两个数据的差保持不变。

构成等差数列。

x=linspace(X1,X2,n):

在X1和X2间生成n个线性分布的数据,相邻的两个数据的差保持不变。

4)函数logspace用来生成等比形式排列的行向量

X=logspace(x1,x2)在x1和x2之间生成50个对数等分数据的行向量。

构成等比数列,数列的第一项x

(1)=10x1,x(50)=10x2

X=logspace(x1,x2,n)在x1和x2之间生成n个对数等分数据的行向量。

构成等比数列,数列的第一项x

(1)=10x1,x(n)=10x2

注:

向量的的转置:

x=(0,5)’

2、矩阵的创建

将数据括在[]中,同一行的元素用空格或逗号隔开,每一行可以用回车或是分号结束

如:

a=[1,2,3;

3,4,5],运行后:

a=

3

5

2)函数eye,生成单位矩阵

eye(n):

生成n*n阶单位E

eye(m,n):

生成m*n的矩阵E,对角线元素为1,其他为0

eye(size(A)):

生成一个矩阵A大小相同的单位矩阵

eye(m,n,classname):

对角线上生成的元素是1,数据类型用classname指定。

其数据类型可以是:

duoble、single、int8、uint8、int16、uint16、int32、uint32。

3)函数ones 

用ones生成全1的矩阵

ones(n):

生成n*n的全1矩阵

ones(m,n):

生成m*n的全1矩阵

ones(size(A)):

生成与矩阵A大小相同的全1矩阵

ones(m,n,p,…)生成m*n*p*….的全1的多维矩阵

ones(m,n,…,classname)制定数据类型为classname

4)函数zeros函数zeros生成全0矩阵

zeros(n):

生成n*n的全0矩阵

zeros(m,n:

)生成m*n的全0矩阵

zeros(size(A)):

生成与矩阵A大小相同的全0矩阵

zeros(m,n,p,…)生成m*n*p*….的全0的多维矩阵

zeros(m,n,…,classname)指定数据类型为classname

5)函数rand函数rand用来生成[0,1]之间均匀分布的随机函数,其调用格式是:

Y=rand:

生成一个随机数

Y=rand(n):

生成n*n的随机矩阵

Y=rand(m,n):

生成m*n的随机矩阵

Y=rand(size(A)):

生成与矩阵A大小相同的随机矩阵

Y=rand(m,n,p,…):

生成m*n*p*…的随机数多维数组

6)函数randn函数rand用来生成服从正态分布的随机函数,其调用格式是:

Y=randn:

生成一个服从标准正态分布的随机数

Y=randn(n):

生成n*n的服从标准正态分布的随机矩阵

Y=randn(m,n):

生成m*n的服从标准正态分布的随机矩阵

Y=randn(size(A)):

生成与矩阵A大小相同的服从标准正态分布的随机矩阵

Y=randn(m,n,p,…):

生成m*n*p*…的服从标准正态分布的随机数多维数组

3、矩阵元素的提取与替换

1) 

单个元素的提取

输入b=a(1,2)

b=

2) 

提取矩阵中某一行的元素,

输入b=a(1,:

3) 

提取矩阵中某一列:

输入b=a(:

1)

1

4) 

提取矩阵中的多行元素

输入b=a([1,2],:

5) 

提取矩阵中的多列元素

[1,3])

6) 

提取矩阵中多行多列交叉点上的元素

输入b=a([1,2],[1,3])

7) 

单个元素的替换:

输入:

a(2,3)=-1

-1

4、矩阵元素的重排和复制排列

矩阵元素的重排

B=reshape(A,m,n):

返回的是一个m*n矩阵B,矩阵B的元素就是矩阵A的元素,若矩阵A的元素不是m*n个则提示错误。

B=reshape(A,m,n,p):

返回的是一个多维的数组B,数组B中的元素个数和矩阵A中的元素个数相等

B=reshape(A,…,[],…):

可以默认其中的一个维数

B=reshape(A,siz):

由向量siz指定数组B的维数,要求siz的各元素之积等于矩阵A的元素个数

矩阵的复制排列 

函数是repmat

B=repmat(A,n):

返回B是一个n*n块大小的矩阵,每一块矩阵都是A

B=repmat(A,m,n):

返回值是由m*n个块组成的大矩阵,每一个块都是矩阵A。

B=repmat(A,[m,n,p,…]):

返回值B是一个多维数组形式的块,每一个块都是矩阵A

5、矩阵的翻转和旋转

1)矩阵的左右翻转左右翻转函数是fliplr,调用格式:

B=fliplr(A):

将矩阵A左右翻转成矩阵B。

A=[1,2,3;

3,4,2]

2

B=fliplr(A)

B=

2)矩阵上下翻转函数:

flipud,调用格式:

B=flipud(A):

把矩阵A上下翻转成矩阵B

多维数组翻转函数:

flipdim,调用格式:

B=flipdim(A,dim):

把矩阵或多维数组A沿指定维数翻转成B

矩阵的旋转 

函数:

rot90,调用格式:

B=rot90(A):

矩阵B是矩阵A沿逆时针方向旋转90。

得到的

B=rot90(A,k):

矩阵B是矩阵A沿逆时针方向旋转k*90。

得到的(要想顺时针旋转,k取-1)

6、矩阵的生成与提取函数

对角线函数对角线函数diag既可以用来生成矩阵,又可以来提取矩阵的对角线元素,其调用格式:

a) 

A=diag(v,k):

当v是有n个元素的向量,返回矩阵A是行列数为n+|k|的方阵。

向量v的元素位于A的第k条对角线上。

K=0对应主对角线,k>

0对应主对角线以上,k<

0对应主对角线以下。

b) 

A=diag(v):

将向量v的元素放在方阵A的主对角线上,等同于A=diag(v,k)中k=0的情况。

c) 

v=diag(A,k):

提取矩阵A的第k条对角线上的元素于列向量v中。

d) 

v=diag(A):

提取矩阵A的主对角线元素于v中,这种调用等同于v=diag(A,k)中k=0的情况。

下三角阵的提取 

用函数tril,调用格式:

L=tril(A):

提取矩阵A的下三角部分

L=tril(A,k):

提取矩阵A的第k条对角线以下部分。

上三角阵的提取 

函数triu,调用格式:

U=triu(A):

提取矩阵A的上三角部分元素

U=triu(A,k):

提取矩阵A的第k条对角线以上的元素。

关于matlab数组操作的讨论

matlab是靠它灵活数组操作发的家,但是数组操作也是初学者最难理解的matlab特色之一,因为在其他语言中(如C、pascal)不存在对等的语法和语义。

在5.x版中新增添的多维数组(N-D数组),进一步扩展了matlab的功能,迎合了许多多维的科学计算。

但matlab中的很多函数只支持对向量和矩阵的操作,因此迫切要求我们掌握多维到一二维之间升降维数的命令。

一、matlab环境中对数据的物理存放形式

  在matlab中数据的逻辑形式可以表现出多维,但物理上在内存中的形式却是很简单按列存放的。

这就说明为什么有一些函数只对列向量操作,而一些计算密集的函数,对矩阵的方向很敏感(如图像处理工具箱)。

这些函数对于非列向量的输入要重新排序成列向量的形式。

对于一个矩阵,在内存中的单元存放顺序是:

第一列的单元,第二列单元,。

最后一列。

u=

0.95010.48600.4565

0.23110.89130.0185

0.60680.76210.8214

u(:

0.9501

0.2311

0.6068

0.4860

0.8913

0.7621

0.4565

0.0185

0.8214

对于多维的数组,则是把第二维以后的维数作为数据平面(plane)来看,存放的顺序是:

第一个plane中的矩阵,第二个plane中的矩阵。

u=[1,2;

3,4];

:

2)=[5,6;

7,8];

1)=

12

34

2)=

56

78

?

可以从单元的逻辑下标算出它所在的物理位置,相反的计算也是一定的。

如维数[d1,d2,d3]的三维数组中的一个单元(a,b,c)的物理位置是(a-1)*d2*d3+(b-1)*d3+c。

二、数组的下标

在matlab中的数组下标是很灵活的,可以进行维间的合并和扩展,维内的抽取和扩展。

1、维内的抽取

抽取的下标的数值要在被抽取数组维的大小以内,不能小于1或大于维的实际长度d。

表示抽取下标的序列可以是任何数组形式,但matlab会自动将其转换为一列向量,如前面所描述的一样。

该抽取下标序列可以有重复的数值,这样被抽取出来的序列值就会重复出现。

这是一个很有用的操作,比如说已有一个表面上顶点的坐标的数组,现在要构造一个三角面的序列来表示该表面,这里就要从顶点数组中抽取数值,而且要重复,因为通常三个三角面要公用一个顶点。

u([2,1,1],:

ans(:

[2,1;

22],:

2212

4434

6656

8878

2、维内的扩展

在c或pascal之类的通用的算法语言中,要使数组动态增加或减少某些维的长度是很困难的事情,这里涉及的操作包括重新申请一个内存块,拷贝原有的数据(要重新计算地址),释放原有的块。

而在matlab中它屏蔽了这些烦人的工作,对用户是透明的。

在第一维(行)扩展,扩展只能在维末进行。

u(3,:

)=[10,11;

12,13]

1012

1113

在第一维删除一行,可以删除该维的中间部分

)=[]

3、维间的抽取

matlab试图对你输入的多维数组的下标进行匹配。

如果你给的下标数目小于实际该数组的维数,而且最后一个下标非“:

”号,则matlab则会将后面的维都以下标为1以来处理。

如果最后一个下标为“:

”,则将该维以及后面的维展成一维的向量,看看下面的例子。

1256

3478

u(1,:

三、多维数组维间处理的几个函数

1、最重要的函数应当是reshape,它的功能是将数据从一种空间形式转换为另一种,但又一个前提即这两个空间要能够匹配,它们所表示的点一样多。

设一个空间Di,另一个空间Xi,如果D1*D2*D3……Dn=X1*X2*X3……*Xm则它们之间是匹配的,可以转化

将u变为1*2*4的空间

t=reshape(u,1,2,4)

t(:

13

24

3)=

57

4)=

68

我们要注意的是,重构后数据的物理存储顺序没有变化,变得只是访问的下标。

以上是实际的存储次序,和前面的一样。

2、size函数告诉我们输入的数组单元的维数和维的长度。

size(t)

124

3、ndims函数实际上可以写成length(size(x))

4、cat函数连接两个多维数组,但要注意cat只能让你在一个维上连接,a、b两个多维数组在除了要连接的维上可以长度不同外,其他各维的尺寸必须一致。

x=[0,0;

00];

cat(3,x,u)

00

cat(2,x,u)%2*2和2*1的无法连起来

Errorusing==>

cat

CATargumentsdimensionsarenotconsistent.

5、permute函数改变维的次序。

h=permute(u,[3,2,1])%将原来的第三维变为第一维,而原来的第一维改成第三维

h(:

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

当前位置:首页 > 高等教育 > 军事

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

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