当前位置:文档之家› matlab中数组元素引用

matlab中数组元素引用

matlab中数组元素引用
matlab中数组元素引用

Matlab中数组元素引用有三种方法:

1.下标法(subscripts)

2.索引法(index)

3.布尔法(Boolean)

在使用这三种方法之前,大家头脑一定要清晰的记住,Matlab中数组元素是按列存储(与Fortran一样),比如说下面的二维数组

A=

8 1 6

3 5 7

4 9 2

Matlab的存储顺序是8,3,4,1,5,9,6,7,2,也就是说先行后列,对于3维数组呢,就是先行后列再页

对应个元素的索引和下标分别为

Element Index Subscripts

8 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:1)表示引用数组中的2~3行,3~1列对应的元素

A(:,end)表示引用最后一列元素,“:”表示所有列或行,“end”表示最后一列或列,“en d-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 6

3 5 7

4 9 2

>>A(2:3,3:-1:1)

ans =

7 5 3

2 9 4

>>A(:,end)

ans =

6

7

2

>>A(1,end-1)

ans =

1

>>A([2 1 3 3],[1 1 2 2 1])

ans =

3 3 5 5 3

8 8 1 1 8

4 4 9 9 4

4 4 9 9 4

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([1 10 5 2 2 1 3]):表示依次引用A的第1,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)

ans =

6

>>A([1 10 5 2 2 1 3])

ans =

17 18 11 23 23 17 4

>>A([2 5 9;1 1 1;8 5 6])

ans =

23 11 12

17 17 17

6 11 24

3.布尔法引用

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=

8 1 6

3 5 7

4 9 2

>>x=logical([1 1 0;0 1 1;1 0 1])%将double转化为boolean型数据

x =

1 1 0

0 1 1

1 0 1

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

ans =

8

4

1

5

7

2

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

x =

1 0 1

0 0 1

0 1 0

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

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

ans =

8

9

6

7

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

ans =

8

9

6

7

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

index =

1

6

7

8

增加内容

1)直接输入:

行向量:a=[1,2,3,4,5]

列向量:a=[1;2;3;4;5]

2)用“:”生成向量

a=J:K生成的行向量是a=*J,J+1,…,K+

a=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(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)’

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

如:a=[1,2,3;3,4,5],运行后:

a =

1 2 3

3 4 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)单个元素的提取

如:a=[1,2,3;3,4,5],运行后:

a =

1 2 3

3 4 5

输入b=a(1,2)

b =

2

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

如:a=[1,2,3;3,4,5],运行后:

a =

1 2 3

3 4 5

输入b=a(1,:)

b =

1 2 3

3)提取矩阵中某一列:如:a=[1,2,3;3,4,5],运行后:

a =

1 2 3

3 4 5

输入b=a(:,1)

b =

1

3

4)提取矩阵中的多行元素如:a=[1,2,3;3,4,5],运行后:

a =

1 2 3

3 4 5

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

b =

1 2 3

3 4 5

5)提取矩阵中的多列元素如:a=[1,2,3;3,4,5],运行后:

a =

1 2 3

3 4 5

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

b =

1 3

3 5

6)提取矩阵中多行多列交叉点上的元素如:a=[1,2,3;3,4,5],运行后:

a =

1 2 3

3 4 5

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

b =

1 3

3 5

7)单个元素的替换:

如:a=[1,2,3;3,4,5],运行后:

a =

1 2 3

3 4 5

输入:a(2,3)=-1

a =

1 2 3

3 4 -1

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

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)矩阵的复制排列函数是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]

A =

1 2 3

3 4 2

输入:B=fliplr(A)

B =

3 2 1

2 4 3

2)矩阵上下翻转函数:flipud,调用格式:

B=flipud(A):把矩阵A上下翻转成矩阵B

3)多维数组翻转函数:flipdim,调用格式:

B=flipdim(A,dim):把矩阵或多维数组A沿指定维数翻转成B

