木长春 发表于 2009-11-14 19:59

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: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

木长春 发表于 2009-11-14 20:55

一维逻辑数组和多 维数组、空数组没太仔细看,明天再看,弄一下午了。呵呵,去歇歇

470569544 发表于 2009-11-14 21:29

楼主真的辛苦啦。不过我真的没有时间看啊。不好意思啊

cey1979 发表于 2009-11-15 08:50

很不错。证用得着,:victory::victory::victory:支持楼主

liwenhui 发表于 2009-11-15 12:33

这帖子不错,应该可以加为精华帖。

大笨象 发表于 2009-11-15 13:39

辛苦了。。

summeronly 发表于 2009-11-15 16:17

谢谢楼主,希望楼主坚持更新,我们一定顶上。

MCM2010 发表于 2009-11-19 11:58

很不错,不过楼主只是刚刚开始,也只学到了最基本的知识,不过是Matlab强大功能的冰山一角而已,请再接再厉吧,加油!

xinglijiao 发表于 2009-12-12 16:01

非常实用的帖子,谢谢楼主了:victory:
页: [1] 2 3 4 5 6 7 8 9 10
查看完整版本: matlab学习笔记【09-11-14】