前言:
- 本文是之前学Matlab时候做的笔记,很适合快速入门
- 数学建模中matlab和python是最常用的两个软件,现在本人更喜欢python去做数学建模
文章目录
界面介绍与操作
- 工具栏:快捷操作
- 编码器:脚本代码窗口
- 工作区:脚本变量窗口
- 工作路径:当前文件索引
快捷操作
最常用的:
- clear
- clc
- dbstop if error
数据类型
数值型
整型
-
(u)int8、(u)int16、(u)int32、(u)int64 (u):是无符号类型
a = int8(8) a = uint8(8)
浮点型
默认情况下,MATLAB其所有算术计算符合IEEE标准的双浮点精度执行
- single :单精度
- double :双精度
%matlab还可以让字符转为ASCII值
s = 'wang yang'
b = double(s(1)) %S(1) 代表着 ‘w'
复型
- z = a + bi
z = 5 + 3i
real(z) % 实部
imag(z) %虚部
abs(z) %模
angle(z) %arctan b/a
逻辑型
- logical :matlab中 0 为假,1为真
- 逻辑运算符的结果
字符型
a = [1:5]; %a为一个数值数组
b = num2str(a); %该函数将a转化为字符串类型
x1 = a*2; %此处为a中的数值一次乘2
struct数组
注意:matlab中索引是从1开始的
%%
structTemp = struct('name',{'汪洋','王国森','施轶秋'},'age',{18,18,18}) //一一对应
structTemp.name(1)
structTemp.name(2)
structTemp.name(2)
structTemp.age(1)
structTemp.age(2)
structTemp.age(3)
structTmep
structTemp
%%
%%
my.name = "汪洋"
my.age = 18
my
%%
%删除 但是要在扩展库中下载
structTemp = struct('name',{'汪洋','王国森','施轶秋'},'age',{18,18,18})
field = {'name'}
structTemp = rmfield(structTemp,field)
structTemp
cell数组
*元胞数组*是一种包含名为*元胞*的索引数据容器的数据类型,其中的每个元胞都可以包含任意类型的数据。元胞数组通常包含文本列表、文本和数字的组合或者不同大小的数值数组。通过将索引括在圆括号
()中可以引用元胞集。使用花括号
{} 进行索引来访问元胞的内容。
- 要用{}赋值
- 使用"()"访问
%1、要维度一样
%2、要用{}
a = {1,2,3,4;'w','w','x','w'};
b = cell(3)
c = cell(5,2)
%使用"()"访问
%以下4种赋值方式是一样的
A(1,1)={2}
A(1,2)={[2]}
A{2,1}=2
A{2,2}=[2]
函数句柄
日期和时间型
https://www.cnblogs.com/yymn/p/9170252.html
数据标准
- realmax 数据最大值
- realmin 数据最小值
- 结果异常值:
- nan
- inf
变量储存
利用MAT文件可以把当前MATLAB工作空间中的变量保留下来
MAT文件是一种二进制格式文件,文件后缀.mat
变量写入文件与导入matlab通过save和load命令:
save 文件名 [变量名列表]
load 文件名 [变量名列表]
当然可以通过主窗口的界面操作进行保存与导入
注:
1.文件名不需要加引号,不需要带文件后缀.mat,可以带路径
2.变量名列表中变量的个数不限,省略则默认写入/导入所有的变量,多个变量名之间用空格隔开
save mydata a x %%把a x存入mydata文件中,下次就可以使用
load mydata %%将mydata文件中的内容
基本运算
%%
%基本运算
(1+sqrt(4))/2 %开平方根
8^(1/3) %开任意方根,注意优先级^大
power(8,1/3) %开任意方根,注意复数模式 等价于^ 如下:
power(-8,0.3)^(1/0.3) %理论仍是-8,但结果已经变成复数
log(1.5) %以e为底的对数
log10(1.5) %以10为底的对数
log2(1.5) %以2为底的对数
log1p(x) %=log(x+1) 注意一下 : 比log精度更高,特别是x趋于0的时候 1
log(9)/log(3) %利用换底公式求任意
exp(2) %以e为底的指数
expm1(2) % = exp(x)-1 e^x 的泰勒级数展开
pow2(10) %以2为底的指数
nextpow2(20) %寻找最大的n,使得2^(n-1)小于该值 注意一下
sin(pi/6) %正弦
cos(pi/6) %余弦
sinpi(1/6) %=sin(1/6*pi)
cospi(1/6) %=cos(1/6*pi)
tan(pi/4) %正切
asin(1/2) %反正弦,弧度制
acos(1/2) %反余弦,弧度制
atan(1) %反正切,弧度制
asind(1/2) %反正弦,角度制
acosd(1/2) %反余弦,角度制
atand(1) %反正切,角度制
atan2(1,-1) %四象限反正切
mod(17,4) %求余数
rem(17,4) %求与被除数符号相同余数
sign(-1) %符号函数
fix(1.1072) %向正去穷取整数
floor(1.1072) %向负无穷取整数
ceil(1.1072) %比他大的最近一个整数
round(1.1072) %四舍五入
roundn(1.1072,-2) %按小数位置四舍五入
%%
%整体运算
max([1,2,3,4,5]) %最大值
min([1,2,3,4,5]) %最小值
mean([1,2,3,4,5]) %平均值
median([1,2,3,4,5]) %中位数
prod([1,2,3,4,5]) %求积
sum([1,2,3,4,5]) %最和
var([1,2,3,4,5]) %方差
std([1,2,3,4,5]) %标准差
cov([1,2,3,4,5],[5,4,3,2,1]) %协方差
%%
%生成随机数
rand() %生成0-1均匀分布的的随机数
randi(100) %生成0到100均匀分布随机数,注意辨别参数的意义
randn(1)%生成正态分布的的随机数
sprand(10,10,0.5)%稀疏均匀分布随机矩阵 最后一个参数表示的是密度 注意一下:稀疏矩阵0是不显示的
sprandn(10,10,0.5) %稀疏正态分布随机矩阵
rng('default') %随机种子
矩阵基础
矩阵是matlab的核心
向量、矩阵:
- 向量可以理解为一维数组,也可以看作是矩阵的特殊形式
- 矩阵可以理解为二维数组
向量
命名规范:
起始数据 : 数据间隔(可省略,默认为1) : 结束数据
%%
1 : 100(等价于1:1:100) %范围为1到100,间隔为1,1×100的向量
1 : 2 : 100 %范围为1到100,间隔为2, 1×50的向量
100 : -1 : 1 %范围为100到1,间隔为-1, 1×100的向量
1 : 1 : 100.7 %范围为1到100(≤100.7的最大数),1×100的向量
%%
矩阵
- 采用逗号或空格来分割行元素
;
- 采取分号或者换行来分隔列元素
- 注意维数
zeros(m,n) / (m) %创建m*n的零矩阵
ones(m,n) %创建m*n的一矩阵(全是一)
eye(m,n) %创建m*n的(伪)单位矩阵
magic(m) %创建m的换方阵,行列相等
rand(m,n)/randn(m,n) %创建m*n的随机矩阵,rand是0-1的范围,randn是m-n的范围
meshgrid(L,N) %创建基矩阵
repmat(A,m,n) %将A扩大m*n倍
reshape( Matrix_in , m , n) %扩充矩阵,注意不能改矩阵的元素
%%
meshgrid(坐标)
m=1:5;
n=2:7;
[A,B]=meshgrid(m,n)
A =
1 2 3 4 5
1 2 3 4 5
1 2 3 4 5
1 2 3 4 5
1 2 3 4 5
1 2 3 4 5
B =
2 2 2 2 2
3 3 3 3 3
4 4 4 4 4
5 5 5 5 5
6 6 6 6 6
7 7 7 7 7
%%
矩阵运算
- 矩阵相乘 A*B
- 矩阵右除 A/B等价于A与B的逆乘
- 矩阵左除 A\B等价于A的逆乘与B
- 矩阵数乘 A.*B 矩阵中元素两两相乘
- 矩阵右除 A./B
- 矩阵左除 A.\B
- 对于数+/-矩阵,相当于每个元素都加或者减一
其他运算:(运行规则和矩阵运算相同)
- inv(A) 矩阵求逆
- pinv(A) 矩阵求伪逆 逆不唯一,对于非方阵来说,A * B * A ≈ A满足这个就行
- A’ 矩阵转置
- det(A) 矩阵行列式
- trace(A) 行列式的迹
- eig(A) 特征向量和特征值 [X,Y] = eig(A)
- lu(A) [L, U, P] = lu(A);
L
是一个下三角矩阵,U
是一个上三角矩阵,P
是一个置换矩阵,使得PA = LU
。 - qr(A) [Q, R] = qr(A);
Q
是一个正交矩阵,R
是一个上三角矩阵,使得A = QR
。
矩阵大小和向量大小
冒号运算符号(遍历矩阵)
- 注意下标是从1开始的
- 注意的是:matlab中永远是行为先
稀疏矩阵
采用三元组的方式存储,不储存0
- sparse(m,n)
- 可以强制转换矩阵为稀疏矩阵
逻辑基础
logical,真为1,0为假
符号 | 功能 |
---|---|
== | 判断是否相等 |
~= | 判断是否不等 |
< | 判断是否小于 |
<= | 判断是否小于等于 |
> | 判断是否大于 |
>= | 判断是否大于等于 |
符号 | 功能 |
---|---|
isnan( ) | 判断是否非数 |
isinf( ) | 判断是否无穷大 |
isempty( ) | 判断是否为空 |
isreal( ) | 判断是否为实数(甄别复数) |
标量和矢量:
- 标量:固定的,如:x= 5
- 矢量:矢量(Vector)在MATLAB中则用于表示一系列相关的数值,它被定义为一维数组或序列,可以是行向量或列向量。
优先级
优先级 | 符号 |
---|---|
1(最高) | 括号( ) |
2 | 转置 ’ ;次幂 ^ |
3 | 一元运算符 + - ~ |
4 | 乘除 * / \ |
5 | 加减 + - |
6 | 冒号表达式 : |
7 | 二元比较逻辑 > >= < <= ~= |
8 | 逻辑与 & |
9 | 逻辑或 | |
10 | 标量逻辑与 && |
11(最低) | 标量逻辑或 || |
- 只要记住:()优先级是最高的就可以了
结构基础
if-else-end
注意点:
- endif不能写成else if
- 记得要写end
a=1;b=2;c=1;
delta=b^2-4*a*c;
if delta>0
x(1)=(-b+sqrt(delta))/2/a;
x(2)=(-b-sqrt(delta))/2/a;
elseif delta==0
x=(-b+sqrt(delta))/2/a;
else
x=[];
end
switch-case-otherwise
注意点:
- otherwise不需要提供判断条件,当其他分支均不满足条件时候被执行
- break别忘了
- switch不能指定范围
a=1;b=2;c=1;
delta=b^2-4*a*c;
switch sign(delta)
case 1
x(1)=(-b+sqrt(delta))/2/a;
x(2)=(-b-sqrt(delta))/2/a;
case 0
x=(-b+sqrt(delta))/2/a;
otherwise
x=[];
end
for
注意点:
- index在values中按顺序进行取值,value一般是行向量,一般采用冒泡表达式
- 当value值为矩阵时候,按照列进行切割,每次value取矩阵的一列
- 别忘了end
s=10;
H = zeros(s);
for i = 1:s
for j = 1:s
H(ii,jj) = 1/(ii+jj-1);
end
end
parfor
- 只要记得他是用来加速for循环的
while
- 注意别忘了end
%% while
n = 10;
f = n;
while n > 1
n = n-1;
f = f*n;
end
%注意:n的更新条件
break、continue、return
- break 跳出循环体
- continue 跳出本次循环
- return 跳出函数体,matlab一般很少使用
%% break
limit = 0.8; s = 0;
while 1
tmp = rand;
if tmp > limit
break
end
s = s + tmp;
end
%% continue
limit = 0.8; s = 0;
while 1
tmp = rand;
if tmp > limit
continue
end
s = s + tmp;
end
函数
- 函数需要存m文件(在保存的时候选择函数),默认函数名就是文件名字
- 不要睡意改变文件名字,否则调用容易出问题
- 如果matlab里面有这个函数,就不要去实现
%如:自定义文件
function [aa,bb] = m_max(a,b)
%UNTITLED 此处提供此函数的摘要
% 此处提供详细说明
if a > b
aa = a
bb = b
else
aa = b
bb = a
end
nargin
function c = addme(a,b)
% switch nargin
% case 2
% c = a + b;
% case 1
% c = a + a;
% otherwise
% c = 0;
% end
if nargin<2
b=1;
end
c=a+b;
end
~
function [c1,c2] = opem(a,b)
if nargin < 2
b = 1;
end
c1 = a + b;
c2 = a - b;
end
%%
如果不想c1,可以这样写 [~,c2]
%%
函数查询
https://blog.csdn.net/ywsydwsbn/article/details/123857932?ops_request_misc=%257B%2522request%255Fid%2522%253A%2522169478642516800226595731%2522%252C%2522scm%2522%253A%252220140713.130102334
- 不会的函数,直接bing、百度等
特殊形式
函数句柄
%创建函数句柄
fun1 = @open
[a,b] = fun(1,1)
%fun2 = @(x,y)(x+y)
%输出 ans = 2