4)矩阵的旋转函数: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对应主对角线,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的情况。

2)下三角阵的提取用函数tril,调用格式:

a)L=tril(A):提取矩阵A的下三角部分

b)L=tril(A,k):提取矩阵A的第k条对角线以下部分。K=0对应主对角线,k>0对应主对角线以上,k<0对应主对角线以下。

3)上三角阵的提取函数triu,调用格式:

a)U=triu(A):提取矩阵A的上三角部分元素

b)U=triu(A,k):提取矩阵A的第k条对角线以上的元素。K=0对应主对角线,k>0对应主对角线以上,k<0对应主对角线以下。

关于matlab数组操作的讨论

matlab是靠它灵活数组操作发的家,但是数组操作也是初学者最难理解的matlab特色之一,因为在其他语言中(如C、pascal)不存在对等的语法和语义。在5.x版中新增添的多维数组(N-D数组),进一步扩展了matlab的功能,迎合了许多多维的科学计算。但matlab 中的很多函数只支持对向量和矩阵的操作,因此迫切要求我们掌握多维到一二维之间升降维数的命令。

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

在matlab中数据的逻辑形式可以表现出多维,但物理上在内存中的形式却是很简单按列存放的。这就说明为什么有一些函数只对列向量操作,而一些计算密集的函数,对矩阵的方向很敏感(如图像处理工具箱)。这些函数对于非列向量的输入要重新排序成列向量的形式。

对于一个矩阵,在内存中的单元存放顺序是:第一列的单元,第二列单元,。。。最后一列。u =

0.9501 0.4860 0.4565

0.2311 0.8913 0.0185

0.6068 0.7621 0.8214

u(:)

ans =

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

u(:,:,2)=[5,6;7,8];

u(:,:,1) =

1 2

3 4

u(:,:,2) =

5 6

7 8

?u(:)

ans =

1

2

4

5

7

6

8

可以从单元的逻辑下标算出它所在的物理位置,相反的计算也是一定的。如维数[d1,d2,d3]的三维数组中的一个单元(a,b,c)的物理位置是(a-1)*d2*d3+(b-1)*d3+c。

二、数组的下标

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

抽取的下标的数值要在被抽取数组维的大小以内,不能小于1或大于维的实际长度d。表示抽取下标的序列可以是任何数组形式,但matlab会自动将其转换为一列向量,如前面所描述的一样。该抽取下标序列可以有重复的数值,这样被抽取出来的序列值就会重复出现。这是一个很有用的操作,比如说已有一个表面上顶点的坐标的数组,现在要构造一个三角面的序列来表示该表面,这里就要从顶点数组中抽取数值,而且要重复,因为通常三个三角面要公用一个顶点。

u([2,1,1],:,:)

ans(:,:,1) =

3 4

1 2

VC++中如何调用matlab函数

Visual C++是当前主流的应用程序开发环境之一,开发环境强大,开发的程序执行速度快。但在科学计算方面函数库显得不够丰富、读取、显示数据图形不方便。Matlab是一款将数值分析、矩阵计算、信号处理和图形显示结合在一起,包含大量高度集成的函数可供调用,适合科学研究、工程设计等众多学科领域使用的一种简洁、高效的编程工具。不过由于Matlab使用的是解释性语言,大大限制了它的执行速度和应用场合。基于VC和Matlab混合编程是很多熟悉VC++编程而又需要进行科学计算、数据仿真的科研人员常用的一种方式,其中最简单也最直接的方法就是调用Matlab引擎。本文以下部分将详细介绍通过VC++6.0调用Matlab6.5引擎来达到VC++与Matlab数据共享编程的方法。 1. 什么是Matlab引擎 所谓Matlab引擎(engine),是指一组Matlab提供的接口函数,支持C/C++、Fortran等语言,通过这些接口函数,用户可以在其它编程环境中实现对Matlab 的控制。可以主要功能有: ★打开/关闭一个Matlab对话; ★向Matlab环境发送命令字符串; ★从Matlab环境中读取数据; ★向Matlab环境中写入数据。 与其它各种接口相比,引擎所提供的Matlab功能支持是最全面的。通过引擎方式,应用程序会打开一个新的Matlab进程,可以控制它完成任何计算和绘图操作。对所有的数据结构提供100%的支持。同时,引擎方式打开的Matlab 进程会在任务栏显示自己的图标,打开该窗口,可以观察主程序通过engine方式控制Matlab运行的流程,并可在其中输入任何Matlab命令。 实际上,通过引擎方式建立的对话,是将Matlab以ActiveX控件方式启动的。在Matlab初次安装时,会自动执行一次: matlab /regserver

