科学计算与Matlab笔记:第 1章 :Matlab基础


  1. Matlab系统环境:

  • 设置当前工作路径:cd C:\Training\AI\Matlab
  • 查看当前工作路径: pwd
  • 设置搜索路径:path(path,’C:\Training\AI\Matlab’)
    2.Matlab数值数据
  • 无符号整型:00000000b - 11111111b,(0 - 2.^8 -1)
  • 有符号整型:10000000b - 01111111b,(-2.^7 - 2.^7 -1), 最左边的一位为符号位,1为负数,0正数。

    x = int8(129) //因为有符号型默认-127 - 127, 129超过范围


x = 127

x = uint8(129) //无符号型默认0-255,未超范围

x = 129
  • 浮点型, 默认为双精度

    class(4)


ans = double

class(single(4))

ans = single
  • 复型
    real函数: 求函数实部
    imag函数求函数虚部

数值数据的输出格式
format命令的格式:format格式符,只影响输出格式,但不影响计算进度与存储格式精度。

format long //输出小数点后15位
50/3

ans =

16.666666666666668

format //默认short格式,输出小数点后4位
50/3

ans =

16.6667


  • 常用数学函数
    角度与弧度

sind(180/2)
ans =

 1

sin(pi/2)

ans =

 1

绝对值函数

abs(-4)

ans =

 4

abs(3+4i)

ans =

 5

abs(‘a’)

ans =

97

取整函数 fix,floor,ceil,round

round(4.7)

ans =

 5

fix(-3.2) //固定取靠近小数点的整数。

ans =

-3

fix(4.7)

ans =

 4

floor(3.6)

ans =

 3

ceil(3.6)

ans =

 4

floor(-3.6)

ans =

-4

ceil(-3.6)

ans =

-3

分别求三位正整数的个位数,十位数,百位数?
除以10的余数:个位数
除以10取整后,再除以10,余数即为原来的十位数
除以100后,余数即为原来的百位数

m=345

m =

345

m1 = rem(m,10)

m1 =

 5

m2 = rem(fix(m/10),10)

m2 =

 4

m3 = fix(m/100)

m3 =

 3

求1-100之前所有素数(isprime())

x=1:100;
k=isprime(x);
k1=find(k) //生成k1向量,由x向量中k=1对应的元素组成。

k1 =

Columns 1 through 23

 2     3     5     7    11    13    17    19    23    29    31    37    41    43    47    53    59    61    67    71    73    79    83

Columns 24 through 25

89    97

p = x(k1)

p =

Columns 1 through 23

 2     3     5     7    11    13    17    19    23    29    31    37    41    43    47    53    59    61    67    71    73    79    83

Columns 24 through 25

89    97

3. 变量及其操作
计算这里写图片描述的值,并将结果赋值给变量z
,然后显示计算结果。

x = sqrt(7) - 2i;
y = exp(pi/2);
z = (5 + cosd(47)) / (1 + abs(x - y))

z =

1.4395

预定义变量:由系统本身定义的变量
ans: 是默认赋值变量
i:代表虚数单位
pi:代表圆周率
NaN:代表非数

内存变量文件:用于存储matlab工作区变量的文件,其扩展名为mat,也叫.MAT文件
save命令:创建内存变量文件
load命令:装入内存变量文件

save mydata x y z
load(‘mydata.mat’)

利用已经建好的矩阵建立更大的矩阵:一个大矩阵可以由已经建立好的小矩阵拼接而成

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

C =

 1     2     3    -1    -2    -3
 4     5     6    -4    -5    -6
 7     8     9    -7    -8    -9
-1    -2    -3     1     2     3
-4    -5    -6     4     5     6
-7    -8    -9     7     8     9

可以用实部和虚部构建复数矩阵

B = [1, 2, 3; 4, 5, 6];
C = [6, 7, 8; 9, 10, 11];
A = B + i * C

A =

1.0000 + 6.0000i 2.0000 + 7.0000i 3.0000 + 8.0000i
4.0000 + 9.0000i 5.0000 +10.0000i 6.0000 +11.0000i

冒号表达式
linspace函数 linspace(a, b, n) //a start; b end; n quantity

linspace(0,pi,10)

