收藏 分享(赏)

Matlab中数组元素引用.doc

上传人:11xg27ws 文档编号:5787041 上传时间:2019-03-17 格式:DOC 页数:20 大小:61KB
下载 相关 举报
Matlab中数组元素引用.doc_第1页
第1页 / 共20页
Matlab中数组元素引用.doc_第2页
第2页 / 共20页
Matlab中数组元素引用.doc_第3页
第3页 / 共20页
Matlab中数组元素引用.doc_第4页
第4页 / 共20页
Matlab中数组元素引用.doc_第5页
第5页 / 共20页
点击查看更多>>
资源描述

1、2011-04-27 00:23 转载Matlab 中数组元素引用原文地址: Matlab 中数组元素引用(转)作者:MyheartVikie Matlab 中数组元素引用有三种方法:1.下标法(subscripts)2.索引法(index)3.布尔法(Boolean)在使用这三种方法之前,大家头脑一定要清晰的记住,Matlab 中数组元素是按列存储(与 Fortran 一样),比如说下面的二维数组A=8 1 63 5 74 9 2Matlab 的存储顺序是 8,3,4,1,5,9,6,7,2,也就是说先行后列,对于 3 维数组呢,就是先行后列再页对应个元素的索引和下标分别为Element I

2、ndex Subscripts8 1 (1,1)3 2 (2,1)4 3 (3,1)1 4 (1,2)5 5 (2,2)9 6 (3,2)6 7 (1,3)7 8 (2,3)2 9 (3,3)从上面的例子中已经很清晰的说明了下标和索引的区别了,也就是说 Matlab 为没有个元素分配了一个唯一识别的 ID(即 index)1.下标法引用A(ii,jj):其中 ii 和 jj 可以是一维向量、标量、“:”号或者“end”大家对下标估计比较熟悉,由于在 C 语言中接触过,但是我这里需要强调的是,Matlab 的下标是可以多行多列同时引用的,而像 C 语言等一次只能引用一个,比如A(2:3,3:-1

3、:1)表示引用数组中的 23 行,31 列对应的元素A(:,end)表示引用最后一列元素,“:”表示所有列或行,“end”表示最后一列或列,“end-n”表示倒数第 n 行或列A(1,end-1)表示引用第 1 行倒数第 2 个元素A(2 1 3 3,1 1 2 2 1)表示引用按两个向量引用指定的元素,即 A 中的第2,1,3,3 行和第 1,1,2,2,1 列对应的元素A=magic(3)A =8 1 63 5 74 9 2A(2:3,3:-1:1)ans =7 5 32 9 4A(:,end)ans =672A(1,end-1)ans =1A(2 1 3 3,1 1 2 2 1)ans

4、=3 3 5 5 38 8 1 1 84 4 9 9 44 4 9 9 42.索引法引用(说白了索引就是存储顺序)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(1 10 5 2 2 1 3):表示依次引用 A 的第 1

5、,10,5,2,2,1,3 个元素,返回与 index 尺寸相同的数组,也就是说 size(B)=size(index)A(2 5 9;1 1 1;8 5 6):返回的时侯是一个 3*3 的矩阵A=magic(5)%括号中为索引值A =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

6、ns =6A(1 10 5 2 2 1 3)ans =17 18 11 23 23 17 4A(2 5 9;1 1 1;8 5 6)ans =23 11 1217 17 176 11 243.布尔法引用A(X):X 是一个有 0 和 1 组成布尔型数据,且 size(A)=size(X),对应位置为 1则留下该数据,0 则去掉,最后按 A 中的存储顺序,返回一个列向量假如说 A 是 3*3 的数组A(logical(1 0 0;0 1 0;0 0 1):表示引用了数组 A 的对角线元素,注意必须使用 logical 将 0/1 数组转换为布尔型A=magic(3)%生成一个 3*3 的数组A=

7、8 1 63 5 74 9 2x=logical(1 1 0;0 1 1;1 0 1)%将 double 转化为 boolean 型数据x =1 1 00 1 11 0 1A(x)%引用对应位置为 1 的数据,返回列向量ans =841572x=A5%是有了比较语句,返回布尔型数据,对应位置数据大于 5 的为 1,否则为 0x =1 0 10 0 10 1 0A(x)%返回大于 A 中大于 5 的元素,其实该命令可以一次性执行 A(A5)或者find(A5),前者返回具体元素,后者返回大于 5 的数据的索引值ans =8967A(A5)%一次性执行上面的命令ans =8967indx=find

8、(A5)%查找 A 中对于 5 的元素,返回它们的索引(index)值,此时我们可以通过 A(index)返回具体的元素index =1678增加内容1、向量的创建1)直接输入:行向量:a=1,2,3,4,5列向量:a=1;2;3;4;52)用“:”生成向量a=J:K 生成的行向量是 a=J,J+1,Ka=J: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

9、(X1,X2,n): 在 X1 和 X2 间生成 n 个线性分布的数据,相邻的两个数据的差保持不变。构成等差数列。4)函数 logspace 用来生成等比形式排列的行向量X=logspace(x1,x2) 在 x1 和 x2 之间生成 50 个对数等分数据的行向量。构成等比数列,数列的第一项 x(1)=10x1,x(50)=10x2X=logspace(x1,x2,n) 在 x1 和 x2 之间生成 n 个对数等分数据的行向量。构成等比数列,数列的第一项 x(1)=10x1,x(n)=10x2注:向量的的转置:x=(0,5)2、矩阵的创建1)直接输入:将数据括在中,同一行的元素用空格或逗号隔开