数组和矩阵的关系 MATLAB

数组和矩阵的关系 摘要:数组和矩阵式MATLAB中基本的数据存在形式。一方面,数组是数据结构中的概念,有利于计算机实现层次上的计算;另一方面,矩阵是线性代数中的概念,有利于数学层次上的计算。 关键词:数组,矩阵,MATLAB 我们可以确定数组与矩阵之间的关系:(1)一维数组可以表示行向量或列向量;(2)二维数组可以表示为矩阵。所以,矩阵运算可以看作是基于数组实现的高级运算。 所谓数组,就是相同数据类型的元素按一定顺序排列的集合,即把有限个类型相同的变量用一个名字命名,用编号区分每个元素的变量的集合,这个名字称为数组名,编号称为下标。组成数组的各个变量称为数组的分量,也称为数组的元素,有时也称为下标变量。我们必须清楚,数组是用于程序设计的数据结构中的概念,并不是数学上的概念,为了处理方便,把具有相同类型的若干变量按有序的形式组织起来的一种形式。为了实现某种数学运算,可以使用数组来描述某种类型的变量。简而言之,数组的运算是对所有元素进行相同运算。 一,数组与矩阵的创建 直接输入法是创建数组最简单的方法。而且此方法可以自由指定元素的数值。采用基本规则是:(1)所有元素必须用方括号“[ ]”括起来;(2)元素之间必须用逗号“,”或空格“”分割;(3)每个元素可以用MATLAB表达式表示,既可以是实数,也可以是复数。通常,很多数组依赖数据最大值和最小值来产生数组的元素。区间限定法可以代替直接输入法中由用户计算元算的过程,依据指定数据的最大值last和最小值first 自动生成数组的每个元素。与一维数组相比,二维数组增加了一个维度,所以创建方法有所不同。直接输入法的使用增加了一个新规则:在方括号“[ ]”内的行与行之间必须用分号“;”分隔。区间限定法也可以直接用于二维数组的创建。 与数组的创建相似,矩阵的创建可以采用直接输入法。矩阵创建的基本规则是(1)所有元素必须用方括号“[ ]”括起来;(2)在[ ]内矩阵的行与行之间必须用分号“;”分隔;(3)元素之间必须用逗号“,”分隔;(4)每个元素可以用MATLAB表达式表示,既可以是实数,也可以是复数。 二,数组与矩阵的访问

(完整版)matlab中使用结构体汇总

matlab中使用结构体 结构(struct)数组 要在MALTAB中实现比较复杂的编程,就不能不用struct类型。而且在MATLAB中实现struct比C中更为方便。 4. 3.1 结构数组的创建 MATLAB提供了两种定义结构的方式:直接应用和使用struct函数。 1. 使用直接引用方式定义结构 与建立数值型数组一样,建立新struct对象不需要事先申明,可以直接引用,而且可以动态扩充。比如建立一个复数变量x: x.real = 0; % 创建字段名为real,并为该字段赋值为0 x.imag = 0 % 为x创建一个新的字段imag,并为该字段赋值为0 x = real: 0 imag: 0 然后可以将旗动态扩充为数组: x(2).real = 0; % 将x扩充为1×2的结构数组 x(2).imag = 0; 在任何需要的时候,也可以为数组动态扩充字段,如增加字段scale:x(1).scale = 0;

这样,所有x都增加了一个scale字段,而x(1)之外的其他变量的scale字段为空: x(1) % 查看结构数组的第一个元素的各个字段的内容 ans = real: 0 imag: 0 scale: 0 x(2) % 查看结构数组的第二个元素的各个字段的内容,注意没有赋值的字段为空 ans = real: 0 imag: 0 scale: [] 应该注意的是,x的real、imag、scale字段不一定是单个数据元素,它们可以是任意数据类型,可以是向量、数组、矩阵甚至是其他结构变量或元胞数组,而且不同字段之间其数据类型不需要相同。例如: clear x; x.real = [1 2 3 4 5]; x.imag = ones(10,10); 数组中不同元素的同一字段的数据类型也不要求一样: x(2).real = '123'; x(2).imag = rand(5,1);

Matlab使用单元数组和结构数组

Matlab使用单元数组(cell array)和结构数组(struct array) 要在MALTAB中实现比较复杂的编程,就不能不用单元数组(cell array)和结构数组(structarray)。而且在Matlab中实现struct比C中更为方便。 一. 单元数组 单元数组中的每一个元素称为单元(cell). 单元可以包含任何类型的matlab数据, 这些数据类型包括数值数组, 字符, 符号对象, 甚至其他的单元数组和结构体. 不同的单元可以包含不同的数据. 1.1单元数组创建与显示: 1、直接赋值法:按单元索引法和按内容索引法。(其实也就是将花括号放在等式的右边或是左边的区别)。注意:“按单元索引法”和“按内容索引法”是完全等效的,可以互换使用。通过下面实例,我们看到:花括号{}用于访问单元的值,而括号()用于标识单元(即:不用于访问单元的值)。具体理解{}和()区别可以在下面代码最后分别输入A{2,2}和A(2,2)。就会发现“按内容索引法{}”能显示完整的单元内容,而“按单元索引法()”有时无法显示完整的单元内容。 >> A(1,1)={[1 2 3; 4 5 6;7 8 9]}; % 按单元索引法 >> A(1,2)={2+3i}; >> A(2,1)={'A character'}; >> A(2,2)={12:-2:0}; >> A%要想详细显示A中的内容,可用指令:celldisp(A) A = [3x3 double] [2.0000 + 3.0000i] 'A character' [1x7 double] >> B{1,1}=[1 2 3;4 5 6;7 8 9]; % 按内容索引法。 >> B{1,2}=2+3i; >> B{2,1}='A character'; >> B{2,2}=12:-2:0; >>B B = [3x3 double] [2.0000 + 3.0000i] 'A character' [1x7 double] 2、利用cell函数法:即首先用cell函数生成一个空的单元数组,然后再向其中添加所需的数据。下面的代码生成一个2X3的空单元数组: >> C=cell(2,3) C = [] [] [] [] [] [] 利用cell生成空单元数组后,可以采用“按单元索引法”和“按内容索引法”对其进行赋值。在赋值时,用户一定要注意{}和()的用法。 >> C(1,1)={'This does work'} C = 'This does work' [] [] [] [] [] >> C{2,3}='This work' C = 'This does work' [] [] [] [] 'This work'

matlab中数组元素引用解析

Matlab中数组元素引用有三种方法: 1.下标法(subscripts) 2.索引法(index) 3.布尔法(Boolean) 在使用这三种方法之前,大家头脑一定要清晰的记住,Matlab中数组元素是按列存储(与Fortran一样),比如说下面的二维数组 A= 8 1 6 3 5 7 4 9 2 Matlab的存储顺序是8,3,4,1,5,9,6,7,2,也就是说先行后列,对于3维数组呢,就是先行后列再页 对应个元素的索引和下标分别为 Element Index Subscripts 8 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:1)表示引用数组中的2~3行,3~1列对应的元素 A(:,end)表示引用最后一列元素,“:”表示所有列或行,“end”表示最后一列或列,“en d-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 6 3 5 7 4 9 2

