matlab学习笔记【09-11-14】
本帖最后由 木长春 于 2010-2-13 20:05 编辑2010年2月13日:
由于几个月来都无法登上网站,没有能关注过帖子真是不好意思啊!今天终于在高人指点下用代理等上了,呵呵,高兴啊!尤其是看到自己的帖子被加精更是受宠若惊啊,谢谢大家的支持啊!今天正好是大年三十,祝大家新年快乐啊
安装的matlab2007a时不时的就会出现java错误,虽然按Crtl+C能结束错误,继续使用,但总感觉不爽。所以就决定下载matlab2009a安装。
在这和大家分享一下
matlab2009a(windows)的下载地址:ed2k://|file|[矩陣實驗室].Mathworks.Matlab.R2009a.ISO-TBE.iso|4349970432|425C2D2F0A9E7995BA0069EEE8810BE4|h=FVZD4HD5T**L2F5C44KI4XBKBZV7YS6|/ 存在同样问题的朋友可以换了试试。
继续今天的学习笔记吧,呵呵
今天在网上找了一个Matlab教程,感觉还不错,挺全面。第一章讲的主要是Matlab软件的介绍在这就不多说了,今天下午主要学习了第二章Matlab的基本数学功能。
MATLAB 提供的两种运算方式:
(1)普通的数组运算方式:(Array computation) 在数组中对应元素之间进行运算;
(2)矩阵运算方式:(matrix computations) 将标量当作1×1阶矩阵,一维数组当作一行或一列的矢量(即1×n阶或 n×1阶的矩阵),二维数组当作m×n阶矩阵,然后按照矩阵的运算规则进行运算
*二者输入形式和书写方法相同,差别仅在于使用不同的运算符号(而数组在进行乘除运算时要在通常的符号前加“.”,如:“.*” 和“./” (或“.\” )),执行不同的计算过程,数组的运算比较简单,是对应元素之间的运算;而矩阵运算是根据矩阵的运算规则进行。
1.+-运算比较简单。矩阵进行加减时,两个运算对象必须是同阶矩阵
2、乘除运算(Multiplication and division)
矩阵在进行乘除运算时与通常的运算符号相同(*, /, \ ),而数组在进行乘除运算时要在通常的符号前加“.”,如:“.*” 和“./” (或“.\” )
(1) 矩阵乘法:(Matrix multiplication)
条件:两矩阵中前一矩阵的列数与后一矩阵的行数相同,如
>>x=;
y=;
x*y
ans =
19 22
43 50
也可以实现两个相同维数矢量的内积(点乘,dot product),如:
>>a=[-1 0 2 ] % (输入行矢量转置为列矢量,等同于a=[-1;0;2])
b=[-2 -1 1]
a*b'
b*a'
a =
-1 0 2
b =
-2 -1 1
ans =
4
ans =
4
MATLAB计算点乘(dot product)和叉乘(cross product)有专门的命令,用dot(a,b)计算矢量a和b的点乘,用cross(a,b)计算叉乘
矩阵可以和标量相乘,标量可以是乘数也可以是被乘数,都是将矩阵中的每一个元素与标量相乘如:
>> x=[-1 0 2];
pi*x
ans =
-3.1416 0 6.2832
(2) 数组的乘法 (Array multiplication)
条件:a,b两数组必须有相同的维数,则a.*b 表示a和b中对应元素之间相乘,即z(i,j)=x(i,j)*y(i,j).如:
>> x=;
y=;
z=x.*y
z =
4 10 18
(3) 矩阵除法 (Matrix division)
条件:a矩阵是非奇异方阵,则a\b(左除)和b/a(右除)都可以实现a\b等效于a矩阵的逆左乘b矩阵,即a\b=inv(a)*b, b/a等效于a矩阵的逆右乘b矩阵,即b/a=b*inv(a).
通常x=a\b 是a*x=b 的解,x=b/a 是x*a=b的解一般a\ bb/a,
右除与左除的关系为:(b/a)=(a\b),如;
>> a=rand(3)
b=rand(3)
c=a\b
d=b/a
w=(b/a)'
t=a'\b'
a =
0.8147 0.9134 0.2785
0.9058 0.6324 0.5469
0.1270 0.0975 0.9575
b =
0.9649 0.9572 0.1419
0.1576 0.4854 0.4218
0.9706 0.8003 0.9157
c =
-2.5775 -1.3591 -0.0618
3.0365 2.0130 -0.0863
1.0462 0.8110 0.9734
d =
0.8306 0.3601 -0.2991
1.0730 -0.8795 0.6307
0.3442 0.6978 0.4577
w =
0.8306 1.0730 0.3442
0.3601 -0.8795 0.6978
-0.2991 0.6307 0.4577
t =
0.8306 1.0730 0.3442
0.3601 -0.8795 0.6978
-0.2991 0.6307 0.4577
(4) 数组的除法(Array division)
条件:a与b必须具有相同的维数,符号. \ 、. / ,a.\b 表示b中的元素分别除以a中的对应元素,即z(i,j)=x(i,j)\y(i,j)=y(i,j)/x(i,j) 如:
>> x=;
y=;
z=x.\y
z =
4.0000 2.5000 2.0000
3、乘方(Power)
(1) 矩阵的乘方(Matrix power) 符号 ^
条件:在a^p 中a, p不可都是矩阵,必须一个是标量,一个是方阵
a^p 意思是a的p次方
*a是一个方阵,p是一个标量,且p是大于1的整数,则a的p次幂即为a自乘p次
*如p是不为整数的标量时,a^p=V*D.^p/V 其中D为矩阵a的特征值矩阵,V为对应的特征矢量阵,可用eig函数求出D和V, =eig(a).
*当p是方阵而a是标量时,a^p=V*a.^D/V, 其中=eig(p).
(2) 数组的乘方(Array power) 符号 .^
条件:在底与指数均为数组的情况下,要求他们的维数必须相同
*当底和指数为同样大小的数组时,x.^y 为对应的元素做乘方运算如:
>> x=;
y=;
z=x.^y
z =
1 32 729
这时执行的实际运算为:
z=x.^y=.^==
*若指数是标量,执行的运算是底的每一个元素执相同幂次的运算既z(i,j)=x(i,j)^2
如:
>> x=;
z=x.^2
z =
1 4 9
这时执行的运算为:
z=.^2==
*若底是一个标量,指数是一个数组,执行的运算是用指数数组的每个元素对底进行乘方运算,即:z(i,j)=2^x(i,j),形成新的数组 如:
>> x=;
z=2.^x
z =
2 4 8
这时执行的运算为:
z=2.^x=2.^=
4、转置:(Transpose) 行列转置,符号'
如;计算矩阵a的转置:
>> [-1 0 2]'
ans =
-1
0
2
二、数学函数和矩阵函数( Mathematic function and matrix function)
1、数学函数(Math function)
(a). 基本函数:(Elementary function)三角函数(Trigonometric Function)指数函数(Exponent function)复数函数(Complex Function)取整和求余函数(round and remain function)
例:
>> a=
b=fix(pi*a) %朝零方向取整
pi*b
c=cos(pi*b)
a =
1 2 3
4 5 6
b =
3 6 9
12 15 18
ans =
9.4248 18.8496 28.2743
37.6991 47.1239 56.5487
c =
-1 1 -1
1 -1 1
说明:
(1)三角函数按弧度计算
(3)除后取模mod(x,y)与y符号相同,除后取余数rem(x,y)与x符号相同,当x与y符号相同时,mod(x,y)等于rem(x,y). (这一点要注意)
例:
>> x=;
y=;
M=mod(x,y)
R=rem(x,y)
M =
3 0 1
R =
3 0 1
>> x=[-11 25 -31];
y=;
M=mod(x,y)
R=rem(x,y)
M =
1 0 5
R =
-3 0 -1
(b) 特殊函数(Special function):特殊数学函数(special mathematics function)数理函数(Mathematic analysis function)坐标变换(Coordinates transformation function)
2、矩阵函数(Matrix function):矩阵分析(Matrix Analysis)线性方程组(linear system of equations)特征值和特征矢量(Eigenvalues and eigenvectors).矩阵函数(Matrix function)因式分解(Factor analysis) 等矩阵函数
有些矩阵函数与数学函数名称相似,区别在于矩阵函数名称后有m字符
例:
>> a=;
r1=sqrt(a)
r2=sqrtm(a)
r1 =
1 2
3 4
r2 =
0.4662 + 0.9359i 0.8860 - 0.2189i
1.9935 - 0.4924i 3.7888 + 0.1152i
三、关系运算与逻辑运算(Relational calculus and Logical operation)
1.关系运算(Relational calculus):
条件:对于两个矩阵的关系运算,两边的矩阵必须具有同样尺寸
关系运算符:(Relational operator)
﹤小于(less than) ﹤=小于等于(less than or equal to) ﹥大于(greater than) ﹥=大于等于(greater than or equal to) == 等于(equal to) ~=不等于(not equal to ,NE)
例:标量
>> 2+2~=4
ans =
0
矩阵:
a=;
b=[-3 1 2];
a<b
ans =
0 1 0
a<=b
ans =
0 1 1
a>b
ans =
1 0 0
a>=b
ans =
1 0 1
a==b
ans =
0 0 1
a~=b
ans =
1 1 0
2、逻辑运算(Logical operation)
逻辑运算符:(Logical operator)
& 与(AND), | 或(OR), ~ 非(NOT)
条件:对于两个矩阵的逻辑运算,两边的矩阵必须具有同样尺寸
~是一元算符,当a为零时,返回信息为1,为非零时,返回信息为0;p|(~p)返回值为1,p&(~p) 返回值为0
例:
>> a=;
b=[-1 0 0; 0 0.5 0];
a&b
ans =
1 0 0
0 1 0
3、关系函数和逻辑函数 (Relational function and Logical function)
例:
>> a=magic(6) %建立6阶魔术矩阵,元素由1~n2组成
p=(rem(a,3)==0) %对a求余,有余数置0,无余数置1。由于matlab语法和C语言相似,z对于优先级相同的运算是从右向左进行,所以这个式子还可以写成p=rem(a,3)==0
format +;p %以format +格式给出p的压缩格式
format %将显示格式转换为缺省的短格式
y=a;
i=find(y>10); %找出y矩阵中大于10的元素的位置i
y(i)=10*ones(1) %用10代替y中所有大于10 的元素
a =
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
p =
0 0 1 0 0 1
1 0 0 1 0 0
0 1 0 0 1 0
0 0 1 0 0 1
1 0 0 1 0 0
0 1 0 0 1 0
p =
+ +
+ +
+ +
+ +
+ +
+ +
y =
10 1 6 10 10 10
3 10 7 10 10 10
10 9 2 10 10 10
8 10 10 10 10 10
10 5 10 10 10 10
4 10 10 10 10 10 本帖最后由 木长春 于 2009-11-14 20:53 编辑
四、基本字符处理功能(Elementary Symbolic treatment function)
1. 字符数组的建立(Setting of Symbolic array)
(1)字符串(string of character)就是字符数组(Character arry),MATLAB 中所有字符串都用单引号界定后输入或赋值,yesinput除外
例如:
>> s1='He llo'
s1 =
He llo
>> size(s1)
ans =
1 6
字符串中空格也是字符,上例为1×6阶矩阵:
(2)利用class 函数和 ischar函数可以判别变量是否为字符串,如:
>> class(s1)
ans =
char
>> ischar(s1)
ans =
1
(3) 可以用方括号(square bracket)将字符串合并成更大的串,例如:
>> s=['Hello','Word']
s =
HelloWord
(4) 可以从一个字符串中提取子串(sub string),例如:
>> ss=s(6:9)
ss =
World
(5) 可以将字符串中的字符倒序排列例如:
>> a='a b c d'
b=a(end:-1:1)
a =
a b c d
b =
d c b a
(6) 建立二维数组(two dimensional array)一样可以直接输入,只须加方括号,并用分号分行,每行字数必须一致,不足处可用空格补充 例如:
>> str=['name';'type';'size'] %字符串的长度必须相同
str =
name
type
size
还可用str2mat函数把字符串转化为字符数组,这种方法允许用不同长度的字符串例如:
>> s2=str2mat('abc','abcde')
s2 =
abc
abcde
2、字符数组的运算(Operation of symbolic array)
(1)字符以ASC码存储,用double命令可以查出字符的ASC码值
>> double(s2) %s2=str2mat('abc','abcde')
ans =
97 98 99 32 32
97 98 99 100 101
(2) 用char命令可以实现ASC码向字符的转换.如:
>> char()
ans =
ABCD
(3) ischar函数用来检测变量是否为字符变量,返回1为肯定,返回0为否定
(4)strcmp函数具有比较字符串的功能,如执行strcmp(str1,str2), 返回1 表示str1=str2, 返回0 表示str1~=str2.
五、建立特殊数组(矩阵)(setting a special array, matrix)
1、标准数组(或矩阵)函数:(Standard array function)可以用于辅助编程或运算的一些基本数组或矩阵
2、由小数组建立大数组:(generating a big array by using small array)
3、大数组可由方括号中的小数组建立,如有矩阵
>> a= %可利用它建立一个大矩阵
c=
a =
1 2 3
4 5 6
7 8 9
c =
1 2 3 1 0 0
4 5 6 0 1 0
7 8 9 0 0 1
1 1 1 30 36 42
1 1 1 66 81 96
1 1 1 102 126 150
注意:在同一行的各个小数组要有相同的行数,在同一列上的小数组要有相同的列数
3. 冒号的使用(The using of colon)
(1)产生一维数组(Initialize a one dimensional array),如:
>> x=1:5
x =
1 2 3 4 5 产生一个1 到5单位增量的一维数组
可产生任意增量的一维数组,如:
>> y=0:pi/4:pi
y =
0 0.7854 1.5708 2.3562 3.1416 (增量为:/4=0.7854)
>> z=6:-1:1
z =
6 5 4 3 2 1 (增量为-1)
(2)用来产生简易的表格;如为产生一个纵向表格形式,可先分别计算产生两个一维数组,在进行转置形成列向数组
>> x=(0:0.2:2);
y=exp(-x).*sin(x);
ans =
0 0
0.2000 0.1627
0.4000 0.2610
0.6000 0.3099
0.8000 0.3223
1.0000 0.3096
1.2000 0.2807
1.4000 0.2430
1.6000 0.2018
1.8000 0.1610
2.0000 0.1231
4、下标的使用(The using of subscript)
(1) 元素定位:(locate a element)单个的数组元素的位置可在括号中用下标来表达,如:
a=
其中a(3,3)=9 a(1,3)=3, a(3,1)=7,可用带下标的元素表达式进行运算和赋值产生新元素,如:
>> a(3,3)=a(1,3)+a(3,1)
a =
1 2 3
4 5 6
7 8 10
下标可以是一个一维数组对于矩阵来说,利用下标可以调动某些元素构成新的子数组。
设b是一个10×10阶数组,则
b(1:5,3) %指b中的第1行到第5行处于第三列的元素组成5×1阶子数组
B(1:5, 7:10) %指前5行处于后四列中的元素构成5×4阶的子数组
B(: , )=c(:, 1:3) %表示将C数组的前三列赋值给b数组的第三、第五和第十列
A(:,n:-1:1) %即为由原来a数组中取n至1负增长的列元素组成一个新的数组,其行数为a数组的行数,列数为n
例 :
>> a=;
v=1:3;
w=;
a(v,w)
ans =
3 1 2
6 4 5
9 7 8
(2) 改变数组尺寸(Change the size of array)
例:将一个2×3 阶的数组改变为6×1阶
>> a=;
b=a(:)
b =
1
4
2
5
3
6
可利用(:)置换数组元素: 如
>> a(:)11:16
a =
11 13 15
12 14 16
也可以用一个与a有相同元素的变量进行赋值,如b=11:16, a(:)=b,结果与上例相同
数组尺寸可以reshape命令实现,如:
>> a=;
b=reshape(a,4,2)
b =
1 3
5 7
2 4
6 8
也可以将矢量变为数组例:
>> a=reshape(1:10,2,5)
a =
1 3 5 7 9
2 4 6 8 10
5、一维逻辑数组(one dimensional logical array): 逻辑数组是一维数组,元素非0即1,是关系运算和逻辑运算的结果,在与其他数组作用时起到一个开关的作用,设a是一个m×n阶数组,L是一个m×1阶的逻辑数组,a(L,:)将给出L中非零元素所对应的a的行元素组成的子数组如果L不是逻辑数组,需要用logical 命令说明一下:L=logical(L),如:
>> a=;
L=;
L=logical(L); %如L不是逻辑数组需用logical命令说明
a(L,:) %a(L,:)给出L中非0元素所对应a的行元素组成的数组
ans =
1 2 3
4 5 6
也可用a(:,L) 对列进行取舍(无论L是行还是列数组,它只按其下标数对矩阵的行或列进行取舍)
ans =
1 2
4 5
7 8
还有其它元素的取舍方法,如:
命令 x=x(x<=3*std(x))是把那些大于3倍标准差的元素保留下来
>> x=;
x=x(x<=3*std(x));
x=magic(9)
L=x(:,3)>10
x=x(L,:) %是将x中第三列元素大于10的元素所对应的行保留,组成新的x取代原数组
x =
47 58 69 80 1 12 23 34 45
57 68 79 9 11 22 33 44 46
67 78 8 10 21 32 43 54 56
77 7 18 20 31 42 53 55 66
6 17 19 30 41 52 63 65 76
16 27 29 40 51 62 64 75 5
26 28 39 50 61 72 74 4 15
36 38 49 60 71 73 3 14 25
37 48 59 70 81 2 13 24 35
L =
1
1
0
1
1
1
1
1
1
x =
47 58 69 80 1 12 23 34 45
57 68 79 9 11 22 33 44 46
77 7 18 20 31 42 53 55 66
6 17 19 30 41 52 63 65 76
16 27 29 40 51 62 64 75 5
26 28 39 50 61 72 74 4 15
36 38 49 60 71 73 3 14 25
37 48 59 70 81 2 13 24 35
6. 建立多 维数组:(Setting a multidimensional array) 大于二维的高阶数组(m×n×p×阶)
(1)利用下标建立多 维数组(setting a multidimensional array by using subscript)
先建立二维数组,再将其扩展为多 维数组, 如:
>> a=;
a(:,:,2)= %利用下标建立第三维
a(:,:,1) =
5 7 8
0 1 9
4 3 6
a(:,:,2) =
1 0 4
3 5 6
9 8 7
(2)用标准数组函数建立多 维数组(setting a multidimensional array by using standard array function)
函数b=randn(m,n,p) 建立m×n×p阶矩阵, 如
>> b=randn(4,3,2)
b(:,:,1) =
-0.3034 -1.1471 1.4384
0.2939 -1.0689 0.3252
-0.7873 -0.8095 -0.7549
0.8884 -2.9443 1.3703
b(:,:,2) =
-1.7115 0.3129 0.6277
-0.1022 -0.8649 1.0933
-0.2414 -0.0301 1.1093
0.3192 -0.1649 -0.8637
类似的函数还有 ones, zeros 等函数
(3)用repmat函数建立多 维数组,(setting a multidimensional array by using repmat function)
B=repmat(x, ) %即建立一个所有元素都为x的m×n×p阶数组如:
B=repmat(5, )
B(:,:,1) =
5 5 5 5
5 5 5 5
5 5 5 5
B(:,:,2) =
5 5 5 5
5 5 5 5
5 5 5 5
为3×4×2阶数组
x也可以是数组,如:
>> b=repmat(, ) %建立了一个4×8×3阶的数组
b(:,:,1) =
1 2 1 2 1 2 1 2
3 4 3 4 3 4 3 4
1 2 1 2 1 2 1 2
3 4 3 4 3 4 3 4
b(:,:,2) =
1 2 1 2 1 2 1 2
3 4 3 4 3 4 3 4
1 2 1 2 1 2 1 2
3 4 3 4 3 4 3 4
b(:,:,3) =
1 2 1 2 1 2 1 2
3 4 3 4 3 4 3 4
1 2 1 2 1 2 1 2
3 4 3 4 3 4 3 4
(4) 用改变数组尺寸的方法建立多 维数组(setting a multidimensional array by using the method of size variation)
利用reshape函数改变数组尺寸,如
>> a=reshape(1:24,2 , 4, 3) %将一个1~24阶组成的一维数组变为2×4×3阶的**数组。
%元素的排列顺序是从第一层第一列开始,接下来排第二列,直至完成第一层,然后再从第二排第一列排,依此类推
a(:,:,1) =
1 3 5 7
2 4 6 8
a(:,:,2) =
9 11 13 15
10 12 14 16
a(:,:,3) =
17 19 21 23
18 20 22 24
(5) 用数组串联的方法建立多 维数组(setting a multidimensional array by using the method of array series arrangement)
cat函数可以沿指定维数输入数据,如:
>> b=cat(3,,) %表示沿第三维的方向建立两层数组
b(:,:,1) =
2 8
0 5
b(:,:,2) =
1 3
7 9
6、空数组:(Empty array) 语句[ ]将一个0×0阶的数组赋给X, 存在于工作空间,具有空尺寸,与起清除工作空间的clear命令完全不同
如程序n<1, x=1:n 会产生空数组
若要将某些行与列从数组中移去,采用将其置为空数组是一种有效的方法如:
a =[1 2 3
4 5 6
7 8 9]
a(:,)=[ ]
a=
2
5
8
%The program for Kic calculation
Af=input('疲劳裂纹长度(mm):a='); %The length of crack
A0=input('机加裂纹长度(cm):a0=');
Al=(Af.*0.1+A0)
Pq=input('载荷(kN):Pq='); %The load level when crack is just opning
W=5;
B=2.5;
R=Al/W
FR=(2+R).*(0.886.*ones(size(R))+4.64*R-13.32*R.^2+14.72*R.^3-5.6*R.^4)./(1-R).^(3/2)
Kq=(Pq./(B*(W^(1/2)))).*FR 一维逻辑数组和多 维数组、空数组没太仔细看,明天再看,弄一下午了。呵呵,去歇歇 楼主真的辛苦啦。不过我真的没有时间看啊。不好意思啊
。 很不错。证用得着,:victory::victory::victory:支持楼主 这帖子不错,应该可以加为精华帖。 辛苦了。。 谢谢楼主,希望楼主坚持更新,我们一定顶上。 很不错,不过楼主只是刚刚开始,也只学到了最基本的知识,不过是Matlab强大功能的冰山一角而已,请再接再厉吧,加油! 非常实用的帖子,谢谢楼主了:victory: