admin 管理员组

文章数量: 1086019


2024年2月25日发(作者:代码和源代码)

第一章 基础准备及入门

本章有两个目的:一是讲述MATLAB正常运行所必须具备的基础条件;二是简明系统地介绍高度集成的Desktop操作桌面的功能和使用方法。

本章的前两节分别讲述:MATLAB的正确安装方法和MATLAB 环境的启动。因为指令窗是MATLAB最重要的操作界面,所以本章用第 1.3、1.4 两节以最简单通俗的叙述、算例讲述指令窗的基本操作方法和规则。这部分内容几乎对MATLAB各种版本都适用。

MATLAB6.x 不同于其前版本的最突出之处是:向用户提供前所未有的、成系列的交互式工作界面。了解、熟悉和掌握这些交互界面的基本功能和操作方法,将使新老用户能事半功倍地利用MATLAB去完成各种学习和研究。为此,本章特设几节用于专门介绍最常用的交互界面:历史指令窗、当前目录浏览器、工作空间浏览器、内存数组编辑器、交互界面分类目录窗、M文件编辑/调试器、及帮助导航/浏览器。

本章是根据MATLAB6.5版编写的,但大部分内容也适用于其他6.x版。

1.1 MATLAB的安装和内容选择

图 1.1-1

1.2 Desktop操作桌面的启动

1.2.1

1.2.2

MATLAB的启动

Desktop操作桌面简介

一 操作桌面的缺省外貌

图1.2-1

二 通用操作界面

1.3 Command Window运行入门

1.3.1 Command Window指令窗简介

图 1.3-1

1.3.2 最简单的计算器使用法

2【例1.3.2-1】求[12+2×(7−4)]÷3的算术运算结果。

(1)用键盘在MATLAB指令窗中输入以下内容

>> (12+2*(7-4))/3^2

(2)在上述表达式输入完成后,按【Enter】键,该就指令被执行。

(3)在指令执行后,MATLAB指令窗中将显示以下结果。

ans =

2

⎡123⎤⎢⎥【例1.3.2-2】简单矩阵A=456的输入步骤。

⎢⎥⎢⎣789⎥⎦(1)在键盘上输入下列内容

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

(2)按【Enter】键,指令被执行。

(3)在指令执行后,MATLAB指令窗中将显示以下结果:

A =

1 2 3

4 5 6

7 8 9

【例1.3.2-3】矩阵的分行输入。

A=[1,2,3

4,5,6

7,8,9]

A =

1 2 3

4 5 6

7 8 9

【例1.3.2-4】指令的续行输入

S=1-1/2+1/3-1/4+ ...

1/5-1/6+1/7-1/8

S =

0.6345

1.3.3 数值、变量和表达式

一 数值的记述

二 变量命名规则

三 MATLAB默认的预定义变量

四 运算符和表达式

五 复数和复数矩阵

π【例1.3.3-1】复数z1=3+4i,z2=1+2i,z3=2e6表达,及计算z=(1)

z1= 3 + 4i

z1 =

3.0000 + 4.0000i

(2)

iz1z2。

z3

z2 = 1 + 2 * i

z3=2*exp(i*pi/6)

z=z1*z2/z3

z2 =

1.0000 + 2.0000i

z3 =

1.7321 + 1.0000i

z =

0.3349 + 5.5801i

【例1.3.3-2】复数矩阵的生成及运算

A=[1,3;2,4]-[5,8;6,9]*i

B=[1+5i,2+6i;3+8*i,4+9*i]

C=A*B

A =

1.0000 - 5.0000i 3.0000 - 8.0000i

2.0000 - 6.0000i 4.0000 - 9.0000i

B =

1.0000 + 5.0000i 2.0000 + 6.0000i

3.0000 + 8.0000i 4.0000 + 9.0000i

C =

1.0e+002 *

0.9900 1.1600 - 0.0900i

1.1600 + 0.0900i 1.3700

【例1.3.3-3】求上例复数矩阵C的实部、虚部、模和相角。

C_real=real(C)

C_imag=imag(C)

C_magnitude=abs(C)

C_phase=angle(C)*180/pi %以度为单位计算相角

C_real =

99 116

116 137

C_imag =

0 -9

9 0

C_magnitude =

99.0000 116.3486

116.3486 137.0000

C_phase =

0 -4.4365

4.4365 0

【例1.3.3-4】 用MATLAB计算3−8能得到 –2 吗?

(1)

a=-8;

r=a^(1/3)

r =

1.0000 + 1.7321i

(2)

m=[0,1,2];

R=abs(a)^(1/3);

Theta=(angle(a)+2*pi*m)/3;

rrr=R*exp(i*Theta)

rrr =

1.0000 + 1.7321i -2.0000 + 0.0000i 1.0000 - 1.7321i

(3)

t=0:pi/20:2*pi;x=R*sin(t);y=R*cos(t);

plot(x,y,'b:'),grid

hold on

plot(rrr(1),'.','MarkerSize',50,'Color','r')

plot(rrr([2,3]),'o','MarkerSize',15,'Color','b')

axis([-3,3,-3,3]),axis square

hold off

3210-1-2-3-3-2-10123图 1.3-2

1.3.4 计算结果的图形表示

−t3【例1.3.4-1】画出衰减振荡曲线y=esin3t及其它的包络线y0=e。t的取值范围是−t3[0,4π]。(图1.3-3)

t=0:pi/50:4*pi;

y0=exp(-t/3);

y=exp(-t/3).*sin(3*t);

plot(t,y,'-r',t,y0,':b',t,-y0,':b')

grid

10.80.60.40.20-0.2-0.4-0.6-0.8-1

图1.3-3

【例1.3.4-2】画出z=sin(x2+y2)x+y22所表示的三维曲面(图1.3-4)。x,y的取值范围是[−8,8]。

clear;x=-8:0.5:8;

y=x';

X=ones(size(y))*x;

Y=y*ones(size(x));

R=sqrt(X.^2+Y.^2)+eps; %<5>

Z=sin(R)./R; %<6>

surf(X,Y,Z); %

colormap(cool) %

xlabel('x'),ylabel('y'),zlabel('z')

1.3-4

1.4 Command Window操作要旨

1.4.1 指令窗显示方式的操作

一 缺省显示方式

二 显示方式的设置

1.4.2

1.4.3

1.4.4

1.4.5

数值计算结果的显示格式

指令行中的标点符号

指令窗的常用控制指令

指令窗中指令行的编辑

【例1.4.5-1】指令行操作过程示例。

1.5 Command History和实录指令diary

1.5.1 Command History历史指令窗简介

图1.5-1

1.5.2 历史指令行的再运行

【例1.5.2-1】再运行图1.5-2所示历史指令窗中的三行指令。

图1.5-2

1.5.3 指令窗实录指令diary

1.6 Current Directory、路径设置器和文件管理

1.6.1 Current Directory当前目录浏览器简介

图 1.6-1

一 用户目录和当前目录设置

二 借助当前目录浏览器获取M和MAT文件信息

【例1.6.1-1】从图1.2-1所示MATLAB缺省桌面开始,叙述引出图1.6-1所示面貌的当前目录浏览器的操作过程。

1.6.2

1.6.3

MATLAB的搜索路径

MATLAB搜索路径的扩展和修改

一 何时需要修改搜索路径

二 利用设置路径对话框修改搜索路径

图1.6-2

三 利用指令path 设置路径

1.7 Workspace Browser和Array Editor

1.7.1 Workspace Browser工作空间浏览器简介

图1.7-1

1.7.2 现场菜单用于内存变量的查阅和删除

一 内存变量查阅、删除的指令操作法

【例1.7.2-1】在指令窗中运用who, whos查阅MATLAB内存变量。

who

Your variables are:

A Bnumber D R XYZ Z y

B C DD X Y x

whos

Name Size Bytes Class

A 2x2 230 cell array

B 1x1 264 struct array

Bnumber 1x1 8 double array

C 2x2 408 sym object

D 1x2 4 char array

DD 2x2 8 char array

R 33x33 8712 double array

X 33x33 8712 double array

XYZ 33x33x3 26136 double array

Y 33x33 8712 double array

Z 33x33 8712 double array

x 1x33 264 double array

y 33x1 264 double array

Grand total is 7722 elements using 62434 bytes

【例1.7.2-2】在指令窗中运用clear指令可以删除内存中的变量。

clear Bnumber

who

Your variables are:

A B C D DD R X XYZ Y Z x y

二 内存变量查阅和删除的现场菜单操作法

图1.7-2

【例1.7.2-3】通过“工作空间浏览器”的运作,采用图形显示内存变量Z 。

图1.7-3

【例1.7.2-4】通过“工作空间浏览器”删除内存变量。

1.7.3 Array Editor数组编辑器和大数组的输入

图 1.7-4

1.7.4 数据文件的存取

一 存取数据文件的指令操作法

二 通过内存变量浏览器实现数据文件的存取

(1) 产生保存全部内存变量的数据文件的操作方法

图1.7-5

【例1.7.4-1】数据的存取。(假定内存中已经存在变量X,Y,Z)

(1)

mkdir('c:','my_dir');

cd c:my_dir

save saf X Y Z

dir

. ..

(2)

clear

load saf Z

who

Your variables are:

Z

1.8 Launch Pad交互界面分类目录窗

图1.8-1

1.9 Editor/Debugger和脚本编写初步

1.9.1 Editor/Debugger M文件编辑调试器简介

一 编辑调试器的开启

图 1.9-1

二 编辑器使用中的若干注意事项

1.9.2 M脚本文件编写初步

【例1.9.2-1】编写解算例1.3.4-1题目的M脚本文件,并运行之。

操作步骤:

1.10

1.10.1

帮助系统

帮助方式概述

一 “纯文本”帮助

【例1.10.1-1】在指令窗中运行help 的示例。

(1)

help help

HELP On-line help, display text at command line.

HELP, by itself, lists all primary help topics. Each primary topic

corresponds to a directory name on the MATLABPATH.

...... ...... ......

(2)

help

HELP topics:

matlabgeneral - General purpose commands.

matlabops - Operators and special characters.

matlablang - Programming language constructs.

matlabelmat - Elementary matrices and matrix manipulation.

matlabelfun - Elementary math functions.

...... ...... ......

For more help on directory/topic, type "help topic".

(3)

help elmat

Elementary matrices and matrix manipulation.

Elementary matrices.

zeros - Zeros array.

ones - Ones array.

eye - Identity matrix.

...... ...... ......

(4)

help eye

EYE Identity matrix.

EYE(N) is the N-by-N identity matrix.

EYE(M,N) or EYE([M,N]) is an M-by-N matrix with 1's on

the diagonal and zeros elsewhere.

EYE(SIZE(A)) is the same size as A.

See also ONES, ZEROS, RAND, RANDN.

【例1.10.1-2】在指令窗中,运用lookfor找H1行(M函数文件的第一注释行)

lookfor fourier

FFT Discrete Fourier transform.

FFT2 Two-dimensional discrete Fourier Transform.

FFTN N-dimensional discrete Fourier Transform.

IFFT Inverse discrete Fourier transform.

IFFT2 Two-dimensional inverse discrete Fourier transform.

IFFTN N-dimensional inverse discrete Fourier transform.

XFOURIER Graphics demo of Fourier series expansion.

MOT563_FFT Discrete Fourier transform.

MOT563_IFFT Inverse discrete Fourier transform.

MOT566_FFT Discrete Fourier transform.

MOT566_IFFT Inverse discrete Fourier transform.

DFTMTX Discrete Fourier transform matrix.

INSTDFFT Inverse non-standard 1-D fast Fourier transform.

NSTDFFT Non-standard 1-D fast Fourier transform.

FFT Quantized Fast Fourier Transform.

FOURIER Fourier integral transform.

IFOURIER Inverse Fourier integral transform.

二 “导航/浏览器交互界面”帮助

三 PDF帮助

四 其他帮助

1.10.2 Help Navigator/Browser帮助导航/浏览器简介

图 1.10-1

一 Contents帮助文件目录窗

【例1.10.2-1】通过鼠标操作获得如图1.10-1所示的界面。

二 Index帮助索引窗

【例1.10.2-2】利用Idex搜索fourier这条术语。(注意把本例与例1.10.1-2、例1.10.2-3比较。)

图1.10-2

三 Search搜索窗

【例1.10.2-3】利用“Search”窗搜索词汇fourier。(注意把本例与例1.10.1-2、例1.10.2-2比较。)

图1.10-3

四 Favorites书签窗

第二章 数值数组及其运算

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

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

顺便指出:(1)本章所涉内容和方法,不仅使用于数值数组,而且也将部分地延伸使用于在其他数据结构中。(2)MATLAB5.x和6.x 版在本章内容上的差异极微。(3)MATLAB6.5版新增的两种逻辑操作,在第2.13.2节给予介绍。

2.1 引导

−x【例2.1-1】绘制函数y=xe在0≤x≤1时的曲线。

x=0:0.1:1

y=x.*exp(-x)

plot(x,y),xlabel('x'),ylabel('y'),title('y=x*exp(-x)')

x =

Columns 1 through 7

0 0.1000 0.2000 0.3000 0.4000 0.5000 0.6000

Columns 8 through 11