第5章 matlab数组和数组运算(2)

1. 标准数组:全1数组,全0数组,单位矩阵,随机矩阵,对角矩阵以及元素为指定常数的数组。 2.全1数组用ones函数,全0数组用zeros函数。 对于ones和zeros函数,当只有一个输入参数时,即ones(n)或 zeros(n),Matlab就分别生成一个n×n的全1或者全0数组。当有两个输入参数时,即ones(r,c)或者zeros(r,c),Matlab就分别生成r 行c列的全1或者全0数组。要想生成一个与其他数组相同维数的全1或者全0数组,用户只要在ones或者zeros的参数中调用size函数就可以了。测试数组:ones(4),m = ones(4,8) zeros(4),zeros(3,5),size(m),zeros(size(m))。 3.单位矩阵用eye函数。该函数用与ones和zeros函数相同的语法格式来生成单位矩阵。单位矩阵或数组是具有如下取值的矩阵或数组:除 A(i,i)之外,所有其他元素都为0,其中i=min(r,c),min(r,c)是矩阵A中的行数和列数的最小数。 4.随机矩阵用rand函数。函数rand生成均匀分布的随机数组,其元素取值介于0-1之间。直接调用rand产生一个随机数,随机数组用 rand(n)。另外randn函数将生成均值为0,方差为1的正态分布矩阵。rand和randn用法和ones相同。 5.对角矩阵用diag函数。在该数组中,一个向量可以被放在与数组的主对角线平行的任何位置。验证:a = 1:5 diag(a) diag(a,1)diag(a,-2) 6.几种生成所有元素都相同的数组的方法,先令d=pi (1)d*one(3,4) slowest method (2)d+zeros(3,4) slower method (3)d(ones(3,4)) fast method (4)repmat(d,3,4) fastest method 数组的数据量较小时,4种方法都可以。随着数组维数的增大,含有标量乘法的方法d*one(3,4)就会使矩阵生成过程变慢。因为加法通常都比乘法运算速度快,较好的办法就是将用到的标量加到加到一个全0数组zeros(3,4)上。 后两种方法虽不直观,它们却是生成大数组的最快方法,因为都用到了数组索引。(3)d(ones(r,c))先生成一个r×c的全1数组,然后用这个数组来索引和复制标量d。尽管这种方法没有用到浮点运算,但生成一个全1临时数组将会占用内存,并且消耗时间,因此使得这种方法的速度变慢。 方法repmat(d,r,c)调用函数repmat,即replicate matrix(复制矩阵)的缩写。对于标量,该函数执行如下操作步骤:

matlab数组操作

1.一个三维数组由行、列和页三维组成,其中每一页包含一个由行和列构成的二维数组。 2.利用标准数组函数创建多维数组 A=zeros(4,3,2) 生成一个4行3列2页的三维全0数组,ones,rand和randn等函数有相似的用法。 3.利用直接索引方式生成多维数组 A=zeros(2,3) A(:,:,2)=ones(2,3) A(:,:,3)=4 上面的代码先生成一个二维数组作为三维数组的第一页,然后通过数组直接索引,添加第二页、第三页。 4.利用函数reshape和repmat生成多维数组 B=reshape(A,2,9) B=[A(:,:,1) A(:,:,2) A(:,:,3)] %结果与上面一样。 reshape(B,2,3,3) reshape(B,[2 3 3]) %结果与上面一样。 提示:reshape函数可以将任何维数的数组转变成其他维数的数组。 5.利用repmat函数生成多维数组 C=ones(2,3) repmat(C,[1 1 3]) % repmat写出类似reshape的repmat(C,1,1,3)将显示出错 提示:repmat是通过数组复制创建多维数组的,上面的代码即是将数组C在行维和列维分别复制一次,然后再页维复制三次得到2×3×3的三维数组。 6.利用cat函数创建多维数组 a=zeros(2); b=ones(2); c=repmat(2,2,2); D=cat(3,a,b,c)%创建三维数组 D=cat(4,a,b,c) %创建4维数组。 D(:,1,:,:) %查看第一列的数据。 size(D) %可以知道数组D的具体维数。 6.数组运算与处理 数组之间的运算要求两个数组在任何一维都必须具有相同的大小。 (1)squeeze函数用于删除多维数组中的单一维(即大小为1的那些维) E=squeeze(D) size(D) E的数据和D一样,但比D少了一维,只有2行、2列和3页。

