matlab常用函数
函数 | 解释 |
---|---|
abs() | 绝对值,复数的模 |
sqrt() | 开方 |
exp() | 指数函数 |
log() | 对数,底为e |
log10() | 对数,底为10 |
log2() | 对数,底为2 |
sum() | 求和 |
mean() | 均值 |
std() | 标准差 |
var(),(std())^2 | 方差 |
cov() | 协方差 |
max() | 最大值 |
min() | 最小值 |
range() | 极差 max()-min() |
median() | 中位数 |
mode() | 众数 |
矩阵的运算
矩阵表示
% 行矩阵(元素用空格或逗号分隔)
m1 = [1,2,3]
m2 = [1 2 3]
% 列矩阵(分号表示换行)
m3 = [1;2;3]
使用冒号运算符生成矩阵
% m = 初始值:步长:终值(步长默认为1)
1:10
% ans = 1 2 3 4 5 6 7 8 9 10
1:2:10
% ans = 1 3 5 7 9
% m = linspace(初始值,终值,点数)(点数默认为100)
linspace(1, 10, 10)
% ans = 1 2 3 4 5 6 7 8 9 10
拼凑和变形
% 矩阵的拼接
m2 = [1 2 3]
m3 = [4 5 6]
[m2, m3] %行拼接
% ans = 1 2 3 4 5 6
[m2; m3] %列拼接
% ans = 1 2 3
% 4 5 6
% 矩阵的变形
m6 = 1:10
% 将m6变成两行五列的矩阵
reshape(m6, [2,5])
% ans = 1 3 5 7 9
% 2 4 6 8 10
几个特殊的矩阵和随机矩阵
特殊矩阵
% 单位矩阵 eye(n) n为阶数
n = 3
eye(n)
% ans = 1 0 0
% 0 1 0
% 0 0 1
% 全0矩阵
zeros(2);
% ans = 0 0
% 0 0
zeros(2,3) %也可以用zeros([2,3])表示
% ans = 0 0 0
% 0 0 0
% 全1矩阵
ones(3)
ones([2,3]) % ones([m,n]) m为行数,n为列数
% 三维矩阵 应用:黑白图像(二维矩阵)、彩色图像(三维矩阵,RGB三个通道,每个通道都是一个二维矩阵)
ones([3,5,2]) % [行 列 页]
% ans =
% ans(:,:,1) = 1 1 1 1 1
% 1 1 1 1 1
% 1 1 1 1 1
%
% ans(:,:,2) = 1 1 1 1 1
% 1 1 1 1 1
% 1 1 1 1 1
随机数矩阵
% 随机数矩阵
% rand:0-1之间的数(返回的数服从均匀分布)
% rand(n):n阶随机矩阵
% rand([m,n]):m为行数,n为列数
rand %生成随机数
rand(3) %生成3X3的随机矩阵
rand([3,5]) %生成3X5的随机矩阵
% 随机整数矩阵
% randi(max):[1,max]的整数
% randi(max,n):n阶矩阵,元素范围[1, max]
% randi(max, [m, n]):m*n矩阵,元素范围[1, max]
randi(10);
randi(10,3);
randi(10,[3,5])
% randn用法同rand一样,只不过randn服从正态分布
randn
矩阵的运算
% 获取矩阵的行列数
m = rand([3,5])
size(m)
% ans = 3 5
[row,col] = size(m)
% row = 3 col = 5
% 矩阵的转置、逆矩阵
m = randi(10, 3)
m' % 矩阵的转置
inv(m) % 逆矩阵
% 矩阵的特征值和特征向量
m = randi(10,3)
eig(m) % 矩阵的特征值
[V, D] = eig(m) % V:特征向量矩阵,D:特征值矩阵,对角元素为特征值
% 矩阵加减乘除、乘方运算
a = [1, 2; 3, 4]
b = a
a + b;
a - b;
a * b;
a.*b; % 对应元素相乘
a / b; % a*inv(b)
a./b; % 对应元素相除
a \ b; % 等价于inv(a)*b
a^5; % a*a*a*a*a
a.^5; %对应元素的五次方
广播机制
a = [1,2; 3,4]
b = 1
a+b % 把b广播成 [1,1; 1,1]
% ans = 2 3
% 4 5
逻辑运算
a = [1,2; 3,4];
b = [2,1; 3,4];
a == b; % 对每个元素进行逻辑判断
% ans = 0 0
% 1 1
a == 1; % 广播机制
% ans = 1 0
% 0 0
% 保留a大于2的元素,将小于等于2的元素置为0
(a > 2).*a
矩阵的索引
m = [1,2,3; 4,5,6; 7,8,9]
m(1) % ans = 1
m(8) % ans = 6 列方向检索,第8个位置
m([1,3,5]) %列方向检索,第1,3,5个位置的元素
% ans = 1 7 5
m(2,3) % ans = 6 第2行第3列位置的元素
m([1,2], 3) % 第1行和第2行的第3个元素
% ans = 3
% 6
m([1,2], [1,2]) % 第1、2行,第1、2列的元素
% ans = 1 2
% 4 5
1:3 % 冒号运算符(初始值:步长:终值)(步长默认是1)
% ans = 1 2 3
m(1:2, 1:3) % 前两行元素
% ans = 1 2 3
% 4 5 6
m(1:3, 2:3) % 后两列元素
% ans = 2 3
% 5 6
% 8 9
变量类型和转换
字符串和数值的转化
% str2num():字符串转数值
str2num("5") % ans = 5
str2num("5") + 4 % ans = 9
% num2str():数值转字符串,第二个蚕食为有效数字的位数
num2str(1/3)
% ans = '0.33333'
num2str(1/3,2)
% ans = '0.33'
输入和输出语句
% 输入语句 input() 输入数值或矩阵
value = input("请输入一个值:")
% 输入字符串,需要加第二个参数's'
string = input("请输入一个字符串:", 's')
% 输出语句,disp输出多个字段时,需要将多个字段转化成字符串矩阵,再进行输出
disp()
disp(["hello",2])
% "hello" "2"
disp(["1/3=",1/3])
% "1/3=" "0.33333"
if…else 控制语句
if(1 < 2)
disp("true")
end
% if 条件1
% 语句1
% elseif 条件2
% 语句2
% else
% 语句3
% end
for循环和while循环
% for循环
% for index = values
% 语句
% end
for i=[1,3,5]
disp(i)
end
for i = 1:100
disp(i)
end
% while循环
% while 表达式
% 语句
% end
n = 1
while n < 5
disp(n)
n = n + 1
end
break、continue、return
% continue 结束当前循环(continue后面的语句不再执行)
% break 退出整层循环(一层)
% return 退出多层循环
函数、匿名函数和脚本
% 函数
% function [输出参数] = myfun(输入参数)
% 函数体;
% end
s = area(2)
s = area([1, 2])
% 圆的周长
function s = area(r)
s = pi * r.^2
end
% 匿名函数
% f = @(输入参数) 函数体
% f:函数句柄
f = @(x)x.^2
f(2)
f([2,3])
f1 = @(x,y)x.^2+y.^2+2*x.*y
f2 = @fun
f3 = @(x)fun(x)
f2(5)
f3(6)
function y = fun(x)
y = x.^2
end
% 使用场景
% 函数体复杂时,使用函数
% 函数体简单时,使用匿名函数
matlab绘图与图形界面GUI
二维绘图命令 plot
% 绘制 y=sin(x)
x = linspace(0, 2*pi, 100);
y = sin(x);
plot(x, y);
% 一幅图形绘制多条曲线
% 方式一:hold
% hold on 开启图形保持功能,绘制多个图形对象
% hold off 关闭图形保持功能
x = linspace(0, 2*pi, 100);
y = sin(x);
y2 = cos(x);
plot(x, y);
hold on;
plot(x, y2);
hold off;
% 一幅图形绘制多条曲线
% 方式二:plot(x1, y1, x2, y2, ......)
plot(x, y, x, y2);
% 添加坐标轴标签(label)、标题(title)、图例(legend)
x = linspace(0, 2*pi, 100);
y = sin(x);
y2 = cos(x);
plot(x, y, x, y2);
xlabel('x');
ylabel('y = sin(x), y2 = cos(x)');
title('y = sin(x), y2 = cos(x)');
legend('y = sin(x)', 'y = cos(x)')
% 绘制多幅图 figure
% 在每次绘图前面加 figure函数
x = linspace(0, 2*pi, 100);
y = sin(x);
y2 = cos(x);
figure;
plot(x, y);
figure;
plot(x, y2);
% 绘制多个子图
% subplot(m, n, i):m行n列 第i个图形
x = linspace(0, 2*pi, 100);
y = sin(x);
y2 = cos(x);
subplot(1, 2, 1);
plot(x, y);
subplot(1, 2, 2);
plot(x, y2);
图形的美观
% 绘图修饰(线型、线宽、颜色、描点类型、网格、坐标轴刻度 ......)
% plot(x, y, '- r o') 线型、颜色(红色r)、描点类型(顺序可变)
x = linspace(0, 2*pi, 100);
y = sin(x);
plot(x, y, '- r o')
% 具体可查matlab手册
plot(x,y,'- b p',...
'LineWidth',2,... % 线宽
'MarkerEdgeColor','b',... % 描点边框颜色
'MarkerFaceColor',[0.5,0.5,0.5],... % 描点内部填充颜色
'MarkerSize',10) % 描点大小
% grid on 添加网格
% grid off 取消网格
% axis on 显示坐标轴、刻度线和坐标轴标签
% axis off 关闭坐标轴、刻度线和坐标轴标签
% axis([xmin, xmax, ymin, ymax]) 设置x轴和y轴的显示范围
% axis equal 沿每个坐标轴使用相同的数据单位长度
% axis square 使用相同长度的坐标轴线。相应调整数据单位之间的增量
绘制 gif 动图
基本思想:先生成多张静态图,然后组合成gif图
for i = [500, 1000, 5000, 10000]
x1 = linspace(0, 1, 10000);
y1 = (1-x1.^2).^0.6;
x2 = rand([1,i]);
y2 = rand([1,i]);
count = 0;
for j=1:i
if x2(j)^2 + y2(j)^2 <= 1
count = count + 1;
end
end
plot(x1, y1,"k .", x2, y2, ".");
title([num2str(count) + "/" + num2str(i) + " * " + "4" + " = " + num2str(count/i*4)])
axis square
frame = getframe(gcf); % 捕获坐标区或图窗作为影片帧
I = frame2im(frame); % 返回与影片帧关联的图像数据
[I, map] = rgb2ind(I, 256); % 将RGB图像转换为索引图像I,关联颜色图为 map
if i == 500
imwrite(I, map, 'test.gif', 'gif', 'Loopcount', inf, 'DelayTime', 0.5);
else
imwrite(I, map, 'test.gif', 'gif', 'WriteMode', 'append', 'DelayTime', 0.5);
end
end
更多二维绘图命令
errorbar
含误差条的线图histogram
直方图scatter
散点图bar
柱状图pie
饼图
% errorbar:含误差条的线图
% errorbar(x, y, err) 绘制 y 对 x 的图,并在每个数据点处绘制一个垂直误差条
x = linspace(0, 100, 10);
y = x.^0.5;
err = rand(size(x))
errorbar(x, y, err);
% histogram:直方图
% histogram(x, n) 基于 X 创建直方图,n为区间数量
x = randn([1, 100000]);
n = 10;
histogram(x, n);
% 散点图
% scatter(x, y) 在向量 x 和 y 指定的位置创建一个包含圆形的散点图
% 跟 plot() 的用法差不多
x = linspace(0, 2*pi, 30);
y = sin(x);
scatter(x, y, 'black');
% 柱状图
% bar(y) 创建一个条形图,y 中的每个元素对应一个条形
% 如果 y 是 m x n 的矩阵,则 bar 创建每组包含n个条形的m个组
y = [2 3 6; 11 23 26];
bar(y);
% 饼图
% pie(X, explode) 使用 X 中的数据绘制饼图。饼图的每个扇区代表 X 中的一个元素;
% explode 将扇区从饼图偏移一定位置
X = [1 3 0.5 2.5 2];
explode = [0 1 0 1 0];
pie(X,explode);
三维绘图之曲线、曲面和散点图
- 三维曲线
plot3
- 散点图
scatter3
- 三维曲面
mesh、surf
基本思想:连点成面
% plot3(X1,Y1,Z1,LineSpec1,...,Xn,Yn,Zn,LineSpecn)
x = linspace(0, 6*pi, 200);
y = sin(x);
z = cos(x);
plot3(y, z, x)
xlabel('x');
ylabel('sin(x)');
zlabel('cos(x)');
title('y = sin(x),z = cos(x)');
% 三维散点图
% scatter3 用法类似scatter
x = linspace(0, 6*pi, 300);
y = sin(x);
z = cos(x);
scatter3(x, y, z, 'o', 'MarkerEdgeColor','b','MarkerFaceColor','r')
% mesh 网格图
% surf 曲面图
% 绘制 z = x*e^(-(x^2+y^2))
[x, y] = meshgrid(-10:1:10, -10:1:10);
z = x.*exp(-(x.^2+y.^2));
mesh(x, y, z);
surf(x, y, z);
matlab的文件读写
文件读写
- 将数据写入文件:
writetable(txt、Excel)
- 从文件读取数据:
readtable(txt、Excel)
% 将数据写入文件
% writetable(m, filename):将m写入名为filename的文件
% 支持的文件扩展名:.txt、.csv、.xls、.xlsm 或 .xlsx
m = rand(4) + 1;
t = table(m);
writetable(t, 'm.txt') % 相对路径
writetable(t, 'E:\m.txt') % 绝对路径
% delimiter(指定分隔符):","(默认)、" "、"\t"、";"、"|"
writetable(t, 'm.txt', "Delimiter", "\t"); % 相对路径
% "WriteVariableNames":是否写入变量名
writetable(t, 'm.txt', "delimiter", "\t", "WriteVariableNames", flase); % 相对路径
% 将多个矩阵保存在同一文件 "WriteMode" "append"追加
t2 = table(eye(4))
writetable(t2, 'm.txt', "Delimiter", "\t", "WriteVariableNames", false", "WriteMode", "append"); % 相对路径
从文件中读取数据
% t = readtable(filename) 从filename文件中读取数据
% 支持的文件扩展名:.txt、.csv、.xls、.xlsm 或 .xlsx
t = readtable('m.txt')
m = table2array(t)
方程和方程组的解析解(solve)
solve函数用法:solve(方程1, 方程2, …, 变量1, 变量2, …)
多项式合并: ( x + 3 x − 5 x ) x / 4 (x+3x-5x)x/4 (x+3x−5x)x/4
syms x
(x+3*x-5*x)*x/4
方程1: a x 2 + b x + c = 0 ax^2+bx+c = 0 ax2+bx+c=0
syms a b c x
solve(a*x^2 + b*x + c, x)
方程2: 2 x − x 2 = e − x 2x-x^2=e^{-x} 2x−x2=e−x
syms x
y = 2*x - x^2 - exp(-x);
solve(y, x)
方程组1: { x + b y = 5 a x − y = x \left\{\begin{array}{l} x+b y=5 \\ a x-y=x \end{array}\right. {x+by=5ax−y=x
syms a b x y
y1 = x + b*y - 5;
y2 = a*x - y - x;
res = solve(y1, y2, x, y);
res.x;
res.y;
方程组2: { e − e − x 1 − x 2 = x 2 ( 1 + x 1 2 ) x 1 cos ( x 2 ) + x 2 sin ( x 1 ) = 1 2 \left\{\begin{array}{l} e^{-e^{-x_{1}-x_{2}}}=x_{2}\left(1+x_{1}^{2}\right) \\ x_{1} \cos \left(x_{2}\right)+x_{2} \sin \left(x_{1}\right)=\frac{1}{2} \end{array}\right. {e−e−x1−x2=x2(1+x12)x1cos(x2)+x2sin(x1)=21
syms x1 x2
y1 = exp(-exp(-x1-x2)) - x2*(1+x1^2);
y2 = x1*cos(x2)+x2*sin(x1)-1/2;
res = solve(y1, y2, x1, x2);
res.x1
res.x2