ans =

     0    0.3491    0.6981    1.0472    1.3963    1.7453    2.0944    2.4435    2.7925    3.1416

结构矩阵和单元矩阵
(1)结构矩阵
结构矩阵.成员名=表达式

a(1).x1 = 10; a(1).x2 = ‘liu’; a(1).x3 = [11,21; 34, 78];
a(2).x1 = 12; a(2).x2 = ‘wang’; a(2).x3 = [34,191; 27, 578];
a(3).x1 = 14; a(3).x2 = ‘cai’; a(3).x3 = [13,890; 67, 231];
a

a =

1x3 struct array with fields:

x1
x2
x3

a(1)

ans =

x1: 10
x2: 'liu'
x3: [2x2 double]

>> a(2) 

ans =

x1: 12
x2: 'wang'
x3: [2x2 double]

a(3)

ans =

x1: 14
x2: 'cai'
x3: [2x2 double]

(2)单元矩阵
建立单元矩阵和一般矩阵相似,直接输入即可,只是单元矩阵用大括号括起来

b ={10, ‘liu’, [11,21; 34, 78]; 12, ‘wang’, [34,191; 27, 578]; 14, ‘cai’, [13,890; 67, 231]}

b =

[10]    'liu'     [2x2 double]
[12]    'wang'    [2x2 double]
[14]    'cai'     [2x2 double]

矩阵元素的引用方式
(1)通过下标来引用

A = [1, 2, 3; 4, 5, 6];
A(4,5) = 10

A =

 1     2     3     0     0
 4     5     6     0     0
 0     0     0     0     0
 0     0     0     0    10

(2)通过序号来引用
在matlab中,矩阵元素按列存储,即首先存储第1列元素,然后第2列元素,一直到矩阵的最后一列元素
矩阵元素的序号就是矩阵元素在内存中的排列顺序

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

A =

 1     2     3
 4     5     6

A(2)

ans =

 4

A(3)

ans =

 2

A(4)

ans =

 5

序号与下标是一一对应的,以MxN矩阵A为例,矩阵A(i,j)的序号为(j-1)x(m+i)
矩阵元素的序号与下标可以用sub2ind和ind2sub函数实现相互转换
sub2ind函数:将矩阵中指定元素的行、列下标转换成存储的序列号。调用格式为:
D=sub2ind(S,I,J)
D:序号
S:行数和列数组成的向量
I:转换矩阵元素的行下标
J:转换矩阵元素的列下标

A

A =

 1     2     3
 4     5     6

D=sub2ind(size(A),[1,2;2,2],[1,1;3,2])

D =

 1     2 
 6     4

//此处D为序号: A(1,1) 对应序号为1; A(2,1)对应序号为2,因为是按列存储。A(2,3)对应序号为6, A(2,2)对应序号为4

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

A =

 1     2     3
 4     5     6

A(1)

ans =

 1

A(1,1)

ans =

 1

A(2)

ans =

 4

A(2,1)

ans =

 4

A(6)

ans =

 6

A(2,3)

ans =

 6

A(4)

ans =

 5

A(2,2)

ans =

 5

ind2sub函数:将矩阵元素的序号转换成对应的下标

[I,J]=ind2sub(S,D)

[I,J]=ind2sub([3,3],[1,3,5])

I =

 1     3     2

J =

 1     1     2

利用冒号表达式获取子矩阵
A(i,:):第i行全部元素
A(:,j):第j列全部元素
A(i:i+m,k:k+m): 第i~i+m行内且在第k~k+m列中的所有元素
A(i:i+m,:):第i~i+m行的全部元素

A=[1,2,3,4,5;6,7,8,9,10;11,12,13,14,15]

A =

 1     2     3     4     5
 6     7     8     9    10
11    12    13    14    15

A(1:2,:)

ans =

 1     2     3     4     5
 6     7     8     9    10

A(2:3,1:2:5)

ans =

 6     8    10
11    13    15

end元算符:表示某一维的末尾元素下标

A=[1,2,3,4,5;6,7,8,9,10;11,12,13,14,15;16,17,18,19,20]

A =

 1     2     3     4     5
 6     7     8     9    10
11    12    13    14    15
16    17    18    19    20

A([1,4],3:end)

ans =

 3     4     5
18    19    20

A(end,:)