Matlab使用单元数组和结构数组

Matlab使用字符串数组、单元数组(cell array)和结构数组(struct array) 要在MALTAB中实现比较复杂的编程,就不能不用单元数组(cell array)和结构数组(structarray)。而且在Matlab中实现struct比C中更为方便。 MATLAB字符串数组的创建与运算 字符串数组主要用于可视化编程内容,如界面设计和图形绘制。 1.字符串变量的创建 字符变量的创建方法是:在指令窗口中先把待建的字符放在“单引号对”中,再按回车键。注意,该“单引号对”必须在英文状态下输入。这“单引号对”是MATLAB用来识别字符串变量所必须的。如: >>a='This is an example.' a = This is an example. >>msg = 'You''re right!' %创建带单引号的字符串 msg = You're right! 2.字符串数组的标识 字符串变量的每个字符(英文字母、空格和标点都是平等的)占据一个元素位,在数组中元素所处的位置用自然数标识。如: >>a='This is an example.' >>b=a(1:4) % 提出一个子字符串 b = This ra=a(end:-1:1) % 字符串的倒排 ra = .elpmaxe na si sihT 又如: >>A='这是一个算例。'; >>B=size(A) % 符号数组A 的“大小” B = 1 7 >>C=A([5 6]) % 提出一个子字符串 C = 算例 3.字符串的ASCII码 字符串的存储是用ASCII码实现的。指令abs和double都可以用来获取串数组所对应的ASCII码数值数组。指令char可把ASCII码数组变为串数组。如

C++和MATLAB的相互调用及多维动态数组定义方式

转载:VC++与Matlab混合编程之引擎操作详解(1) 2009-12-18 10:51 Visual C++是当前主流的应用程序开发环境之一,开发环境强大,开发的程序执行速度快。但在科学计算方面函数库显得不够丰富、读取、显示数据图形不方便。Matlab是一款将数值分析、矩阵计算、信号处理和图形显示结合在一起,包含大量高度集成的函数可供调用,适合科学研究、工程设计等众多学科领域使用的一种简洁、高效的编程工具。不过由于Matlab使用的是解释性语言,大大限制了它的执行速度和应用场合。基于VC和Matlab混合编程是很多熟悉VC++编程而又需要进行科学计算、数据仿真的科研人员常用的一种方式,其中最简单也最直接的方法就是调用Matlab引擎。本文以下部分将详细介绍通过VC++6.0调用Matlab6.5引擎来达到VC++与Matlab数据共享编程的方法。 1. 什么是Matlab引擎 所谓Matlab引擎(engine),是指一组Matlab提供的接口函数,支持C/C++、Fortran等语言,通过这些接口函数,用户可以在其它编程环境中实现对Matlab 的控制。可以主要功能有: ★打开/关闭一个Matlab对话; ★向Matlab环境发送命令字符串; ★从Matlab环境中读取数据; ★向Matlab环境中写入数据。 与其它各种接口相比,引擎所提供的Matlab功能支持是最全面的。通过引擎方式,应用程序会打开一个新的Matlab进程,可以控制它完成任何计算和绘图操作。对所有的数据结构提供100%的支持。同时,引擎方式打开的Matlab进程会在任务栏显示自己的图标,打开该窗口,可以观察主程序通过engine方式控制Matlab运行的流程,并可在其中输入任何Matlab命令。 实际上,通过引擎方式建立的对话,是将Matlab以ActiveX控件方式启动的。在Matlab初次安装时,会自动执行一次: matlab /regserver 将自己在系统的控件库中注册。如果因为特殊原因,无法打开Matlab引擎,可以在Dos命令提示符后执行上述命令,重新注册。 2. 配置编译器 要在VC中成功编译Matlab引擎程序,必须包含引擎头文件engine.h并引入Matlab对应的库文件libmx.lib、libmat.lib、libeng.lib。具体的说,打开一个工程后,做如下设置(以VC6为例): 1) 通过菜单工程/选项,打开设置属性页,进入Directories页面,在目录下拉列表框中选择Include files,添加路径:"C:\matlab\extern\include"(假定matlab安装在C:\matlab目录)。 2) 选择Library files,添加路径:C:\matlab\extern\lib\win32\microsoft\msvc60。(vs2005的话,不加msvc60) 3) 通过菜单工程/设置,打开工程设置属性页,进入Link页面,在Object/library modules编辑框中,添加文件名libmx.lib libmat.lib libeng.lib。 以上步骤1)、2)只需设置一次,而步骤3)对每个工程都要单独设定,对于其它 C++编译器如Borland C++ builder,设置大体相同,不再赘述。

