第三讲 MATLAB编程
编程的基本原理:
数据输入(Input) 数据处理(算法) 数据输出(Output)
1.1 MATLAB数据类型
MATLAB的主要数据类型是数组类型,其中的每一种类型都以数组为基础,都是从数组派生出来的,MATLAB实际上把每种类型的数据作为数组处理。一般把二维数组称为矩阵,1╳n和n╳1数组称为向量,1╳1数组称为数值。
数据类型
char numeric cell struc 其它
double single int,uint
sparse
help datatypes
Data types and structures.
Data types (classes)
double - Convert to double precision.
char - Create character array (string).
logical - Convert numeric values to logical.
cell - Create cell array.
struct - Create or convert to structure array.
single - Convert to single precision.
uint8 - Convert to unsigned 8-bit integer.
uint16 - Convert to unsigned 16-bit integer.
uint32 - Convert to unsigned 32-bit integer.
uint64 - Convert to unsigned 64-bit integer.
int8 - Convert to signed 8-bit integer.
int16 - Convert to signed 16-bit integer.
int32 - Convert to signed 32-bit integer.
int64 - Convert to signed 64-bit integer.
inline - Construct INLINE object.
function_handle - Function handle array.
javaArray - Construct a Java array.
javaMethod - Invoke a Java method.
javaObject - Invoke a Java object constructor.
1.2数组输入与寻访
1 一维数组的创建和寻访
(1)逐个元素输入法
这是最简单,但又最通用的构造方法。以下指令就是一例。
x=[2 pi/2 sqrt(3) 3+5i]
x =
2.0000 1.5708 1.7321
3.0000 + 5.0000i
(2)冒号生成法
这是通过“步长“设定,生成一维“行“数组的方法。该方法的通用格式是;
x=a:inc:b
[说明]
●a是数组的第一个元素,inc是采样点之间的间隔,即步长。若(b-a)是inc的整数倍,
则所生成的数组的最后一个元素等于b,否则小于b。
●inc,b之间必须用冒号“;“分隔。注意:该冒号必须在英文状态下产生。中文状态下的
冒号将导致MATLAB操作错误!
●inc可以省略。省略时,默认其取值为1,即认为inc=1。
●inc可以取正数或负数。但要注意:inc取正时,要保证a
a>b。
x=1:3:11
x =
1 4 7 10
(3)定数线性采样法
该法在设定的“总点数“下,均匀采样生成一维“行“数组。该法的通用格式是:
x=linspace(a,b,n)
[说明]
●a,b分别是生成数组的第一个和最后一个元素。n是采样总点数。该指令生成数组。
●该指令的作用与x=a:(b-a)/(n-1):b相同。
x=linspace(1,11,4)
x =
1.0000 4.3333 7.6667 11.0000
(4)定数对数采样法
该法在设定的“总点数“下,经“常用对数“采样生成一维“行“数组。通用格式是:
x=logspace(a,b,n)
[说明]
●生成数组的第一个元素值为10a,最后一个元素值是10b。n是采样总点数。该指令生成(1
×n)数组。
●在信号处理和控制学科中,常用该指令去产生频率响应的频率自变量采样点。
x=logspace(1,4,4)
x =
10 100 1000 10000
一维数组的子数组寻访和赋值
例1 子数组的寻访(Address)。
rand('state',0) %把均匀分布伪随机发生器置为0状态
x=rand(1,5) %产生
)5
1(
的均布随机数组
x =
0.9501 0.2311 0.6068 0.4860 0.8913
x(3) %寻访数组x的第三个元素。
ans =
0.6068
x([1 2 5]) %寻访数组x的第一、二、五个元素组成的子数组。
ans =
0.9501 0.2311 0.8913
x(1:3) %寻访前三个元素组成的子数组
ans =
0.9501 0.2311 0.6068
x(3:end) %寻访除前2个元素外的全部其他元素。end是最后一个元素的下标。
ans =
0.6068 0.4860 0.8913x(3:-1:1) %由前三个元素倒排构成的子数组
ans =
0.6068 0.2311 0.9501
x(find(x>0.5)) %由大于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
[说明]
●寻访什么样的子数组,取决于数组X(index)中下标index。
●下标index本身可以是单个正整数或正整数数组,但index中的每个元素的取值必须在闭
区间内[1,end]。在此,end是指一维数组的长度,即最大下标。end的这种用法是MATLAB 5.x版新增的。
例2 子数组的赋值(Assign)。
x(3) = 0 %把上例中的第三个元素重新赋值为0
x =
0.9501 0.2311 0 0.4860 0.8913
x([1 4])=[1 1] %把当前x数组的第一、四个元素都赋值为1。
x =
1.0000 0.2311 0 1.0000 0.8913
[说明]
要保证被重新赋值的子数组的长度与送入的数组长度相同。
2 二维数组的创建
二维数组是由实数或复数排列成矩形而构成的。从数据结构上看,矩阵和二维数组没有什么区别。当二维数组带有线性变换含义时,该二维数组就是矩阵。
(1)直接输入法
例3 在MATLAB环境下,用下面三条指令创建二维数组C。
a=2.7358; b=33/79; %这两条指令分别给变量 a ,b 赋值。
C=[1,2*a+i*b,b*sqrt(a);sin(pi/4),a+5*b,3.5+i]
%这指令用于创建二维数组C
C =
1.0000 5.4716 + 0.4177i 0.6909
0.7071 4.8244 3.5000 + 1.0000i
[说明]
●分号“;“在“[]“方括号内时,它是数组行间的分隔符。
●分号“;“作为指令后的结束符时,将不在屏幕上显示该指令执行后的结果。
例4 复数数组的另一种输入方式。
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)利用M文件创建和保存数组
对于今后经常需要调用的数组,尤其是比较大而复杂的数组,为它专门建立一个M文件是值得的。下面通过一个简单例子来说明这种M文件的创建过程。
例5 创建和保存数组 AM的 MyMatrix.m 文件。
●打开文件编辑调试器,并在空白填写框中输入以下内容。
●保存此文件,并且文件起名为MyMatrix.m文件
●以后只要在MATLAB指令窗中,运行MyMatrix.m文件,数组AM就会自动生成于MATLAB内
存中。
(3)利用Array Editor数组编辑器输入数组
●在指令窗,向一个新变量赋“空”矩阵。x=[];
●在内存浏览器中,双击该变量,打开数组编辑器。
●在数组编辑器左上方的行和列栏中定义行和列的大小。
●在数组元素格输入数据。
3数据的保存与获取
●生成mat数据文件
把MATLAB工作空间中一些有用的数据长久保存下来的方法是生成mat数据文件。
>>save —将工作空间中所有的变量存到matlab.mat文件中。
>>save data —将工作空间中所有的变量存到data.mat文件中。
>>save data a b —将工作空间中a和b变量存到data.mat文件中。
●调用已生成的mat文件
下次运行MATLAB时即可用load指令调用已生成的mat文件。
>>load —打开matlab.mat文件。
>>load data —打开data.mat文件。
>>load data a b —打开data.mat文件中的a,b变量。
mat文件是标准的二进制文件,还可以ASCII码形式保存
4 二维数组元素的标识
前面采用算例方式介绍了一维子数组的寻访和赋值。在介绍二维或更高维数组中子数组的寻访赋值之前,首先要阐述单个元素标识和寻访的三种方式。 (1)“全下标”标识
经典数学教科书所引述具体矩阵元素时,采用“全下标“标识法,即指出是“第几行 第几列“的元素。这种标识方法的优点是:几何概念清楚,引述简单。它在MATLAB 的寻访和赋值中最为常用。
对于二维数组来说,“全下标“标识由两个下标组成:行下标,列下标。如A (3,5)就表示在二维数组A 的“第三行第5列“的元素。 (2)“单下标”标识
顾名思义,“单下标“标识就是“只用一个下标来指明元素在数组中的位置“。当然这样做,首先要对二维数组的所有元素进行“一维编号“。所谓“一维编号“是:先设想把二维数组的所有列,按先左后右的次序、首尾相接排成“一维长列“。然后,自上往下对元素位置进行编号。
“单下标“与“全下标“的转换关系:以(m ×n )的二维数组A 为例,若“全下标“元素位置是“第r 行,第c 列“,那么相应的“单下标“为l=(c-l)×m+r 。MATLAB 有两个指令可以实现以上标识方法间的转换。 sun2ind 据全下标换算出单下标 ind2sub 据单下标换算出全下标 (3)“逻辑1”标识
在实际使用中,常会遇到诸如寻找数组中所有大于某值的元素的问题。此时,“逻辑1“标识法就特别得心应手。 例6找出数组??
?
???----=
5311342024A 中所有绝对值大于3的元素。 A=zeros(2,5); %预生成一个(2*5)全零数组 A(:)=-4:5 %运用“全元素”赋值法获得A L=abs(A)>3 %产生与A 同维的“0-1”逻辑值数组
islogical(L) %判断L 是否逻辑值数组。输出若为1,则是。 X=A(L) %把L 中逻辑值1对应的A 元素取出 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 [说明]
L 的元素或是0或是1,它是“逻辑数组“。这种逻辑数组是一种特殊的数据类型。
●所谓“逻辑1“标识法是:通过与A同样的大小的逻辑值数组L中“逻辑值1“所在的位
置,指示A中元素的位置。
例7 演示逻辑数组与一般双精度数值数组的关系和区别。
●逻辑数组与双精度数组的相同之处
Num=[1,0,0,0,1;0,0,0,0,1]; %产生与L数组外表完全相同的“双精度数组”
N_L=Num==L %假如Num与L数值相等,则应得 1 。
c_N=class(Num) %用class指令检查Num的类属
c_L=class(L) %用class指令检查L的类属
N_L =
1 1 1 1 1
1 1 1 1 1
c_N =
double
c_L =
double
●逻辑数组与一般双精度数组的差别
islogical(Num) %检查Num是否属于逻辑数组类
Y=A(Num) %试探Num能否象L一样具有标识作用
ans =
??? Index into matrix is negative or zero. See release notes on changes to logical indices.
[说明]
●该例表明:逻辑数组一方面具有双精度特性,另一方面又区别于一般的双精度数组。
●逻辑数组产生于逻辑函数或逻辑运算,它具有“逻辑标识“能力。
●从本质上说,逻辑数组是双精度数组的子类。它继承了双精度类型数据的全部性质,又
有自己特定的属性和能力。这是应用面向对象编程技术的结果。
5 二维数组的子数组寻访和赋值
明白了前一节的元素标识,就容易理解和掌握二维数组的子数组寻访和赋值,常用的相关指令形式见表。
子数组寻访和赋值格式汇总表
例8不同赋值方式示例。
2( 的全零数组
A=zeros(2,4) %创建)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) %由“单下标行数组”寻访产生A元素组成的行数组
Sa=[10 20 30]' %Sa是长度为3的“列数组”
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的第2、3列元素全赋为1
A =
1 1 1 7
10 1 1 8
1.3 数值数组及运算
数值数组(Numeric Array)和数组运算(Array Operation)始终是MATLAB的核心内容。由于MATLAB 5.x版以上突出了其“面向对象“的特征,这种数值数组(以下简称为数组)就成了MATLAB最重要的一种内建数据类型(Built –in Data Type),而数组运算就是定义在这种数据结构上的方法(Method)。数组是指由一组实数或复数排成的长方阵列(Array)。它可以是一维的“行“或列,它可以是二维的“矩形“,也可以是三维的“若干同维矩形的堆叠“,甚至更高的维数。数组运算是指无论在数组上施加什么运算(加减乘除或函数),总认定那种运算对被运算数组中的每个元素(Element)平等地实施同样的操作。MATLAB精心设计数
组和数组运算的目的在于:(1)使计算程序简单、易读,使程序指令更接近于教科书上的数学计算公式:(2)提高程序的向量化程度,提高计算效率,节省计算机开销。 例9绘制函数
x xe y -=在10≤≤x 时的曲线。
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
图3.1-1
● 第一句指令定义自变量采样数组:以0为起点,每隔0.1取一个采样点,直到1为止。该数组是“长度“为11的“行数组“,或说成(1×11)的数组。
●
第二句指令中,指数函数exp (X )数组x 每个元素求函数值,结果exp (X )数组也是一个(1×11)的数组。而指令中的运算符“.*“,实施数组x 和数组exp (X )对应元素之间相乘。因此,所得结果y 也是(1×11)的数组。由此,读者可以看到数组运算避免了烦冗而效率低下的循环运算。 ● 指令plot ,则根据所得的x 数组和y 数组,绘制曲线。
●
另外还要说明一点:对于定义在连续区间(或域)上的函数,进行数值计算时必须对此给定的连续区间进行适当的采样,得到一个采样值数组。数值计算都是关于这种采样数组进行的。
1 数组运算的常用函数
上面已经概括地给出了数组运算的定义。下面将更清晰地描述常用函数的数组运算本质,更系统地列出具备数组运算能力的函数名称。为叙述方便又兼顾一般性,表述时以二维数组为例。但本节所列函数对任意维数组都适用。 (1) 函数数组运算规则的定义:
(2) 执行数组运算的常用函数
三角函数和双曲函数
指数函数
复数函数
圆整函数和求余函数
坐标变换函数
。
是指:的数组运算规则
函数=数组对于(n m ij n m ij mn m m n n x f X f f x x x x x x x
x ??=?=??
?
?
?
?
?
???)]([)()(,][x x X n)m 2
122221
11211
其他特殊函数
例10 演示pow2的数组运算性质。 A=[1:4;5:8] %生成)42(?数组 A =
1 2 3 4 5 6 7 8
pow2(A) %计算]
[22ij a A
=的结果也是)42(?数组
ans =
2 4 8 16
32 64 128 256 2 数组运算和矩阵运算
从外观形状和数据结构上看,二维数组和(数学中的)矩阵没有区别。但是,矩阵作为一种变换或映射算子的体现,矩阵运算有着明确而严格的数学规则。而数组运算是MATLAB 软件所定义的规则,其目的是为了数据管理方便、操作简单指令形式自然和执行计算的有效。两者运算有根本区别。
数组运算和矩阵运算指令对照汇总
例21 两种不同转置的比较
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
矩阵加减和数组加减(相同)
a=[1 2 3 ;4 5 6;7 8 9];
b=[1 4 7;8 9 10;11 12 13];
c=a+b
c =
2 6 10
12 14 16
18 20 22
矩阵与标量的加减(无数组运算)
d=c-1
d =
1 5 9
11 13 15
17 19 21
矩阵乘和数组乘
x=[2 3 4 5;1 2 2 1];
y=[0 1 1;1 1 0;0 0 1;1 0 0];
z=x*y
z =
8 5 6
3 3 3
A=[11 12 13 14 15;16 17 18 19 20];
B=[1 2 3 4 5;6 7 8 9 10];
C=A.*B
C =
11 24 39 56 75
96 119 144 171 200
矩阵的数乘和数组的数乘(相同)
a=[2 3 4 5
1 2 2 1];
b=a*2
b =
4 6 8 10
2 4 4 2
矩阵除和数组除
有两种除法运算:左除(\)和右除(/)
a\b=inv(a)*b
b/a=b*inv(a)
a=[1 2 3 ;4 2 6;7 4 9];
b=[4;1;2];
x=a\b
x =
-1.5000
2.0000
0.5000
x=[1 2 3];
y=[4 5 6];
z1=x.\y
z2=x./y
z1 =
4.0000 2.5000 2.0000
z2 =
0.2500 0.4000 0.5000
矩阵乘方和数组乘方
矩阵乘方分几种情况:
●当 A为方阵,p为大于1的整数时
●当 A为方阵,p为非整数时,若有特征值分解AV=VD,定义A^p=VD.^PV-1 A=[1 2 3;4 5 6;7 8 9];
Ap=A^0.3
Ap =
0.6962 + 0.6032i 0.4358 + 0.1636i 0.1755 - 0.2759i
0.6325 + 0.0666i 0.7309 + 0.0181i 0.8292 - 0.0305i
0.5688 - 0.4700i 1.0259 - 0.1275i 1.4830 + 0.2150i
[V,D]=eig(A)
AAp=V*diag([D(1,1)^0.3,D(2,2)^0.3,D(3,3)^0.3])/V
V =
0.2320 0.7858 0.4082
0.5253 0.0868 -0.8165 0.8187 -0.6123 0.4082 D =
16.1168 0 0 0 -1.1168 0 0 0 -0.0000 AAp =
0.6962 + 0.6032i 0.4358 + 0.1636i 0.1755 - 0.2759i 0.6325 + 0.0666i 0.7309 + 0.0181i 0.8292 - 0.0305i 0.5688 - 0.4700i 1.0259 - 0.1275i 1.4830 + 0.2150i Aap=A.^0.3 Aap =
1.0000 1.2311 1.3904 1.5157 1.6207 1.7118 1.7928 1.8661 1.9332 标量的矩阵乘方和标量的数组乘方 特征值分解AV=VD
pA=(0.3)^A
pA =
2.9342 0.4175 -1.0993 -0.0278 0.7495 -0.4731 -1.9898 -0.9184 1.1531
paA=0.3.^A paA =
0.3000 0.0900 0.0270 0.0081 0.0024 0.0007 0.0002 0.0001 0.0000 3 数组的关系运算
关系运算符: = = ~= > < >= <= A=[1 2 3;4 5 6;7 8 9]; x=5;
X=5*ones(3) Ax=x>=A AX=X>=A X =
5 5 5 5 5 5 5 5 5 Ax =
1 1 1 1 1 0
1
11...-????
??????=V
p p V p dnn d A
0 0 0
AX =
1 1 1
1 1 0
0 0 0
4 数组逻辑运算
逻辑运算符 & | ~
A=[1, 2, 3;4, 5, 6];
B=[-1, 0, 0;0, 0.5, 0];
AandB=A&B
AorB=A|B
notB=~B
AandB =
1 0 0
0 1 0
AorB =
1 1 1
1 1 1
notB =
0 1 1
1 0 1
a=1&0+3
a =
1
b=3>4&1
b =
5 特殊运算符
冒号(:)
●冒号可以用来输入行向量
a=1:-1/4:1/16
a =1.0000 0.7500 0.5000 0.2500
●冒号能够从向量、矩阵中挑选指定的元素、行和列
a(:) 将a的全部元素按列拉长生成一个列向量
a(:,j) 得到a的第j列
a(i,:) 得到a的第I列
a(:,j:k) 得到[a(: j);a(: j+1);…;a(: k)]
a(j:k) 得到[a( j);a( j+1);…;a( k)],即拉长后列向量的元素a=[1 2;3 4;5 6]
b=a(:)
a =
1 2
3 4
5 6
b =
1
3
5
2
4
6
a(:)=11:16
a =
11 14
12 15
13 16
a=[1 2 3;4 5 6;7 8 9];
c=a(:,2)
d=a(3,:)
c = 2
5
8
d = 7 8 9
e=a(2:3,1:2)
f=a(1:2,:)
e = 4 5
7 8
f = 1 2 3
4 5 6
g=a(3:7)
g = 7 2 5 8 3
分号(;)
●在方括号内,表示分隔矩阵的行
●作语句结束符,以分号结束的语句在执行时,不显示运行结果
逗号(,)
●在方括号内,表示分隔矩阵的列
a=[1,2,3;4,5,6;7 8 9]
a =
1 2 3
4 5 6
7 8 9
●用于矩阵下标变量时,可分隔元素的下标,如a(2,3)
●用于函数定义或函数调用时,分隔函数的形参或实参
●MATLAB的程序可以一行多个语句,语句之间以逗号相隔
圆括号()
●作为一个运算符,()中表达式可优先运算
●()出现在函数中,括号中放置函数参数
●生成向量的非直接下标
a=[3 6 9 2 4 8 9];
b=[2 6 4];
a(b)
ans = 6 8 2
●生成矩阵的非直接下标
A=[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];
v=[4 2];
w=[2 4];
B=A(v,w)
A([1 5],:)=A([5 1],:)
B =
17 19
7 9
A =
21 22 23 24 25
6 7 8 9 10
11 12 13 14 15
16 17 18 19 20
1 2 3 4 5
方括号
●用于构成向量和矩阵
●用于构成空阵
X =[ ]
A=[1 2 3 4 5 6;7 8 9 10 11 12;13 14 15 16 17 18];
A(:,[2 5])=[ ]
A =
1 3 4 6
7 9 10 12
13 15 16 18
●当“[”和“]”出现在赋值号“=”左边时,表示函数返回多项结果
a=[1 2 3;4 5 6;7 8 9];
[v,d]=eig(a)
v =
0.2320 0.7858 0.4082
0.5253 0.0868 -0.8165
0.8187 -0.6123 0.4082
d =
16.1168 0 0
0 -1.1168 0
0 0 -0.0000
省略号…用于语句行尾端表示该行未完
b=1+1/2+1/4+1/8+1/16+1/32+1/64+1/128+...
+1/256+1/512+1/1024
b =1.9990
6 常用矩阵的生成
单位阵eye(n) eye(m,n)
全一阵ones(n) ones(m,n)
全零阵zeros(n) zeros(m,n)
均匀分布随机阵rand(n) rand(m,n)
正态分布随机阵 randn(n) randn(m,n)
rand(3,4)
ans =
0.3497 0.6207 0.1469 0.1169
0.3424 0.4310 0.5918 0.7986
0.2149 0.0334 0.0916 0.5366
rand('seed',0) %将随机发生器状态设为初始状态
X=rand(1,10000);
N05=sum(X<=0.5)
N05 = 4957
7 特殊矩阵的生成
compan 伴随阵 diag 对角阵
gallery 试验矩阵 hadamand Hadamand 阵
hankel Hankel阵 hilb Hilbert阵
invhilb 逆Hilbert阵 kron Kronecker张量积magic 魔方阵 pascal Pascal三角阵 a=pascal(6)
a =
1 1 1 1 1 1
1 2 3 4 5 6
1 3 6 10 15 21
1 4 10 20 35 56
1 5 15 35 70 126
1 6 21 56 126 252
b=magic(6)
b =
35 1 6 26 19 24
3 32 7 21 23 25
31 9 2 22 27 20
8 28 33 17 10 15
30 5 34 12 14 16
4 36 29 13 18 11
8 矩阵结构变换(旋转、变维、抽取等)
fliplr(x) 将x左右翻转
flipup(x) 将x上下翻转
rot90(x) 将x逆时针方向旋转90度
reshape(x,m,n) 将矩阵x变成维数m×n的矩阵
v=diag(A) 返回A的主对角线元素
v=diag(A,k) 返回A的第k条对角线元素
A=diag(v) 构成由向量v放在主对角线上的矩阵
A=diag(v,k)
L=tril(A) 返回A的下三角部分
L=tril(A,k)
U=triu(A) 返回A的上三角部分
U=triu(A,k)
k=0时即为主对角线,k为正值时为上方第k条对角线,k为负值时为下方第k条对角线
A=[1 2 3 4 ;5 6 7 8;9 10 11 12]
B1=rot90(A)
BT=A'
A = 1 2 3 4
5 6 7 8
9 10 11 12
B1 =
4 8 12
3 7 11
2 6 10
1 5 9
BT =
1 5 9
2 6 10
3 7 11
4 8 12
B=reshape(A,2,6)
C=zeros(2,6)
C( : )=A(: )
B =
1 9 6 3 11 8
5 2 10 7 4 12
C =
0 0 0 0 0 0
0 0 0 0 0 0
C =
1 9 6 3 11 8
5 2 10 7 4 12
A=[1 2 3 4 ;5 6 7 8;9 10 11 12]
LA=tril(A,-1)
UA=tril(A,1)
V=diag(v)
A =
1 2 3 4
5 6 7 8
9 10 11 12
v =
1
6
11
LA =
0 0 0 0
5 0 0 0
9 10 0 0
UA = 1 2 0 0
5 6 7 0
9 10 11 12
V = 1 0 0
0 6 0
0 0 11
1.4 字符串数组及运算
1 字符串是单引号括起来的一行字符序列。
字符串是字符的ASCII码值构成的矩阵(字符数组),每个字符占2字节。
其中空格也是字符
s='Good Morning'
size(s)
s =Good Morning
ans =1 12
字符串为具有特殊属性的数组,当然可以按照通常数组那样对其进行操作。
字符串中可有单引号,但必须写成两个。
v='I can''t find the book'
字符串可以直接拼接
u='Good ';
v='Morning';
w =[u v]
w =Good Morning
2 字符串的操作函数
abs 将字符串变成ASCII码值
blanks(n) 创建n个空格字符串
char 把ASCII码及其它非数值类型数据转换成字符串 delblanks 移去字符串尾部的空格字符
dec2hex 将十进制数变为十六进制字符串
double 将字符串转换为双精度数值
eval 运行含有MATLAB表达式的字符串
findstr 从一个字符串中寻找是否包含另一个字符串
hex2dec 将十六进制字符串变为十进制整数