0.7000 0.8000 0.9000 1.0000

y =

Columns 1 through 7

0 0.0905 0.1637 0.2222 0.2681 0.3033 0.3293

Columns 8 through 11

0.3476 0.3595 0.3659 0.3679

0.40.350.30.250.20.150.10.05000.20.4x0.60.81yy=x*exp(-x)图2.1-1

2.2

2.2.1

2.2.2

一维数组的创建和寻访

一维数组的创建

一维数组的子数组寻访和赋值

【例2.2.2-1】子数组的寻访(Address)。

1

rand('state',0)

x=rand(1,5)

x =

0.9501 0.2311 0.6068 0.4860 0.8913

x(3)

ans =

0.6068

x([1 2 5])

ans =

0.9501 0.2311 0.8913

x(1:3)

ans =

0.9501 0.2311 0.6068

x(3:end) %

ans =

0.6068 0.4860 0.8913

x(3:-1:1) %

ans =

0.6068 0.2311 0.9501

x(find(x>0.5))

ans =

0.9501 0.6068 0.8913

x([1 2 3 4 4 3 2 1])

ans =

Columns 1 through 7

0.9501 0.2311 0.6068 0.4860 0.4860 0.6068 0.2311

Column 8

0.9501

【例2.2.2-2】子数组的赋值(Assign)。

x(3) = 0

x =

0.9501 0.2311 0 0.4860 0.8913

x([1 4])=[1 1]

x =

1.0000 0.2311 0 1.0000 0.8913

2.3 二维数组的创建

2.3.1 直接输入法

【例2.3.1-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

2

【例2.3.1-2】复数数组的另一种输入方式。

M_r=[1,2,3;4,5,6],M_i=[11,12,13;14,15,16]

CN=M_r+i*M_i

M_r =

1 2 3

4 5 6

M_i =

11 12 13

14 15 16

CN =

1.0000 +11.0000i 2.0000 +12.0000i 3.0000 +13.0000i

4.0000 +14.0000i 5.0000 +15.0000i 6.0000 +16.0000i

2.3.2 利用M文件创建和保存数组

【例2.3.2-1】创建和保存数组 AM的 MyMatrix.m 文件。

(1)

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

(2)

(3)

2.4

2.4.1

2.4.2

2.4.3

二维数组元素的标识

“全下标”标识

“单下标”标识

“逻辑1”标识

⎡−4−2024⎤中所有绝对值大于3的元素。

⎥⎣−3−1135⎦【例2.4.3-1】找出数组A=⎢A=zeros(2,5);

A(:)=-4:5

L=abs(A)>3

islogical(L)

X=A(L)

A =

-4 -2 0 2 4

-3 -1 1 3 5

L =

1 0 0 0 1

0 0 0 0 1

ans =

1

X =

-4

4

5

【例2.4.3-2】演示逻辑数组与一般双精度数值数组的关系和区别。(本例在例2.4.3-1基础

3

上进行)。

(1)

Num=[1,0,0,0,1;0,0,0,0,1];

N_L=Num==L

c_N=class(Num)

c_L=class(L)

N_L =

1 1 1 1 1

1 1 1 1 1

c_N =

double

c_L =

double

(2)

islogical(Num)

Y=A(Num)

ans =

0

Index into matrix is negative or zero. See release notes on changes

to

logical indices.

2.5 二维数组的子数组寻访和赋值

【例2.5-1】不同赋值方式示例。

A=zeros(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)

Sa=[10 20 30]'

A(s)=Sa

ans =

2 3 5

Sa =

10

20

30

A =

1 20 30 7

10 4 6 8

A(:,[2 3])=ones(2)

A =

1 1 1 7

10 1 1 8

2.6 执行数组运算的常用函数

4

2.6.1

2.6.2

函数数组运算规则的定义:

执行数组运算的常用函数

【例2.6.2-1】演示pow2的数组运算性质。

A=[1:4;5:8]

A =

1 2 3 4

5 6 7 8

pow2(A)

ans =

2 4 8 16

32 64 128 256

2.7

2.7.1

数组运算和矩阵运算

数组运算和矩阵运算指令对照汇总

【例 2.7.1-1】两种不同转置的比较

clear;A=zeros(2,3);

A(:)=1:6;

A=A*(1+i)

A_A=A.'

A_M=A'

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 =

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

2.8

2.8.1

多项式的表达方式及其操作

多项式的表达和创建

一 多项式表达方式的约定

二 多项式行向量的创建方法

【例 2.8.1.2-1】求3阶方阵A的特征多项式。

A=[11 12 13;14 15 16;17 18 19];

PA=poly(A)

PPA=poly2str(PA,'s')

PA =

1.0000 -45.0000 -18.0000 0.0000

PPA =

s^3 - 45 s^2 - 18 s + 1.8303e-014

【例 2.8.1.2-2】由给定根向量求多项式系数向量。

R=[-0.5,-0.3+0.4*i,-0.3-0.4*i];

5

P=poly(R)

PR=real(P)

PPR=poly2str(PR,'x')

P =

1.0000 1.1000 0.5500 0.1250

PR =

1.0000 1.1000 0.5500 0.1250

PPR =

x^3 + 1.1 x^2 + 0.55 x + 0.125

2.8.2 多项式运算函数

p1=conv([1,0,2],conv([1,4],[1,1]));

p2=[1 0 1 1];

[q,r]=deconv(p1,p2);

cq='商多项式为 '; cr='余多项式为 ';

disp([cq,poly2str(q,'s')]),disp([cr,poly2str(r,'s')])

商多项式为 s + 5

余多项式为 5 s^2 + 4 s + 3

【例 2.8.2-2】两种多项式求值指令的差别。

S=pascal(4)

P=poly(S);

PP=poly2str(P,'s')

PA=polyval(P,S)

PM=polyvalm(P,S)

S =

1 1 1 1

1 2 3 4

1 3 6 10

1 4 10 20

PP =

s^4 - 29 s^3 + 72 s^2 - 29 s + 1

PA =

1.0e+004 *

0.0016 0.0016 0.0016 0.0016

0.0016 0.0015 -0.0140 -0.0563

0.0016 -0.0140 -0.2549 -1.2089

0.0016 -0.0563 -1.2089 -4.3779

PM =

1.0e-010 *

0.0016 0.0033 0.0090 0.0205

0.0045 0.0101 0.0286 0.0697

0.0095 0.0210 0.0653 0.1596

0.0163 0.0387 0.1226 0.3019

【例 2.8.2-3】部分分式展开。

a=[1,3,4,2,7,2];

b=[3,2,5,4,6];

[r,s,k]=residue(b,a)

r =

1.1274 + 1.1513i

1.1274 - 1.1513i