ans =

16    17    18    19    20

删除元素:

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

A =

 1     2     3     0     0
 7     0     9     2     6
 1     4    -1     1     8

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

A =

 1     3     0
 7     9     6
 1    -1     8

改变矩阵的形状
reshape(A,m,n):在矩阵总元素保持不变的前提下,将矩阵重新排成mxn的二维矩阵
注意:reshape函数只改变元矩阵的行数和列数,但并不改变元矩阵元素个数以及原有的存储顺序。

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

A =

 1     2     3     0     0
 7     0     9     2     6
 1     4    -1     1     8

y=reshape(A,5,3)

y =

 1     4     2
 7     3     1
 1     9     0
 2    -1     6
 0     0     8

A(:):将矩阵Adequate每一列元素堆叠起来,成为一个列向量。等价于reshape(A,15,1)

B=A(:)

B =

 1
 7
 1
 2
 0
 4
 3
 9
-1
 0
 2
 1
 0
 6
 8

C=reshape(A,15,1)

C =

 1
 7
 1
 2
 0
 4
 3
 9
-1
 0
 2
 1
 0
 6
 8

算术运算
(1)基本算术运算
基本算术运算符+,-,*,/(右除),\左除,^乘方
matlab算术运算是在矩阵意义下进行的
单个数据的算术运算只是矩阵运算的一种特例

加减运算
若两矩阵同型,则运行时两矩阵的对应元素相加减
若两矩阵不同型,matlab给出错误信息
一个标量也可以跟矩阵进行加减运算,此时标量和矩阵的每一个元素进行加减运算。

乘法运算
矩阵A和矩阵B进行乘法运算,要求矩阵A的列数和矩阵B的行数相同,此时则称矩阵A,B是可乘的,或称矩阵A,B维数和大小相容
如果两者的维数或大小不相容,则给出错误信息,提示两个矩阵不可乘

除法运算
Matlab中有两种除法运算,右除或左除
若A是非奇异矩阵(可逆),则B/A = B * inv(A), A\B = inv(A)*B

A = [1,2,3;4,2,6;7,4,9];
B = [4,3,2;7,5,1;12,7,92];
C1 = B/A

C1 =

-0.1667 -3.3333 2.5000
-0.8333 -7.6667 5.5000
12.8333 63.6667 -36.5000

C2 = A\B

C2 =

0.5000   -0.5000   44.5000
1.0000    0.0000   46.0000
0.5000    1.1667  -44.8333

3/4

ans =

0.7500

a=[10,25]

a =

10    25

a/5

ans =

 2     5

乘方运算
矩阵的乘方可以表示为A^x,要求A为方阵,x为标量

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

ans =

30    36    15
66    81    42
39    54    69

(2)点运算
点运算符:./, ., .^, .*
两矩阵进行点运算是指他们的对应元素进行相关运算,要求两矩阵同型

A=[1,2,3;4,5,6;7,8,9];
B=[-1,0,1;1,-1,0;0,1,1];
C=A.*B

C =

-1     0     3
 4    -5     0
 0     8     9

D=A*B

D =

 1     1     4
 1     1    10
 1     1    16

x=[0.1:0.3:1]

x =

0.1000    0.4000    0.7000    1.0000

y=sin(x).*cos(x) //此时的sinx cosx是向量

y =

0.0993    0.3587    0.4927    0.4546

关系运算
关系运算符:<, <=, >, >=, ==, ~=
当两个标量进行比较时,直接比较两个数的大小。若成立,关系表达式的结果为1,否则返回0

3>4

ans =

 0

x=5

x =

 5

x==5

ans =

 1

当参与比较的量是两个同型矩阵时,比较按照两个矩阵相同位置对应元素按标量关系逐个比较。最终关系运算的结果是一个与原矩阵同型矩阵,元素由0,1构成
当参与比较的一个是标量,另一个是矩阵时,则把标量与矩阵中的每一个元素按照标量关系逐一比较,最终关系运算的结果是一个与原矩阵同型矩阵,元素由0,1构成

建立3阶方阵,判断A的元素是否为偶数

A=[24,35,13;22,63,23;39,47,80]

A =

24    35    13
22    63    23
39    47    80

P=rem(A,2)==0