10、,每一行可以用回车或是分号结束如:a=1,2,3;3,4,5,运行后:a =1 2 33 4 52)函数 eye,生成单位矩阵eye(n) :生成 n*n 阶单位 Eeye(m,n):生成 m*n 的矩阵 E,对角线元素为 1,其他为 0eye(size(A):生成一个矩阵大小相同的单位矩阵eye(m,n,classname):对角线上生成的元素是 1,数据类型用 classname 指定。其数据类型可以是:duoble、single、int8、uint8、int16、uint16、int32、uint32 。3)函数 ones 用 ones 生成全 1 的矩阵ones(n) : 生成 n*n

11、 的全 1 矩阵ones(m,n) : 生成 m*n 的全 1 矩阵ones(size(A) : 生成与矩阵 A 大小相同的全 1 矩阵ones(m,n,p,)生成 m*n*p*.的全 1 的多维矩阵ones(m,n,classname)制定数据类型为 classname4)函数 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

12、)指定数据类型为 classname5)函数 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):生成

13、m*n 的服从标准正态分布的随机矩阵Y=randn(size(A):生成与矩阵 A 大小相同的服从标准正态分布的随机矩阵Y=randn(m,n,p,):生成 m*n*p*的服从标准正态分布的随机数多维数组3、矩阵元素的提取与替换1) 单个元素的提取如:a=1,2,3;3,4,5,运行后:a =1 2 33 4 5输入 b=a(1,2)b =2 2) 提取矩阵中某一行的元素,如:a=1,2,3;3,4,5,运行后:a =1 2 33 4 5输入 b=a(1,:)b =1 2 33) 提取矩阵中某一列:如:a=1,2,3;3,4,5,运行后:a =1 2 33 4 5输入 b=a(:,1)b =1

14、34) 提取矩阵中的多行元素如:a=1,2,3;3,4,5,运行后:a =1 2 33 4 5输入 b=a(1,2,:)b =1 2 33 4 55) 提取矩阵中的多列元素如:a=1,2,3;3,4,5,运行后:a =1 2 33 4 5输入 b=a(:,1,3)b =1 33 56) 提取矩阵中多行多列交叉点上的元素如:a=1,2,3;3,4,5,运行后:a =1 2 33 4 5输入 b=a(1,2,1,3)b =1 33 57) 单个元素的替换:如:a=1,2,3;3,4,5,运行后:a =1 2 33 4 5输入:a(2,3)=-1a =1 2 33 4 -14、矩阵元素的重排和复制排

15、列1) 矩阵元素的重排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 的元素个数2) 矩阵的复制排列 函数是 repmatB=repmat(A,n):返回 B 是一个 n*n 块大小的矩阵,每一块矩阵都是 AB=rep

16、mat(A,m,n):返回值是由 m*n 个块组成的大矩阵,每一个块都是矩阵 A。B=repmat(A,m,n,p,):返回值 B 是一个多维数组形式的块,每一个块都是矩阵 A5、矩阵的翻转和旋转1)矩阵的左右翻转左右翻转函数是 fliplr,调用格式:B=fliplr(A):将矩阵 A 左右翻转成矩阵 B。输入:A=1,2,3;3,4,2A =1 2 33 4 2输入:B=fliplr(A)B =3 2 12 4 32)矩阵上下翻转 函数:flipud,调用格式:B=flipud(A):把矩阵 A 上下翻转成矩阵 B3) 多维数组翻转 函数:flipdim,调用格式:B=flipdim(A,

17、dim):把矩阵或多维数组 A 沿指定维数翻转成 B4) 矩阵的旋转 函数:rot90,调用格式:B=rot90(A):矩阵 B 是矩阵 A 沿逆时针方向旋转 90。 得到的B=rot90(A,k):矩阵 B 是矩阵 A 沿逆时针方向旋转 k*90。 得到的(要想顺时针旋转,k 取-1)6、矩阵的生成与提取函数1) 对角线函数 对角线函数 diag 既可以用来生成矩阵,又可以来提取矩阵的对角线元素,其调用格式:a) A=diag(v,k):当 v 是有 n 个元素的向量,返回矩阵 A 是行列数为n+|k|的方阵。向量 v 的元素位于 A 的第 k 条对角线上。K=0 对应主对角线,k0 对应主

18、对角线以上,k0 对应主对角线以上,k0 对应主对角线以上,k catCAT arguments dimensions are not consistent.5、permute 函数改变维的次序。h=permute(u,3,2,1) %将原来的第三维变为第一维,而原来的第一维改成第三维h(:,:,1) =1 25 6h(:,:,2) =3 47 8h(:)ans =15263748我们注意到数据的物理存储次序发生了变化。6、ipermute 函数是 permute 的逆运算,其实只不过是的书写和阅读比较容易而已,把 permute 中的 order 参数改一改也能实现改功能,如果用 type impermute 你就可以看到 permute 函数的调用。7、shiftdim 和 permute 差不多,但它是能循环移动维数。请注意它还有去奇异维(即该维的长度为 1)的功能,这和 squeeze 函数一样,不同的是只去开头的奇异维。8、squeeze 函数将多维数组中的奇异维去掉,请注意这样的操作不减少该数组空间上的单元的数目。squeeze 操作在求导,差分等运算之前做预处理是很有必要的。

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

当前位置:首页 > 生活休闲 > 社会民生

本站链接:文库   一言   我酷   合作


客服QQ:2549714901微博号:道客多多官方知乎号:道客多多

经营许可证编号: 粤ICP备2021046453号世界地图

道客多多©版权所有2020-2025营业执照举报