-0.0232 - 0.0722i

-0.0232 + 0.0722i

0.7916

s =

(s2+2)(s+4)(s+1)【例2.8.2-1】求的“商”及“余”多项式。

s3+s+1

6

-1.7680 + 1.2673i

-1.7680 - 1.2673i

0.4176 + 1.1130i

0.4176 - 1.1130i

-0.2991

k =

[]

2.9 标准数组生成函数和数组操作函数

2.9.1 标准数组生成函数【例2.9.1-1】标准数组产生的演示。

ones(1,2)

ans =

1 1

ones(2)

ans =

1 1

1 1

randn('state',0)

randn(2,3)

ans =

-0.4326 0.1253 -1.1465

-1.6656 0.2877 1.1909

D=eye(3)

D =

1 0 0

0 1 0

0 0 1

diag(D)

ans =

1

1

1

diag(diag(D))

ans =

1 0 0

0 1 0

0 0 1

repmat(D,1,3)

ans =

Columns 1 through 8

1 0 0 1 0 0 1 0

0 1 0 0 1 0 0 1

0 0 1 0 0 1 0 0

Column 9

0

0

1

7

2.9.2 数组操作函数

【例 2.9.2-1】diag与reshape的使用演示。

a=-4:4

A=reshape(a,3,3)

a =

Columns 1 through 8

-4 -3 -2 -1 0 1 2 3

Column 9

4

A =

-4 -1 2

-3 0 3

-2 1 4

a1=diag(A,1)

a1 =

-1

3

A1=diag(a1,-1)

A1 =

0 0 0

-1 0 0

0 3 0

【例2.9.2-2】数组转置、对称交换和旋转操作后果的对照比较。

A

A =

-4 -1 2

-3 0 3

-2 1 4

A.'

ans =

-4 -3 -2

-1 0 1

2 3 4

flipud(A)

ans =

-2 1 4

-3 0 3

-4 -1 2

fliplr(A)

ans =

2 -1 -4

3 0 -3

4 1 -2

rot90(A)

ans =

2 3 4

-1 0 1

-4 -3 -2

【例2.9.2-3】演示Kronecker乘法不具备“可交换规律”。

B=eye(2)

C=reshape(1:4,2,2)

B =

8

1 0

0 1

C =

1 3

2 4

kron(B,C)

ans =

1 3 0 0

2 4 0 0

0 0 1 3

0 0 2 4

kron(C,B)

ans =

1 0 3 0

0 1 0 3

2 0 4 0

0 2 0 4

2.10 数组构作技法综合

【例2.10-1】数组的扩展。

(1)数组的赋值扩展法

A=reshape(1:9,3,3)

A =

1 4 7

2 5 8

3 6 9

A(5,5)=111

A =

1 4 7 0 0

2 5 8 0 0

3 6 9 0 0

0 0 0 0 0

0 0 0 0 111

A(:,6)=222

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

(2)多次寻访扩展法

AA=A(:,[1:6,1:6])

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)

B =

1 1 1 1 1 1

1 1 1 1 1 1

AB_r=[A;B]

9

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

【例2.10-2】提取子数组,合成新数组。

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)

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

【例2.10-3】单下标寻访和reshape指令演示。

clear

A=reshape(1:16,2,8)

A =

135****1315 2 4 6 8 10 12 14 16

reshape(A,4,4)

ans =

1 5 9 13

2 6 10 14

3 7 11 15

4 8 12 16

s=[136****1416];A(s)=0

A =

0 0 5 7 0 0 13 15

2 4 0 0 10 12 0 0

【例2.10-4】“对列(或行)同加一个数”三种的操作方法。

clear,A=reshape(1:9,3,3)

A =

10

1 4 7

2 5 8

3 6 9

b=[1 2 3];A_b1=A-b([1 1 1],:)

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

【例2.10-5】逻辑函数的运用示例。

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)<0.5|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

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))'

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==111);

disp(ii'),disp(jj')

2 2 3 2 1 2 2 3

1 2 2 3 4 4 6 6

2.11 高维数组

11

2.11.1 高维数组的创建

【例2.11.1-1】“全下标”元素赋值方式创建高维数组演示。

A(2,2,2)=1

A(:,:,1) =

0 0

0 0

A(:,:,2) =

0 0

0 1

B(2,5,:)=1:3

B(:,:,1) =

0 0 0 0 0

0 0 0 0 1

B(:,:,2) =

0 0 0 0 0

0 0 0 0 2

B(:,:,3) =

0 0 0 0 0

0 0 0 0 3

【例2.11.1-2】低维数组合成高维数组。

clear,A=ones(2,3);A(:,:,2)=ones(2,3)*2;A(:,:,3)=ones(2,3)*3

A(:,:,1) =

1 1 1

1 1 1

A(:,:,2) =

2 2 2

2 2 2

A(:,:,3) =

3 3 3

3 3 3

【例2.11.1-3】由函数ones, zeros, rand, randn直接创建标准高维数组的示例。

rand('state',1111),rand(2,4,3)

ans(:,:,1) =

0.6278 0.9748 0.2585 0.6949

0.2544 0.2305 0.0313 0.1223

ans(:,:,2) =

0.4889 0.3898 0.8489 0.0587

0.9138 0.3071 0.4260 0.6331

ans(:,:,3) =

0.2802 0.2073 0.7438 0.2714

0.4051 0.2033 0.4566 0.2421

【例2.11.1-4】借助cat, repmat, reshape等函数构作高维数组。

(1)

cat(3,ones(2,3),ones(2,3)*2,ones(2,3)*3)

ans(:,:,1) =

1 1 1

1 1 1

ans(:,:,2) =

2 2 2

2 2 2

ans(:,:,3) =

3 3 3

3 3 3

(2)

12

repmat(ones(2,3),[1,1,3])

ans(:,:,1) =

1 1 1

1 1 1

ans(:,:,2) =

1 1 1

1 1 1

ans(:,:,3) =

1 1 1

1 1 1

(3)

reshape(1:12,2,2,3)

ans(:,:,1) =

1 3

2 4

ans(:,:,2) =

5 7

6 8

ans(:,:,3) =

9 11

10 12

2.11.2 高维数组的标识

【例2.11.2-1】维数、大小和长度

clear;A=reshape(1:24,2,3,4);

dim_A=ndims(A)

size_A=size(A)

L_A=length(A)

dim_A =

3

size_A =

2 3 4

L_A =

4

2.11.3 高维数组构作和操作函数汇总

【例2.11.3-1】数组元素对称交换指令flipdim的使用示例。

A=reshape(1:18,2,3,3)

A(:,:,1) =

1 3 5

2 4 6

A(:,:,2) =

7 9 11

8 10 12