MATLAB的Cell数组操作

5.3 Cell数组的基本操作 本小节结合示例对元胞数组的一些基本操作进行介绍。【例3-26】元胞数组的合并。 >> C1 = {'Jan' 'Feb'; '10' '17'; uint16(2004) uint16(2001)}; >> C2 = {'Mar' 'Apr' 'May'; '31' '2' '10'; ... uint16(2006) uint16(2005) uint16(1994)}; >> C3 = {'Jun'; '23'; uint16(2002)}; >> C1 C1 = 'Jan' 'Feb' '10' '17' [2004] [2001] >> C2 C2 = 'Mar' 'Apr' 'May' '31' '2' '10' [2006] [2005] [1994] >> C3

C3 = 'Jun' '23' [2002] >> C4 = {C1 C2 C3} % 生成嵌套元胞数组 C4 = {3x2 cell} {3x3 cell} {3x1 cell} >> C5 = [C1 C2 C3] % 生成元胞数组 C5 = 'Jan' 'Feb' 'Mar' 'Apr' 'May' 'Jun' '10' '17' '31' '2' '10' '23' [2004] [2001] [2006] [2005] [1994] [2002] >> whos % 查看变量的结构 Name Size Bytes Class Attributes C1 3x2 696 cell C2 3x3 1042 cell C3 3x1 348 cell C4 1x3 2422 cell

Matlab 基础知识——矩阵操作及运算(矩阵、数组区别)

看论文时,经常看到矩阵,但在记忆里又看到数组。那么问题来了,矩阵和数组分别是什么?二者有什么区别?看论文时,经常看到矩阵,但在记忆里又看到数组。那么问题来了,矩阵和数组分别是什么?二者有什么区别? 在数学上,定义m×n个数(i=1, 2…, m ; j=1, 2,…n)排成的m行n列的数表示为m行n列的矩阵,并且用大写加粗黑色字母表示。 只有一行的矩阵:,也称之为行向量; 只有一列的矩阵,也称之为列向量。 矩阵最早来自于方程组的系数即常数所构成的方阵,这一个概念有19世纪英国数学家凯利首先提出。 数组是在程序设计中,为了处理方便,把具有相同类型的若干变量按有序的形式组织起来的一种形式。这些按序排列的同类数据元素的集合称之为数组。 在Matlab中,一个数组可以分解为多个数组元素,这些数组元素可以是基本数据类型或是构造类型。因此按数组元素的类型不同,数组又可以分为数值数组、字符数组、单元数组、结构数组等各种类别。 看完上面的内容,矩阵和数组的区别似乎懂了一点。矩阵和数组在Matlab中存在很多方面的区别: (1)矩阵是数学的概念,而数组是计算机程序设计领域的概念; (2)作为一种变换或映射算符的体现,矩阵运算有着明确而严格的数学规则。而数组运算是Matlab软件定义的规则,其目的是为了使数据管理方便,操作简单,命令形式自然,执行计算有效。