P =

 1     0     0
 1     0     0
 0     0     1

逻辑运算
逻辑运算符& | ~
当参与比较的量是两个同型矩阵时,比较按照两个矩阵相同位置对应元素按标量关系逐个比较。最终关系运算的结果是一个与原矩阵同型矩阵,元素由0,1构成
当参与比较的一个是标量,另一个是矩阵时,则把标量与矩阵中的每一个元素按照标量关系逐一比较,最终关系运算的结果是一个与原矩阵同型矩阵,元素由0,1构成

水仙花数是指各位数字的立方等于该数本身的三位正整数,求所有的水仙花总数。

m=100:999;
m1=rem(m,10);
m2 = rem(fix(m/10),10);
m3 = fix(m/100);
k = find(m==(m1.*m1.*m1 + m2.*m2.*m2 + m3.*m3.*m3))

k =

54   271   272   308

s=m(k)

s =

153 370 371 407

字符串的表示
Matlab中,字符串是用单引号括起来的字符序列

xm = ‘Centural South University’;
xm(1:3)

ans =

Cen

若字符串中的字符含有单引号,则该单引号字符用两个单引号来表示

‘I”m a student’

ans =

I’m a student

建立多行字符串,形成字符串矩阵

ch=[‘abcdef’;’123456’]

ch =

abcdef
123456

ch(2,3)

ans =

3

ch=[‘a,b,c,d,e,f’;’1,2,3,4,5,6’]

ch =

a,b,c,d,e,f
1,2,3,4,5,6

ch(2,3)

ans =

2

ch(2,2)

ans =

,

建立一个字符串向量,然后对该向量做如下处理
1.取第1~5个字符组成字符串
2.将字符串倒过来重新排序
3.将字符串中的小写字母变成大写字母,其余字母不变
4. 统计字符中小写字母的个数

ch=’ABc123d4e56Fg9’;
subch=ch(1:5)

subch =

ABc12

revch=ch(end:-1:1)

revch =

9gF65e4d321cBA

k=find(ch>=’a’ & ch<=’z’)

k =

 3     7     9    13

ch(k)=(ch(k)-(‘a’-‘A’))

ch =

ABC123D4E56FG9

length(k)

ans =

 4

(1)字符串的执行
格式:eval(s)

t=pi;
m=’[t,sin(t),cos(t)]’;
y=eval(m)

y =

3.1416    0.0000   -1.0000

(2)字符串与数值之间转换
abs与double函数都可以用于获取字符串矩阵所对应的ASICII码数值矩阵
char函数可以把ASICII码矩阵转换成字符串矩阵

s1=’MATLAB’;
a=abs(s1)

a =

77    65    84    76    65    66

char(a)

ans =

MATLAB

char(a+32)

ans =

matlab

(3)字符串的比较
字符串比较有两种形式,关系运算符比较,或字符串比较函数
关系运算符比较:两个字符串里对应元素按照ASICII值的大小逐个比较,比较的结果是一个数值向量,元素由0,1构成

‘www0’>’W123’

ans =

 1     1     1     0

字符比较函数用于判断字符串是否相当,有4中比较方式
1.strcmp(s1,s2):比较两个字符串s1与s2是否相等,相等返回1,否则返回0
2.strncmp(s1,s2,n):比较两个字符串s1与s2前n个字符是否相等,相等返回1,否则返回0
3.strcmpi(s1,s2):在忽略字母大小写的前提下,比较两个字符串s1与s2是否相等,相等返回1,否则返回0
4.strncmpi(s1,s2,n):在忽略字母大小写的前提下,比较两个字符串s1与s2前n个字符是否相等,相等返回1,否则返回0

strcmp(‘www0’,’w123’)

ans =

 0

strncmpi(‘www0’,’w123’,1)

ans =

 1

(4)字符串的查找与替换
findstr(s1,s2):返回短字符串在长字符串中的开始位置
strrep(s1,s2,s3):将字符串s1中的所有子字符串s2替换为s3中的开始位置

p=findstr(‘This is a test!’,’is’)

p =

 3     6

p=findstr(‘is’,’This is a test!’)

p =

 3     6

result = strrep(‘This is a Test!’,’Test’,’Class’)

result =

This is a Class!

你可能感兴趣的:(Matlab)