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=((t
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);
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
版权声明:本文标题:Matlab经典教程——从入门到精通 内容由网友自发贡献,该文观点仅代表作者本人, 转载请联系作者并注明出处:http://www.roclinux.cn/b/1708822924a532004.html, 本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容,一经查实,本站将立刻删除。
发表评论