二者联系主要体现在:在Matlab中,矩阵是以数组的形式存在的。因此,一维数组相当于向量;二维数组相当于矩阵。所以矩阵是数组的子集。 对矩阵的基本操作,主要有矩阵的构建、矩阵维度和矩阵大小的改变、矩阵的索引、矩阵的属性信息的获取、矩阵结构的改变等。对于这些操作,Matlab中都有固定的指令或者相应的库函数与之相对应。在程序用到的时候,每次都要上网查,网上的很散。这里,我对我经常用的做了总结。以后用到可以查阅。 1、矩阵下表引用 下面将常用的几个举例说明: 例如:A=[1 2 3 4 5; 12 12 14 56 657; 23 46 34 67 56 ];

Matlab中数组元素引用

[转载]Matlab中数组元素引用 作者:MyheartVikie Matlab中数组元素引用有三种方法: 1.下标法(subscripts) 2.索引法(index) 3.布尔法(Boolean) 在使用这三种方法之前,大家头脑一定要清晰的记住,Matlab中数组元素是按列存储(与Fortran一样),比如说下面的二维数组 A= 8 1 6 3 5 7 4 9 2 Matlab的存储顺序是8,3,4,1,5,9,6,7,2,也就是说先行后列,对于3维数组呢,就是先行后列再页 对应个元素的索引和下标分别为 Element Index Subscripts 8 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:1)表示引用数组中的2~3行,3~1列对应的元素 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 6 3 5 7 4 9 2 >>A(2:3,3:-1:1) ans = 7 5 3 2 9 4 >>A(:,end) ans = 6 7 2 >>A(1,end-1) ans = 1 >>A([2 1 3 3],[1 1 2 2 1]) ans = 3 3 5 5 3 8 8 1 1 8 4 4 9 9 4 4 4 9 9 4 2.索引法引用(说白了索引就是存储顺序) A(index):index可以是任意的数组,index的元素必须是正整数,且不大于numel(A),返回的是一个尺寸与index一样的数组

MATLAB之数组索引3

MATLAB? 中的每个变量都是一个可包含许多数字的数组。如果要访问数组的选定元素,请使用索引。 以4×4 幻方矩阵A为例: A = magic(4) A = 16 2 3 13 5 11 10 8 9 7 6 12 4 14 1 5 1 引用数组中的特定元素有两种方法。最常见的方法是指定行和列下标,例如 A(4,2) ans = 14 另一种方法不太常用,但有时非常有用,即使用单一下标按顺序向下遍历每一列: A(8) ans = 14 使用单一下标引用数组中特定元素的方法称为线性索引。 如果尝试在赋值语句右侧引用数组外部元素,MATLAB 会引发错误。 test = A(4,5) Index exceeds matrix dimensions. 不过,您可以在赋值语句左侧指定当前维外部的元素。数组大小会增大以便容纳新元素。A(4,5) = 17 A = 16 2 3 13 0 5 11 10 8 0

9 7 6 12 0 4 14 1 5 1 17 要引用多个数组元素,请使用冒号运算符,这使您可以指定一个格式为start:end的范围。例如,列出A前三行及第二列中的元素: A(1:3,2) ans = 2 11 7 单独的冒号(没有起始值或结束值)指定该维中的所有元素。例如,选择A第三行中的所有列: A(3,:) ans = 9 7 6 12 0 此外,冒号运算符还允许您使用较通用的格式start:step:end创建等距向量值。 B = 0:10:100 B = 0 10 20 30 40 50 60 70 80 90 100 如果省略中间的步骤(如start:end中),MATLAB 会使用默认步长值1。

相关主题
文本预览
相关文档 最新文档