A(:,:,3) =

13 15 17

14 16 18

flipdim(A,1)

ans(:,:,1) =

2 4 6

1 3 5

ans(:,:,2) =

8 10 12

7 9 11

13

ans(:,:,3) =

14 16 18

13 15 17

flipdim(A,3)

ans(:,:,1) =

13 15 17

14 16 18

ans(:,:,2) =

7 9 11

8 10 12

ans(:,:,3) =

1 3 5

2 4 6

【例2.11.3-2】数组的“维序号左移”重组。

shiftdim(A,1)

ans(:,:,1) =

1 7 13

3 9 15

5 11 17

ans(:,:,2) =

2 8 14

4 10 16

6 12 18

shiftdim(A,2)

ans(:,:,1) =

1 2

7 8

13 14

ans(:,:,2) =

3 4

9 10

15 16

ans(:,:,3) =

5 6

11 12

17 18

【例2.11.3-3】广义非共轭转置。

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

ans(:,:,1) =

1 7 13

3 9 15

5 11 17

ans(:,:,2) =

2 8 14

4 10 16

6 12 18

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

ans(:,:,1) =

1 7 13

2 8 14

ans(:,:,2) =

3 9 15

4 10 16

ans(:,:,3) =

5 11 17

6 12 18

14

【例2.11.3-4】“孤维”的撤消和降维。

B=cat(4,A(:,:,1),A(:,:,2),A(:,:,3))

B(:,:,1,1) =

1 3 5

2 4 6

B(:,:,1,2) =

7 9 11

8 10 12

B(:,:,1,3) =

13 15 17

14 16 18

size(B)

ans =

2 3 1 3

C=squeeze(B)

C(:,:,1) =

1 3 5

2 4 6

C(:,:,2) =

7 9 11

8 10 12

C(:,:,3) =

13 15 17

14 16 18

size(C)

ans =

2 3 3

【例2.11.3-5】赋“空阵”值操作。

A=reshape(1:18,2,3,3)

A(:,:,1) =

1 3 5

2 4 6

A(:,:,2) =

7 9 11

8 10 12

A(:,:,3) =

13 15 17

14 16 18

A(:,2:3,:)=[]

B=A;

A(:,:,1) =

1

2

A(:,:,2) =

7

8

A(:,:,3) =

13

14

size(A)

ans =

2 1 3

A_1=squeeze(A)

15

A_1 =

1 7 13

2 8 14

size(B)

ans =

2 1 3

B(:,1,:)=[]

B =

Empty array: 2-by-0-by-3

2.12

2.12.1

“非数”和“空”数组

非数NaN

【例2.12.1-1】非数的产生和性质演示。

(1)

a=0/0,b=0*log(0),c=inf-inf

Warning: Divide by zero.

a =

NaN

Warning: Log of zero.

b =

NaN

c =

NaN

(2)

0*a,sin(a)

ans =

NaN

ans =

NaN

(3)

a==nan

ans =

0

(4)

a~=nan

a==b

b>c

ans =

1

ans =

0

ans =

0

(5)

class(a)

isnan(a)

ans =

double

ans =

1

16

【例2.12.1-2】非数元素的寻访

rand('state',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

1 5

2.12.2 “空”数组

【例2.12.2-1】关于“空”数组的算例。

(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)

isnumeric(a)

isempty(a)

ans =

double

ans =

1

ans =

1

which a

ndims(a)

size(a)

a is a variable.

ans =

2

ans =

0 0

17

(3)

b_c1=b.*c

b_c2=b'*c

b_c3=b*c'

b_c1 =

Empty matrix: 2-by-0

b_c2 =

[]

b_c3 =

0 0

0 0

(4)

a==b

ans =

0

b==c

ans =

Empty matrix: 2-by-0

c>d

ans =

Empty matrix: 2-by-0

a==0

Warning: Future versions will return empty for empty == scalar

comparisons.

ans =

0

a~=0

Warning: Future versions will return empty for empty ~= scalar

comparisons.

ans =

1

(5)

A=reshape(-4:5,2,5)

A =

-4 -2 0 2 4

-3 -1 1 3 5

L2=A>10

find(L2)

L2 =

0 0 0 0 0

0 0 0 0 0

ans =

[]

(6)

A(:,[2,4])=[]

A =

-4 0 4

-3 1 5

2.13 关系操作和逻辑操作

18

2.13.1 关系操作

【例2.13.1-1】关系运算示例。

A=1:9,B=10-A,r0=(A<4),r1=(A==B)

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

【例2.13.1-2】关系运算运用之一:求近似极限,修补图形缺口。

t=-2*pi:pi/10:2*pi;

y=sin(t)./t;

tt=t+(t==0)*eps;

yy=sin(tt)./tt;

subplot(1,2,1),plot(t,y),axis([-7,7,-0.5,1.2]),

xlabel('t'),ylabel('y'),title('残缺图形')

subplot(1,2,2),plot(tt,yy),axis([-7,7,-0.5,1.2])

xlabel('t'),ylabel('yy'),title('正确图形')

Warning: Divide by zero.

图2.13-1 极限处理前后的图形对照

2.13.2 逻辑操作

【例2.13.2-1】逻辑操作示例。注意逻辑运算和关系运算之间的优先级次序。(详见下节的表2.13-5)

A=-3:3;

L1=~(A>0)

L2=~A>0

L3=~A

L4=A>-2&A<1

L1 =

1 1 1 1 0 0 0

L2 =

0 0 0 1 0 0 0

L3 =

0 0 0 1 0 0 0

19

L4 =

0 0 1 1 0 0 0

【例2.13.2-2】逻辑操作应用之一:逐段解析函数的计算和表现。本例演示削顶整流正弦半波的计算和图形绘制。

t=linspace(0,3*pi,500);y=sin(t);

%处理方法一:

z1=((t2*pi)).*y; % <3>

w=(t>pi/3&t<2*pi/3)+(t>7*pi/3&t<8*pi/3);% <4>

w_n=~w; % <5>

z2=w*sin(pi/3)+w_n.*z1; % <6>

subplot(1,3,1),plot(t,y,':r'),ylabel('y')

subplot(1,3,2),plot(t,z1,':r'),axis([0 10 -1 1])

subplot(1,3,3),plot(t,z2,'-b'),axis([0 10 -1 1])

10.80.60.40.2y0-0.2-0.4-0.6-0.8-1051010.80.60.40.20-0.2-0.4-0.6-0.8-1051010.80.60.40.20-0.2-0.4-0.6-0.8-10510图2.13-2

%处理方法二:

z=(y>=0).*y; % <11>

a=sin(pi/3);

z=(y>=a)*a+(y

plot(t,y,':r');hold on;plot(t,z,'-b')

xlabel('t'),ylabel('z=f(t)'),title('逐段解析函数')

legend('y=sin(t)','z=f(t)'),hold off

图 2.13-3

2.13.3 关系、逻辑函数

20

第三章 字符串、元胞和构架数组

MATLAB 6.x版的内建数据类型(Built-in data type)就有5种以上,此外还有许多其他专门设计的类(Class),如符号类、内联函数类、控制工具包中的线性时不变模型类、神经网络类等。就程序设计而言,MATLAB 6.x版采用了面向对象编程技术。数据和编程的改变使用户能更简捷而自然地解决复杂的计算问题(如符号计算问题、多变量控制系统问题、神经网络问题)。本章内容根据MATLAB6.5编写,但绝大部分内容适用于其他MATLAB6.x版本。

第二章介绍了数值数组(Numeric Array),这是读者比较熟悉的数据类型。本章将集中讲述另外三类数据:字符串数组(Character String Array)、元胞数组(Cell array)和构架数组(Structure array)。它们之间的基本差别见表3-1。

表3-1 四种数据类型基本构成比较表

数组类型 基本组分 组分内涵 基本组分占用字节数

8

数值数组 元素 双精度实数标量

16

或双精度复数标量

2

字符串数组 元素 字符

元胞数组 元胞 可以存放任何类型、任何大不定

小的数据。

不定

构架数组 构架 只有挂接在构架上的“域”才能存放数据。数据可以是任何类型、任何大小。

3.1 字符串数组

3.1.1 字符串入门

【例3.1.1-1】先请读者实际操作本例,以体会数值量与字符串的区别。

clear

a=12345.6789

class(a)

a_s=size(a)

a =

1.2346e+004

ans =

double

a_s =

1 1

b='S'

class(b)

b_s=size(b)

b =

S

ans =

char

b_s =

1 1

whos

Name Size Bytes Class

a 1x1 8 double array

1

a_s 1x2 16 double array

ans 1x4 8 char array

b 1x1 2 char array

b_s 1x2 16 double array

Grand total is 10 elements using 50 bytes

3.1.2 串数组的属性和标识

【例3.1.2-1】本例演示:串的基本属性、标识和简单操作。

(1)

a='This is an example.'

a =

This is an example.

(2)

size(a)

ans =

1 19

(3)

a14=a(1:4)

ra=a(end:-1:1)

a14 =

This

ra =

.elpmaxe na si sihT

(4)

ascii_a=double(a)

ascii_a =

Columns 1 through 12

84 104 105 115 32 105 115 32 97 110 32 101

Columns 13 through 19

120 97 109 112 108 101 46

char(ascii_a)

ans =

This is an example.

(5)

w=find(a>='a'&a<='z');

ascii_a(w)=ascii_a(w)-32;

char(ascii_a)

ans =

THIS IS AN EXAMPLE.

(6)

A='这是一个算例。';

A_s=size(A)

A56=A([5 6])

ASCII_A=double(A)

A_s =

1 7

A56 =

算例

ASCII_A =

Columns 1 through 6

54754 51911 53947 47350 52195 49405

Column 7

2

41379

char(ASCII_A)

ans =

这是一个算例。

(7)

b='Example ''3.1.2-1'''

b =

Example '3.1.2-1'

(8)

ab=[a(1:7),' ',b,' .']

ab =

This is Example '3.1.2-1' .

3.1.3 复杂串数组的创建

3.1.3.1 多行串数组的直接创建

【例3.1.3.1-1】多行串数组的直接输入示例。

clear

S=['This string array '

'has multiple rows.']

S =

This string array

has multiple rows.

size(S)

ans =

2 18

3.1.3.2 利用串操作函数创建多行串数组

【例3.1.3.2-1】演示:用专门函数char , str2mat , strvcat创建多行串数组示例。

S1=char('This string array','has two rows.')

S1 =

This string array

has two rows.

S2=str2mat('这','字符','串数组','','由4行组成')

S2 =

字符

串数组

由4行组成

S3=strvcat('这','字符','串数组','','由4行组成')

S3 =

字符

串数组

由4行组成

size(S3)

ans =

5 5

3

3.1.3.3 转换函数产生数码字符串

【例3.1.3.3-1】最常用的数组/字符串转换函数int2str , num2str , mat2str 示例。

(1)

A=eye(2,4);

A_str1=int2str(A)

A_str1 =

1 0 0 0

0 1 0 0

(2)

rand('state',0)

B=rand(2,4);

B3=num2str(B,3)

B3 =

0.95 0.607 0.891 0.456

0.231 0.486 0.762 0.0185

(3)

B_str=mat2str(B,4)

B_str =

[0.9501 0.6068 0.8913 0.4565;0.2311 0.486 0.7621 0.0185]

Expression=['exp(-',B_str,')'];

eval(Expression)

ans =

0.3867 0.5451 0.4101 0.6335

0.7937 0.6151 0.4667 0.9817

【例3.1.3.3-2】综合例题:在MATLAB计算生成的图形上标出图名和最大值点坐标。

clear

a=2;

w=3;

t=0:0.01:10;

y=exp(-a*t).*sin(w*t);

[y_max,i_max]=max(y);

t_text=['t=',num2str(t(i_max))]; % <7>

y_text=['y=',num2str(y_max)]; % <8>

max_text=char('maximum',t_text,y_text); % <9>

%

tit=['y=exp(-',num2str(a),'t)*sin(',num2str(w),'t)']; %<11>

plot(t,zeros(size(t)),'k')

hold on

plot(t,y,'b')

plot(t(i_max),y_max,'r.','MarkerSize',20)

text(t(i_max)+0.3,y_max+0.05,max_text) % <16>

title(tit),xlabel('t'),ylabel('y'),hold off

4

0.60.50.40.3y0.20.10-0.1maximum

t=0.33

y=0.4321y=exp(-2t)*sin(3t)024t6810图 3.1-1

3.1.3.4 利用元胞数组创建复杂字符串

【例3.1.3.4-1】元胞数组在存放和操作字符串上的应用。

a='MATLAB 6.x ';b='includes new data types:';

c1='◆Multidimensional array';c2='◆User-definable data structure';

c3='◆Cell arrays';c4='◆Character array';

c5='◆Function handle';

c=char(c1,c2,c3,c4,c5);

C={a;b;c}; % <5>

disp([C{1:2}]) % <6>

disp(' ') %

disp(C{3}) % <8>

MATLAB 6.x includes new data types:

◆Multidimensional array

◆User-definable data structure

◆Cell arrays

◆Character array

◆Function handle

3.1.4 串转换函数

【例3.1.4-1】fprintf, sprintf, sscanf的用法示例。

rand('state',0);a=rand(2,2);

s1=num2str(a)

s_s=sprintf('%.10en',a)

s1 =

0.95013 0.60684

0.23114 0.48598

s_s =

9.5012928515e-001

2.3113851357e-001

6.e-001

4.8598246871e-001

fprintf('%.5g',a)

0.950130.231140.606840.48598

s_sscan=sscanf(s_s,'%f',[3,2])

s_sscan =

5

0.9501 0.4860

0.2311 0

0.6068 0

3.1.5 串操作函数

3.2 元胞数组

3.2.1 元胞数组的创建和显示

3.2.1.1 元胞标识寻访和内容编址寻访的不同

3.2.1.2 元胞数组的创建和显示

【例 3.2.1.2-1】本例演示:(2×2)元胞数组的创建。

C_str=char('这是','元胞数组创建算例 1');

R=reshape(1:9,3,3);

Cn=[1+2i];

S_sym=sym('sin(-3*t)*exp(-t)');

(1)直接创建法之一

A(1,1)={C_str};A(1,2)={R};A(2,1)={Cn};A(2,2)={S_sym};

A

A =

[2x10 char] [3x3 double]

[1.0000+ 2.0000i] [1x1 sym ]

(2)直接创建法之二

B{1,1}=C_str;B{1,2}=R;B{2,1}=Cn;B{2,2}=S_sym;

celldisp(B)

B{1,1} =

这是

元胞数组创建算例 1

B{2,1} =

1.0000 + 2.0000i

B{1,2} =

1 4 7

2 5 8

3 6 9

B{2,2} =

sin(-3*t)*exp(-t)

3.2.2 元胞数组的扩充、收缩和重组

【例3.2.2-1】元胞数组的扩充。

(1)

C=cell(2);

C(:,1)={char('Another','text string');10:-1:1}

C =

[2x11 char ] []

[1x10 double] []

(2)

6

AC=[A C]

A_C=[A;C]

AC =

[2x10 char] [3x3 double] [2x11 char ] []

[1.0000+ 2.0000i] [1x1 sym ] [1x10 double] []

A_C =

[2x10 char ] [3x3 double]

[1.0000+ 2.0000i] [1x1 sym ]

[2x11 char ] []

[1x10 double] []

【例3.2.2-2】cellplot能用图形形象化地表示元胞数组的内容。(A_C取自上例)

cellplot(A_C,'legend')

otherstructure1+2isparsechardouble图 3.2-1

【例3.2.2-3】元胞数组的收缩和重组。

(1)

A_C(3,:)=[]

A_C =

[2x10 char ] [3x3 double]

[1.0000+ 2.0000i] [1x1 sym ]

[1x10 double] []

(2)

R_A_C=reshape(A_C,2,3)

R_A_C =

[2x10 char] [1x10 double] [1x1 sym]

[1.0000+ 2.0000i] [3x3 double] []

3.2.3 元胞数组内容的调取

【例3.2.3-1】元胞数组内容的调取示例。

(1)

f1=R_A_C(1,3)

class(f1)

f1 =

[1x1 sym]

ans =

cell

(2)

7

f2=R_A_C{1,3}

class(f2)

f2 =

sin(-3*t)*exp(-t)

ans =

sym

(3)

f3=R_A_C{1,1}(:,[1 2 5 6])

f3 =

这是

元胞创建

(4)

[f4,f5,f6]=deal(R_A_C{[1,3,4]})

f4 =

这是

元胞数组创建算例 1

f5 =

10 9 8 7 6 5 4 3 2 1

f6 =

1 4 7

2 5 8

3 6 9

3.2.4 元胞数组转换函数

【例3.2.4-1】常用元胞数组转换函示例。

(1)num2cell 把数值数组转换成元胞数组

rand('state',0);

A=rand(2,3,2)

C1=num2cell(A)

A(:,:,1) =

0.9501 0.6068 0.8913

0.2311 0.4860 0.7621

A(:,:,2) =

0.4565 0.8214 0.6154

0.0185 0.4447 0.7919

C1(:,:,1) =

[0.9501] [0.6068] [0.8913]

[0.2311] [0.4860] [0.7621]

C1(:,:,2) =

[0.4565] [0.8214] [0.6154]

[0.0185] [0.4447] [0.7919]

C2=num2cell(A,1)

C2(:,:,1) =

[2x1 double] [2x1 double] [2x1 double]

C2(:,:,2) =

[2x1 double] [2x1 double] [2x1 double]

C3=num2cell(A,[2,3])

C3 =

[1x3x2 double]

[1x3x2 double]

(2)

clear,x=zeros(4,5);

x(:)=1:20

C4=mat2cell(x, [2 2], [3 2])

8

celldisp(C4)

x =

1 5 9 13 17

2 6 10 14 18

3 7 11 15 19

4 8 12 16 20

C4 =

[2x3 double] [2x2 double]

[2x3 double] [2x2 double]

C4{1,1} =

1 5 9

2 6 10

C4{2,1} =

3 7 11

4 8 12

C4{1,2} =

13 17

14 18

C4{2,2} =

15 19

16 20

(3)

D=cell2mat(C4(1,:))

D =

1 5 9 13 17

2 6 10 14 18

3.3 构架数组

3.3.1 构架数组的创建和显示

3.3.1.1 直接创建法及显示

【例3.3.1.1-1】本例通过温室数据(包括温室名、容积、温度、湿度等)演示:单构架的创建和显示。

(1)

green_='一号房'; % <1>

green_='2000立方米'; % <2>

green_ature=[31.2 30.4 31.6 28.7

29.7 31.1 30.9 29.6];%<3>

green_ty=[62.1 59.5 57.7 61.5

62.0 61.9 59.2 57.5]; %<4>

(2)显示“单构架”结构和内容

green_house % <5>

green_house =

name: '一号房'

volume: '2000立方米'

parameter: [1x1 struct]

green_ter % <6>

ans =

temperature: [2x4 double]

humidity: [2x4 double]

green_ature % <7>

9

ans =

31.2000 30.4000 31.6000 28.7000

29.7000 31.1000 30.9000 29.6000

【例3.3.1.1-2】本例演示构架数组的创建和显示,并利用构架数组保存一个温室群的数据。本例的运行以例3.3.1.1-1为先导。

(1)

green_house(2,3).name='六号房'; % <1>

(2)

green_house % <2>

green_house =

2x3 struct array with fields:

name

volume

parameter

green_house(2,3) % <3>

ans =

name: '六号房'

volume: []

parameter: []

3.3.1.2 利用构造函数创建构架数组

【例3.3.1.2-1】利用构造函数struct,建立温室群的数据库。

(1)

a=cell(2,3);

green_house_1=struct('name',a,'volume',a,'parameter',a(1,2)) % <2>

green_house_1 =

2x3 struct array with fields:

name

volume

parameter

(2)

green_house_2=struct('name',a,'volume',[],'parameter',[]) % <3>

green_house_2 =

2x3 struct array with fields:

name

volume

parameter

(3)

green_hopuse_3(2,3)=struct('name',[],'volume',[],'parameter',[])%<4>

green_hopuse_3 =

2x3 struct array with fields:

name

volume

parameter

(4)

a1={'六号房'};a2={'3200立方米'};

green_house_4(2,3)=struct('name',a1,'volume',a2,'parameter',[]);%<6>

T6=[31.2,30.4,31.6,28.7;29.7,31.1,30.9,29.6]; % <7>

green_house_4(2,3).ature=T6; % <8>

green_house_4

green_house_4 =

10

2x3 struct array with fields:

name

volume

parameter

3.3.2 构架数组域中内容的调取和设置

【例3.3.2-1】本例目的:一,演示函数fieldnames , getfield , setfield的使用方法;二,让读者感受到构架数组对应用工具包的影响;三,演示struct函数把“对象”转换为构架的应用。本例为获得一个演练的构架,借助Toolbox control 工具包中的tf函数,先产生一个用传递函⎡32⎤数描写的LTI线性时不变2输入2输出系统⎢2⎢s+s2+⎢4s3+s1+21s+1⎥⎥。⎣s3+2s2+2s+1s⎥⎦(1)

Stf=tf({3,2;[4 1],1},{[1 3 2],[1 1 1];[1 2 2 1],[1 0]})

Transfer function from input 1

3

#1: -------------

s^2 + 3 s + 2

4 s + 1

#2: ---------------------

s^3 + 2 s^2 + 2 s + 1

Transfer function from input 2

2

#1: -----------

s^2 + s + 1

1

#2: -

s

(2)

SSTF=struct(Stf)

SSTF =

num: {2x2 cell}

den: {2x2 cell}

Variable: 's'

lti: [1x1 lti]

(3)

FN=fieldnames(SSTF)

class(FN)

FN =

'num'

'den'

'Variable'

'lti'

ans =

cell

(4)

FC=getfield(SSTF,'den',{2,1})

FC{1}

11

poly2str(FC{1},'s')

FC =

[1x4 double]

ans =

1 2 2 1

ans =

s^3 + 2 s^2 + 2 s + 1

(5)

{2,1}

SSTF=setfield(SSTF,'num',{2,1},{[1 3 1]});

{2,1}

ans =

0 0 4 1

ans =

1 3 1

3.3.3 构架数组操作深入

3.3.3.1 构架数组的扩充和收缩

【例3.3.3.1-1】本例演示构架数组SSTF的扩充和收缩。(本例以例3.3.2-1的运行为基础。)

(1)

size(SSTF)

ans =

1 1

(2)

SSTF(2,2)=struct(tf(1,[1 1]))

size(SSTF)

SSTF =

2x2 struct array with fields:

num

den

Variable

lti

ans =

2 2

(3)

SSTF(1,:)=[]

S22n=SSTF(1,2).num,S22d=SSTF(1,2).den

printsys(S22n{1},S22d{1})

SSTF =

1x2 struct array with fields:

num

den

Variable

lti

S22n =

[1x2 double]

S22d =

[1x2 double]

num/den =

1

-----

s + 1

12

3.3.3.2 增添域和删除域

【例3.3.3.2-1】对构架数组green_house进行域的增添和删减操作。

(1)

clear,for k=1:10;department(k).number=['No.',int2str(k)];end

department

department =

1x10 struct array with fields:

number

(2)

department(1).teacher=40;department(1).student=300;

department(1).PC_computer=40;

department

department =

1x10 struct array with fields:

number

teacher

student

PC_computer

(3)

department(2).=35;department(2).=13;

D2T=department(2).teacher %第2构架teacher域包含两个子域

D1T=department(1).teacher %第1构架teacher域仅是一个数

D2T =

male: 35

female: 13

D1T =

40

(4)

department(2).teacher=rmfield(department(2).teacher,'male');

department(2).teacher

ans =

female: 13

(5)

department=rmfield(department,'student')

department =

1x10 struct array with fields:

number

teacher

PC_computer

department=rmfield(department,{'teacher';'PC_computer'})

department =

1x10 struct array with fields:

number

3.3.3.3 数值运算操作和函数对构架数组的应用

【例3.3.3.3-1】数值运算操作和函数在构架域上的作用。

n_ex=5;

for k=1:n_ex, ex(k).f=(k-1)*n_ex+[1:5];end

ex

ex =

13

1x5 struct array with fields:

f

%

disp([blanks(10) '构架域中内容'])

for k=1:n_ex,disp(ex(k).f),end

构架域中内容

1 2 3 4 5

6 7 8 9 10

11 12 13 14 15

16 17 18 19 20

21 22 23 24 25

class(ex(1).f)

ans =

double

%

sum_f=zeros(1,5);

for k=1:n_ex,sum_f=sum_f+ex(k).f;end,sum_f

sum_f =

55 60 65 70 75

%

disp([blanks(20) 'ex.f的平方根值'])

for k=1:n_ex, disp(sqrt(ex(k).f)),end

ex.f的平方根值

1.0000 1.4142 1.7321 2.0000 2.2361

2.4495 2.6458 2.8284 3.0000 3.1623

3.3166 3.4641 3.6056 3.7417 3.8730

4.0000 4.1231 4.2426 4.3589 4.4721

4.5826 4.6904 4.7958 4.8990 5.0000

3.3.4 构架数组和元胞数组之间的转换

【例3.3.4-1】指令struct2cell和cell2struct的使用。

(1)

for k=1:5,ex(k).s=['No.' int2str(k)];ex(k).f=(k-1)*5+[1:5];end

(2)

fprintf('%sn','ex.s域的内容 ');fprintf('%s',blanks(4))

for k=1:5;fprintf('%s',[ex(k).s blanks(1)]);end

fprintf('%sn',blanks(1)),fprintf('%sn','ex.f域的内容 ')

for k=1:5;disp(ex(k).f);end

ex.s域的内容

No.1 No.2 No.3 No.4 No.5

ex.f域的内容

1 2 3 4 5

6 7 8 9 10

11 12 13 14 15

16 17 18 19 20

21 22 23 24 25

(3)

C_ex=struct2cell(ex);

size(C_ex)

fprintf('%s',[C_ex{1,1,1},blanks(3)])

fprintf('%5g',C_ex{2,1,1})

ans =

2 1 5

No.1 1 2 3 4 5

14


本文标签: 数组 指令 函数 操作 构架