建议由 C 语言和相关编程语言基础,了解线性代数和矩阵的相关知识
在该网站可以对具体内容进行进一步查看和了解
我们先来看看 Matlab 的界面构成:
在界面的最左端是文件目录,在中间是命令行窗口,右边是工作区
这份博客主要是为了数学建模使用,当然如果需要考前速成也可以参考
1.生成矩阵
首先来看生成矩阵的方式:
1.直接法
代码如下:
matrix = [1, 2, 3; 4, 5, 6; 7, 8, 9]
在命令行窗口输入上面的代码可以得到生成的矩阵:
2.冒号生成一维矩阵
使用冒号法生成一维矩阵的方法类似于循环:代码格式如下:
矩阵 = 开始数字 :步长 :截止数字
如果步长为 1 的话,可以省略步长
我们使用上面的方式来生成一个步长为 1 的矩阵:
matrix = 1 : 1 : 10
matrix = 1 : 10
同样我们接下来生成一个步长为 2 的矩阵:
matrix = 1 : 2 : 10
生成结果如图所示:
3.函数生成
首先可以使用 linspace 函数,这个函数可以在数字的起始位置到终止位置间等间距的生成所指定的数字个数,代码格式如下:
矩阵 = linspace(起始位置,终止位置,生成个数)
我们接下来用 linspace 函数生成一个一维矩阵,代码如下:
matrix = linspace(1, 5, 5)
生成结果如下图所示:
如果生成的矩阵中的数字包含小数,则所有数字默认保留四位小数,示例如下:
matrix = linspace(0, 10, 5)
生成的矩阵如图所示:
之后我们接着看使用 eye 函数生成 n 阶单位矩阵:
代码格式如下:
矩阵 = eye(n) n 为需要生成的单位矩阵的阶数
示例代码如下:
matrix = eye(3)
创建出的矩阵如下所示:
接下来使用 zeros 函数生成一个全零矩阵,代码格式如下所示:
矩阵 = zeros(行数,列数)
我们接下来使用 zeros 函数生成一个全零矩阵,代码入下:
matrix = zeros(2, 2)
使用这个函数生成的矩阵如图所示:
接着我们使用 ones 函数生成全一矩阵,代码个数如图所示:
矩阵 = ones(行数,列数)
接下来使用这个函数生成一个全一矩阵,代码如下:
matrix = ones(2, 2)
生成的矩阵如图所示:
接下来使用 rand 函数生成一个数字在 0 和 1 之间的行列相等的矩阵,代码格式如下所示:
矩阵 = rand(n) 生成一个 n 行 n 列的矩阵
使用这个函数生成一个矩阵代码如下所示:
matrix = rand(3)
生成的矩阵如下图所示:
我们还可以使用函数 randn 生成一个以 0 为均值的正态分布或高斯分布矩阵,代码格式如下:
矩阵 = randn(n) 生成一个 n 行 n 列的矩阵
使用这个函数生成矩阵代码如下:
matrix = randn(3)
生成的矩阵如下所示:
2.矩阵运算
使用 diag 函数可以生成对角阵,具体的格式如下:
矩阵 = diag(现有的矩阵,主对角线上方第k条斜线) 用行向量生成对角阵
接下来我们尝试生成一个这样的对角矩阵:
matrix_1 = diag(matrix, 1)
matrix_1 = diag(matrix, 0)
matrix_1 = diag(matrix, -1)
通过上面的代码我们生成了如下的矩阵:
接下来我们可以通过函数 tril 生成下三角矩阵,或者使用 triu 函数生成上三角矩阵,具体使用代码的格式如下:
矩阵 = tril(现有的矩阵,主对角线上第k条斜线) 让这条斜线上方的元素清零
矩阵 = triu(现有的矩阵,主对角线下第k条斜线) 让这条斜线下方的元素清零
接下来尝试使用这两个函数创建几个矩阵:
matrix_1 = tril(matrix, 1)
matrix_1 = tril(matrix, 0)
matrix_1 = tril(matrix, -1)
matrix_1 = triu(matrix, 1)
matrix_1 = triu(matrix, 0)
matrix_1 = triu(matrix, -1)
矩阵的加减乘乘方运算
矩阵的加减乘乘方运算和矩阵的运算方式吻合,我们看看矩阵的加减乘乘方运算:
matrix + matrix
matrix - matrix
matrix * matrix
matrix ^ 2
生成的矩阵如图所示:
矩阵的点乘将进行矩阵对应位置的相乘,我们接下来使用矩阵的点乘生成一个矩阵,代码如下:
matrix .* matrix
得到的结果如下图所示:
逆矩阵
在 matlab 中可以使用 pinv 函数生成矩阵的逆矩阵,代码如下:
pinv(matrix)
生成的逆矩阵如下图所示:
特征值,特征向量
同样我们可以通过使用 eig 函数生成一个矩阵的特征向量和特征值对角阵,代码格式如下:
[特征向量,特征对角阵] = eig(矩阵)
接下来我们使用 eig 函数生成一个矩阵的特征向量和特征对角阵,具体代码如下:
[v, D] = eig(matrxi)
生成的特征向量和特征对角阵如下图所示:
行列式,秩
分别可以使用函数 det,rank,compan 可以生成矩阵的行列式,矩阵的秩,示例代码如下:
det(matrix)
rank(matrix)
结果如下图所示:
3.矩阵的修改
部分替换
在矩阵的替换之前可以对矩阵进行备份,防止之后对矩阵的修改出现错误,下面列举矩阵的修改的几种操作的代码格式:
matrix(x, y) = number 将第x行第y列的元素进行替换,替换为number
matrix(x, :) = [number_1, number_2, number_n] 将第x行的元素全部替换,替换为方括号内的数字
matrix(x, :) = [] 将第x行的元素全部删除
matrix(:, y) = [number_1, number_2, number_n] 将第y行的元素全部替换,替换为方括号内的数字
matrix(:, y) = [] 将第y行的元素全部删除
接下来对矩阵进行部分替换的代码如下所示:
matrix_copy = matrix
matrix_copy(2, 2) = 0
matrix_copy = matrix
matrix_copy(2, :) = [1, 1, 1]
matrix_copy = matrix
matrix_copy(2, :) = []
matrix_copy = matrix
matrix_copy(:, 2) = [1, 1, 1]
matrix_copy = matrix
matrix_copy(:, 2) = []
接下来的截图是被修改过的矩阵的内容:
矩阵的转置
矩阵的转置的代码如下所示:
matrix = matrix'
转置后的矩阵如下图所示:
矩阵的拼接
两个矩阵可以进行拼接,可以使用 cat 函数进行矩阵的拼接,代码格式如下所示:
矩阵 = cat(1,矩阵1,矩阵2) 将矩阵1和矩阵2进行垂直拼接
矩阵 = cat(2,矩阵1,矩阵2) 将矩阵1和矩阵2进行水平拼接
示例代码如下所示:
matrix_1 = cat(1, matrix, matrix)
matrix_1 = cat(2, matrix, matrix)
生成的矩阵如下所示:
变维
矩阵可以变为其他维度的矩阵,代码格式如下所示:
矩阵 = reshape(矩阵,m,n) 将原矩阵变为m行n列的矩阵
示例代码如下所示:
matrix_1 = reshape(matrix, 1, 9)
生成的矩阵如下图所示:
4.矩阵信息的获取
矩阵的行列数
如果需要获取矩阵的行列数,可以通过 size 函数获取,代码格式如下图所示:
[行数,列数] = size(矩阵)
示例代码如下:
[m, n] = size(matrix)
结果如下图所示:
矩阵行列数的最大值
如果需要获取矩阵的行列数的最大值可以通过 length 函数进行,代码格式如下所示:
max = length(矩阵)
示例代码如下所示:
max_length = length(matrix)
获得的最大值如下图所示:
5.字符串
创建
具体创建格式如下所示:
string_1 = 'Lpy_Now' 定义一个字符串,通过一对单引号进行定义
string_2 = ['Hello', 'World', 'Lpy_Now'] 通过中括号将多个字符串进行拼接
string_3 = strcat(string_1, string_2) 通过strcat函数将两个字符串进行拼接
string_4 = strvcat(string_1 ,string_2) 通过strycat函数将两个字符串连接并产生多行字符
string_5 = double(string) 取得字符串的ASCII值,同样abs函数也可以实现这一操作
string_6 = char(number) 将ASCII转化为字符串
接下来我们对这些函数进行实践,示例代码如下:
string_1 = 'Lpy_Now'
string_2 = ['Hello', 'World', 'Lpy_Now']
string_3 = strcat(string_1, string_2)
string_4 = strvcat(string_1, string_2)
string_5 = double(string_1)
string_6 = char(100)
具体结果如下图所示:
比较
字符串之间可以进行比较,具体代码格式如下所示:
strcmp(string_1, string_2) 将字符串逐位进行比较,返回1则相等,返回0则不相等
strncmp(string_1, string_2, n) 将字符串的前n位逐位进行比较,返回1则相等,返回0则不相等
strcmpi(string_1, string_2) 将字符串忽略大小写逐位进行比较,返回1则相等,返回0则不相等
strncmpi(string_1, string_2, n) 将字符串的前n位忽略大小写逐位进行比较,返回1则相等,返回0则不相等
代码示例如下所示:
string_1 = 'lpy_now'
string_2 = 'Lpy_Now'
strcmp(string_1, string_2)
strncmp(string_1, string_2, 2)
strcmpi(string_1, string_2)
strncmpi(string_1, string_2, 2)
具体结果如下所示:
查找替换
通过下面的函数可以对一个字符串进行查找和替换,具体代码格式如下所示:
strfind(string_1, string_2) 在string_1字符串中查找string_2字符串的位置
strtok(string) 截取string第一个分隔符(字符,tab,回车)前的字符
strrep(string_1, string_2, string_3) 在字符串string_1中用string_3替换string_2
代码示例如下所示:
string_1 = ['Hello World', 'Lpy_Now', ' Hi']
string_2 = 'Lpy_Now'
strfind(string_1, string_2)
strtok(string_1)
strrep(string_1, string_2, string_1)
代码实现的结果如下:
其他操作
还有以下其他的对字符串的操作,具体的函数格式如下所示:
upper(string) 将字符串全部转为大写
lower(string) 将字符串全部转为小写
strjust(string, 'right') 将字符串右对齐,同样'left'为左对齐,'center'为中间对齐
strtrim(string) 删除字符串开头结尾的空格
eval(string) 将字符串作为代码运行
这里由于不太重要就不演示了
转换
字符串和数字之间可以进行转换,在 Matlab 中进行转换的固定格式是:格式2格式
6.程序
前面说过,学习 Matlab 需要一定的编程语言基础,所以这里一些具体的语法细节不再赘述
选择结构
首先我们介绍的是 if-else 选择结构接下来的代码我们假定 number_1 = 0,number_2 = 1,我们先来看一段代码:
if number_1 > 0
disp(number_1);
elseif number_1 == 0
disp(number_2);
else number_1 < 0
disp(number_2);
end
通过上面的代码我们可以清楚的了解到在 Matlab 语言中 else-if 的使用方式,其中disp函数是输出这个变量,相当于 C 语言的 printf 等等
接下来我们来看看 switch-case 语句,下面是一段运用了 switch-case 语句的代码,如下所示:
switch number_1
case 0
disp(number_1);
case 1
disp(number_2);
otherwise
disp('No OutPut');
end
上面的代码是在对 number_1 进行判断,如果 number_1 的值为 0 那么输出 number_1 的值,如果为 1 输出 number_2 的值,如果上面的都不满足,则输出 No OutPut 这样一段字符串,这段程序运行结果如下所示:
接下来我们看一下 Matlab 中的 try-catch 语句,这个语句是意味着如果我们需要这个程序即使在程序运算出错的情况下不至于出错而是仍完成一定的操作,那么我们先来看下面的代码:
try
number = number_1 + number_2;
catch
number = number_1 - number_2;
end
disp(number)
上面的代码中如果 number_1 + number_2 运算可以得到结果,那么将两数之和赋值给变量 number,否则将两数之差赋值给变量 number,在程序的最后输出 number 的值,程序的运行结果如下图所示:
循环结构
首先来介绍的是 for 循环结构,for 循环的使用结构如下所示:
for 变量 = 初值 : 步长 : 终值
执行语句;
end
接下来我们看一段 for 循环语句的代码,如下所示:
for i = 1 : 1 : 10
disp(i);
end
上述代码让变量从 1 开始逐个输出变量的值直到变量等于 10,下面我们看下程序运行的结果:
下面是 while 循环语句,while 循环和 C 语言等其他语言中的运行方式一样,下面看一段代码:
i = 1
while i <= 10
disp(i);
i = i + 1;
end
上面的代码将 i 逐步运行到 10,并逐步输出 i 的值,程序的运行结果如下图所示:
程序控制
在 Matlab 中有和 C 语言相同的程序控制语句,具体几种用法和 C 语言的用法类似,这里只列出这几种程序控制语句:
continue 跳出当前循环的语句,重新进入下一循环
break 跳出当前循环
return 跳出程序
7. m文件
脚本文件
脚本文件可以在命令行中被调用,首先我们尝试创建一个脚本文件:在当前文件夹中右键,在右键的菜单中选中新建文件,再选择脚本来创建一个脚本,并命名为 Sum,双击脚本进行编辑,输入如下代码并保存:
number_1 = 1
number_2 = 2
disp(number_1 + number_2)
接下来我们在命令行窗口调用这个脚本:
函数文件
接下来我们介绍函数文件,函数和脚本的不同之处在于函数可以进行传入和传出参数,从而对传入的参数进行处理,首先我们先来创建一个函数文件,和创建脚本文件的方式类似,都是在当前文件夹窗口右键,在弹出的菜单中选择心建文件,之后选择函数,来创建一个函数文件,接下来我们创建一个名字为 Sum 的函数,并输入下面的代码并保存:
function [sum, total] = Sum(number_1, number_2)
total = 2
sum = number_1 + number_2
end
上面的代码将变量 number_1 和 number_2 传入函数 Sum,并且返回传入的变量的个数 total 和二者之和 sum
接下来我们在命令行窗口对函数进行调用,调用代码如下:
[a, b] = Sum(number_1, number_2)
上面的代码对函数 Sum 进行了调用,将返回的 sum 的值赋值给变量 a,将返回的变量 total 的值赋值给 b,下图是对这个函数的调用结果:
8.绘图
我们首先先确定一些数据供之后的程序使用,代码如下:
x = 0 : 0.1 : 10
y = sin(x)
z = cos(x)
我们先将 x 定义为从 0 到 10 的间隔为 0.1 的所有数字,y 为每一个 x 所对应的 sin 值,z 为每一个 x 所对应的 cos 值
二维曲线的绘制
二维曲线的绘图最基础的函数是 plot 函数,我们先来尝试绘制 x-y 函数的图像:
plot(y)
绘制结果如下图所示:
接下来我们以 x 为横轴,y 为纵轴重新绘制一下曲线:
plot(x, y)
绘制出的图像如下所示:
同样在 Matlab 中可以对矩阵进行绘图,如果对矩阵进行绘图是按照矩阵的每一列进行绘制,首先我们先将y 和 z 变为列并且拼接在一起:
matrix = [y', z']
之后再绘制这个矩阵的图像,图线的颜色会被自动区分,由于在 Matlab 中数据是以列的方式进行存储的,所以在绘制 y-x z-x 的图像的时候需要将数据转置后才能进行绘制,接下来进行绘制图像:
plot(matrix)
绘制的图像结果如下所示:
图像格式的设置
在 Matlab 中图像的形状和颜色并不是一成不变的,而是可以经过人为改变的,代码格式如下所示:
plot(横坐标,纵坐标,'a b c') a代表颜色,b代表线的形式,c代表点的形式
常见的图线的形式如下所示:
图线的颜色:b蓝 g绿 r红 c青 m紫 y黄 k黑 w白
图线的形式:-实线 :点线 --虚线 -.点画线
点的形式:.实点 o圆圈 x叉 +十字 *星号 s方块 d钻石 v下三角 ^上三角 <左三角 >右三角 p五角星 h六角星
演示如下:
plot(x, y, 'k -- x')
绘制的图线效果如下图所示:
接下来我们可以使用 axis 函数来确定坐标轴的最大值最小值从而设置坐标轴的范围,axis 的代码格式如下所示:
axis([x_min, x_max, y_min, y_max]) 其中x_min为x轴的最小值,x_max为x轴的最大值,y_min为y轴的最小值,y_max为y轴的最大值
示例代码如下所示:
plot(x, y, 'k -- x'), axis([0, 10, -2, 2])
所生成的图像如下图所示:
接下来我们可以通过函数尝试设置图像的标题和坐标轴的标签,代码格式如下所示:
title('string') 设置图像的标题为string
xlabel('string') 设置图像坐标轴的标签,同理还有ylabel, zlabel
legend('string_1', 'string_2', 'location', 'best') 将图线的名称命名为string_1, string_2其顺序和绘制图像的顺序相同,并且将图像的位置放置在最合适的位置
代码示例如下所示:
plot(x, matrix), axis([0, 10, -2, 2]), legend('sin', 'cos', 'location', 'best')
图像如下所示:
如果绘制接下来的曲线的同时还需要之前曲线的存在,就需要使用到 hold on 语句,代码示例如下所示:
plot(x, y)
hold on
plot(x, z)
我们可以看到下面的图像同时显示了出来:
如果不需要保持,那么可以使用语句 hold off
分块绘图,如果我们需要在一个窗口中显示多张图线,可以使用函数 subplot ,具体的代码格式如下所示:
subpolt(x, y, n) 将窗口分成 x * y 个小窗口,将接下来的图像绘制在第n个小窗口中
示例代码如下所示:
subplot(1, 2, 1);
plot(x, y);
subplot(1, 2, 2);
plot(x, z);
生成的图像的结果如下所示:
特殊曲线的绘制
下面列出了一些特殊曲线的设置方式:
柱状图
bar(x, y, width, '参数');
饼形图
pie(x, explode, 'lable');
直方图
hist(y, n);
hist(y, x);
离散数据图
stairs(x, y, 'b-o');
stem(x, y, 'fill');
candle(HI, LO, CL, OP);
向量图
compass(u, v, 'b-o');
compass(Z, 'b-o');
feather(u, v, 'b-o');
feather(Z, 'b-o');
quiver(x, y, u, v);
极坐标图
polar(theta, rho, 'b-o');
theta = -pi:0.01:pi;
rho = sin(theta);
polar(theta, rho, 'b')
对数坐标图
semilogx(x1, y1, 'b-o');
双纵坐标
plotyy(x1, y1, x2, y2, 'fun1', 'fun2');
函数绘图
f = 'sin(2*x)';
ezplot(f, [0, 2*pi]);
x = '2*cos(t)';
y = '4*sin(t)';
ezplot(x, y);
由于上面的函数使用并不频繁,所以这里不再赘述,如果需要了解具体的函数的使用方法,可以到官方手册进行了解
三维曲线曲面的绘制
对于三维曲线的绘制和二维曲线的绘制的方式类似,可以通过函数 plot3 进行绘制,绘制的格式和二维曲线的绘制方式相同,示例代码如下所示:
plot3(x, y, z)
绘制的结果如下所示:
接下来我们尝试绘制三维网格图像,首先我们先定义 x,y 轴的采样点,也同时规定了 x,y 轴的范围,代码如下所示:
x = -5 : 0.1 : 5;
y = -5 : 0.1 : 5;
接着我们使用函数获取在 xoy 平面上的网格点,这样才能得到网格曲面,这里需要用到函数 meshgrid 示例代码如下:
[X, Y] = meshgrid(x, y);
接着我们来确定 X,Y,Z 之间的关系,代码如下所示:
Z = X .^ 2 + Y .^ 2;
这一一定需要用到点乘方,因为这里需要的是数据之间相乘而不是矩阵相乘,所以这里必须加上点乘方
接下来可以通过 mesh 函数绘制这样的三位网格图像,代码如下所示:
mesh(X, Y, Z);
其中 X 和 Y 是通过 meshgrid 函数获得的网格点,Z 是网格顶点,绘制的图像如下图所示:
这里如果使用 surf 函数那么可以生成三位表面图,代码主体和上面相同,代码如下所示:
x = -5 : 0.1 : 5;
y = -5 : 0.1 : 5;
[X, Y] = meshgrid(x, y);
Z = X .^ 2 + Y .^ 2;
surf(X, Y, Z);
生成的图像如下图所示:
9.多项式
创建
我们先尝试创建一个系数向量,这个系数向量是按 x 降幂进行排列的,最右边是常数,我们可以使用函数 ploy2sym 进行创建一个可以运算的字符串函数,代码如下所示:
p = [1, 2, 3, 4, 5];
f = ploy2sym(p);
f
生成的多项式如下所示:
求值
如果我们要对多项式进行求值,可以使用 polyval 函数进行求值,我们尝试求当 x = 4 时的值,代码如下所示:
x = 4;
polyval(p, x)
计算结果如下所示:
求根
同时通过函数 roots 可以求得多项式根,当然通过函数 poly 也可以通过根求得多项式,其结果为系数矩阵,代码示例如下所示:
r = roots(p)
p = poly(r)
其结果如下所示:
10.数据插值
一维插值
yi = interp1(X, Y, xi, ‘method’)
X = [-3, -1, 0, 1, 3];
Y = [9, 1, 0, 1, 9]; XY为已知点横纵坐标向量
y2 = interp1(X, Y, 2); 差值预估在x=2的y的值,x不能超过已知范围(此处x<3)
y2m = interp1(X, Y, 2, ‘spline’); 用spline方法(三次样条)差值预估在x=2的y的值
二维插值
zi = interp1(X, Y, Z, xi, yi, ‘method’)
11.数据统计
我们先定义如下数据,方便以后的操作:
matrix = [1, 2, 3, 4, 5]
matrix_1 = [1, 2, 3; 4, 5, 6]
矩阵的最值
首先来看矩阵的最大值和最小值,可以通过内置函数 max,min 来实现,由于最大值和最小值操作完全一样,所以这里的示例代码全部以 max 函数为示例,示例代码如下:
max(matrix)
首先求得了矩阵的最大值,结果如下:
接下来我们尝试求得矩阵的最大值,并返回最大值的位置:
[max_number, posion] = max(matrix)
结果如下图所示:
下面我们尝试求一个矩阵的最大值,代码如下:
[max_number, posion] = max(matrix_1, [], 1)
[max_number, posion] = max(matrix_1, [], 2)
当第三个参数为 1 时,返回每一列最大元素所组成的行向量,当第三个参数为 2 时,返回每一行最大元素所组成的列向量,其结果如下图所示:
均值和中值
在 Matlab 中可以通过 mean 和 median 函数获得矩阵的均值和中值,示例代码如下:
mean(matrix)
median(matrix)
其结果如下图所示:
同样使用上上面的函数也可以对矩阵求均值和中值,代码如下所示:
mean(matrix_1, 1)
mean(matrix_1, 2)
median(matrix_1, 1)
median(matrix_1, 2)
具体结果如下图所示:
排序
在 Matlab 中运用的较多的时排序功能,是由 sort 函数进行实现的,同样可以对数列和矩阵进行操作,代码格式如下所示:
sort(matrix, 1, 'ascend') 其中matrix时待排序的数据或者矩阵,1为按列排序,2为按行排序,第三个参数当参数为ascend时按升序排序,为descend时按降序排序,当矩阵为一维时则不需要第二个参数
示例代码如下所示
sort(matrix, 'ascend')
sort(matrix, 'descend')
sort(matrix_1, 1, 'ascend')
sort(matrix_1, 2, 'descend')
运行结果如下所示:
求和积累加累成
Matlab 中通过函数 sum, prod, cumsum, sumpord 可以分别对数据进行求和,求积,求累加,求累乘的操作,示例代码如下所示:
sum(matrix)
prod(matrix)
cumsum(matrix)
cumprod(matrix)
获得的结果如下图所示: