matlab语言方式与c有很大的相似之处,此篇记录一下自己初步学习matlab的一些过程和代码
学习matlab主要是从b站上,也从matlab官网去学习了一下相关感兴趣的函数
版本是之前下好的R2022b
1.变量命名,这与c语言变量命名要求的规则非常相似
简单来讲,沿袭右为左赋值的习惯
A = 2
a = 2
这与平时接触的c/c++语言相比,没什么不同,均不允许数字为首开头的变量格式;但是总还是有区别,比如不会让符号在前的命名,matlab需要以字母开头命名;比如:
2.字符与字符串
matlab中单引号' '与双引号 " " 还是有一定的差别的,在c中单引号是单个的char类型,在matlab中:
a = ' hello ',可以是一个字符串;
同样的,也可以是 b = " hello ",一样也是字符串
如下的运算结果,可以看出其中的区别
>> a = 'hello'
a =
'hello'
>> b = "hello"
b =
"hello"
>> a+b
ans =
"hellohello"
>> b+a
ans =
"hellohello"
>> a = 'abcde'
a =
'abcde'
>> a-c
ans =
-2 -1 0 1 2
>> c='abc'
c =
'abc'
>> a-c
对于此运算,数组的大小不兼容。
相关文档
>> a+c
对于此运算,数组的大小不兼容。
在我的理解看来,单引号形式的字符串是在一个数组中存储,可以进行ASCII码运算,与双引号的字符串相加时,统一成为了 " res1 + res2 " 类型的字符串拼接
>> c
c =
'abc'
>> a = 'a'
a =
'a'
>> c-a
ans =
0 1 2
>> a-c
ans =
0 -1 -2
>> a*c
ans =
列 1 至 2
9409 9506
列 3
9603
>> c*a
ans =
列 1 至 2
9409 9506
列 3
9603
>> c/a
ans =
1.0000 1.0103 1.0206
对于 " " 的字符串类型来讲,只能支持+操作,也就是拼接操作
>> a = "aaaa"
a =
"aaaa"
>> b="bbb"
b =
"bbb"
>> a-b
'string' 类型的操作数不支持运算符 '-'。
>> a+b
ans =
"aaaabbb"
常见函数abs(),一开始以为是绝对值了,结果发现是返回ASCII码
>> abs('0')
ans =
48
常用函数char(),返回对应ASCII码的字符
>> char(48)
ans =
'0'
>> char(48,49,52)
ans =
3×1 char 数组
'0'
'1'
'4'
常用函数num2str(),“number to string”,将数字转化为字符串类型
>> num2str(88)
ans =
'88'
常用函数length(),返回字符串的的长度 (空格也会算)
>> str = 'wwwoo1100'
str =
'wwwoo1100'
>> length(str)
ans =
9
3.矩阵
在matlab中应用矩阵非常神奇。
声明矩阵: 元素之间用 空格 或者 逗号 , 隔开,一行元素结束后用 分号 ; 隔开
>> A = [1,2,3;6,7,8;9,10,20]
A =
1 2 3
6 7 8
9 10 20
>> A = [1 2 3;6 7 8;9 10 20]
A =
1 2 3
6 7 8
9 10 20
矩阵运算 (转置、元素按行列出、矩阵求逆、矩阵乘法)
>> A'
ans =
1 6 9
2 7 10
3 8 20
>> A(:)
ans =
1
6
9
2
7
10
3
8
20
>> inv(A)
ans =
-1.3333 0.2222 0.1111
1.0667 0.1556 -0.2222
0.0667 -0.1778 0.1111
>> inv(A) * A
ans =
1.0000 0.0000 0.0000
0 1.0000 0
0 0 1.0000
>> A/inv(A)
ans =
40.0000 46.0000 79.0000
120.0000 141.0000 234.0000
249.0000 288.0000 507.0000
>> A*A
ans =
40 46 79
120 141 234
249 288 507
矩阵与随机数
函数zeros()(与图像处理有关的矩阵生成),zeros(行数,列数,层数),如图像RGB三层,生成三层矩阵
>> E= zeros(10,5,3)
E(:,:,1) =
0 0 0 0 0
0 0 0 0 0
0 0 0 0 0
0 0 0 0 0
0 0 0 0 0
0 0 0 0 0
0 0 0 0 0
0 0 0 0 0
0 0 0 0 0
0 0 0 0 0
E(:,:,2) =
0 0 0 0 0
0 0 0 0 0
0 0 0 0 0
0 0 0 0 0
0 0 0 0 0
0 0 0 0 0
0 0 0 0 0
0 0 0 0 0
0 0 0 0 0
0 0 0 0 0
E(:,:,3) =
0 0 0 0 0
0 0 0 0 0
0 0 0 0 0
0 0 0 0 0
0 0 0 0 0
0 0 0 0 0
0 0 0 0 0
0 0 0 0 0
0 0 0 0 0
0 0 0 0 0
(上述中,E(:,:,2)里面的 : 指的是全部(all)的意思)
矩阵函数eye(num):生成单位阵
>> eye(4)
ans =
1 0 0 0
0 1 0 0
0 0 1 0
0 0 0 1
矩阵函数magic(num):生成一个magic矩阵,上下斜相加均相等
>> magic(5)
ans =
17 24 1 8 15
23 5 7 14 16
4 6 13 20 22
10 12 19 21 3
11 18 25 2 9
>> magic(3)
ans =
8 1 6
3 5 7
4 9 2
3.+ 矩阵构造 +矩阵运算 +矩阵索引:
起始 :步长 :终止(包括)
>> 1:4:29
ans =
1 5 9 13 17 21 25 29
repmat函数(①,②,③),进行重复操作来构造,相当于ctrl c ①,然后按照②的行数ctrl v
再按照③的列数 ctrl v 形成新的矩阵
>> c = repmat(1:4:20,3,2)
c =
1 5 9 13 17 1 5 9 13 17
1 5 9 13 17 1 5 9 13 17
1 5 9 13 17 1 5 9 13 17
randi(最大值,行数,列数)
>> b = randi(50,4,4)
b =
31 14 33 33
30 16 24 28
28 6 32 37
44 47 28 27
>> a = randi(50,4,4)
a =
50 4 39 49
11 21 32 10
6 23 39 7
6 19 47 35
//矩阵运算
>> a+b
ans =
81 18 72 82
41 37 56 38
34 29 71 44
50 66 75 62
>> a-b
ans =
19 -10 6 16
-19 5 8 -18
-22 17 7 -30
-38 -28 19 8
>> a*b
ans =
4918 3301 4366 4528
2307 1152 2171 2405
2276 1015 2194 2474
3612 2315 3138 3414
>> a.*b (各对应元素相乘)
ans =
1550 56 1287 1617
330 336 768 280
168 138 1248 259
264 893 1316 945
>> a/b
ans =
1.4104 5.3935 -2.6806 -1.8289
3.9783 -4.9448 -0.2488 0.9769
5.5984 -7.4187 -0.1907 1.3716
-0.2886 -11.1121 7.1615 3.3588
>> a./b (各对应元素相除)
ans =
1.6129 0.2857 1.1818 1.4848
0.3667 1.3125 1.3333 0.3571
0.2143 3.8333 1.2188 0.1892
0.1364 0.4043 1.6786 1.2963
矩阵索引
>> c = a(2,3)
c =
32
>> c = a(2,:)
c =
11 21 32 10
>> c = a(:,4)
c =
49
10
7
35
>> c = a(:,:)
c =
50 4 39 49
11 21 32 10
6 23 39 7
6 19 47 35
find函数(找到满足条件的索引值)
>> [m,n] = find(a > 20)
m =
1
2
3
1
2
3
4
1
4
n =
1
2
2
3
3
3
3
4
4
>> [m,n] = find(a == 20) //(不存在=20的元素)
m =
空的 0×1 double 列向量
n =
空的 0×1 double 列向量
4.元胞数组
我的理解来看,元胞数组像是vector容器一样,是一个大的包裹,这个包裹按照矩阵的方式来进行存储,cell(行数,列数)进行声明,原本以为像是二维数组那样来解释,但是最终还是觉得不合适,在元胞数组中,可以声明很多的空间来存放东西,如下列:
>> A = cell(2,4)
A =
2×4 cell 数组
列 1 至 3
{0×0 double} {0×0 double} {0×0 double}
{0×0 double} {0×0 double} {0×0 double}
列 4
{0×0 double}
{0×0 double}
>> A{1,2} = rand(3,4)
A =
2×4 cell 数组
列 1 至 3
{0×0 double} {3×4 double} {0×0 double}
{0×0 double} {0×0 double} {0×0 double}
列 4
{0×0 double}
{0×0 double}
>> A{1,2}
ans =
0.8147 0.9134 0.2785 0.9649
0.9058 0.6324 0.5469 0.1576
0.1270 0.0975 0.9575 0.9706
5.程序结构(类似c/c++)
for循环的结构也是与c类似的,for 变量 : 步长 : 终止
sum = 0;
for n = 1:1:5
sum=sum+1;
end
sum
(在脚本中,不带 “ ;” 的将被显示)
类似的,while和switch
6.作图
终于到了matlab画图的部分
二维:
x = 0:0.01:100; //x值 start:step:end
y = 20*exp(-0.05*x).*sin(x); //y=f(x)
figure //创建图窗窗口
plot(x,y) //绘图
title('y = 20*exp(-0.05*x).*sin(x)') //标题
xlabel('x') //x标签
ylabel('20*exp(-0.05*x).*sin(x)') //y标签
x = 0:0.01:100;
y1 = 200*exp(-0.05*(x+40)).*sin(x+40);
y2 = 8*exp(8*sin(x)).*sin(20*sin(x*0.08));
figure
[AX,H1,H2] = plotyy(x,y1,x,y2);
title('two')
set(H1,'LineStyle','-')
set(H2,'LineStyle','--')
三维:(这里要注意,二维与三维plot函数写法不同)
t = 0:pi/50:10*pi
plot3(sin(t),cos(t),t) //三维作图
xlabel('sin(t)')
ylabel('cos(t)')
zlabel('t')
grid on // 网格
[x,y,z] = peaks(60);
mesh(x,y,z)
grid
//peaks函数
[X,Y] = meshgrid(-10:0.5:10);
Z = Y.*10*sin(cos(sin(X))) - X.*cos(Y).*exp(-0.05*Y);
s = surf(X,Y,Z,'FaceAlpha',0.5)
学习参考:1.matlab前言_哔哩哔哩_bilibili