专业拓展课的笔记,水课,记得也很水
lesson one
几个常用命令
namelengthmax
可以查看变量名最大长度clear
清空当前所有变量clc
清屏who
查看当前所有变量whos
查看变量详细信息%
注释符edit roots
查看部分开源函数的源代码
数据类型
实数 double(数值默认类型) single
整数 int8 int32等 uint8 uint64等 8-16-32-64
字符 char
逻辑 true/false 1/0
常用命令和函数用法
- double强制转换int会四舍五入
b = a ^ 2;
幂次b = mod(a, m)
取模运算b ≡ a mod m
format
命令控制输出格式format long
format short
(默认)format loose
(默认)format compact
format rat
- 两种除法
/
和\
help elfun
查看初等数学常用函数doc sin
查看某函数文档fix(a)
在0-a之间取最接近a的数a = rand
生成0到1之间的伪随机数a + (b - a) * rand
产生a到b之间的伪随机数randi([a,b])
产生a到b之间的伪随机整数- ln(x)表示为
log(x)
exp(a)
表示自然对数e的a次方asin acos atan acot
弧度制反三角函数asind acosd atand acotd
角度制反三角函数
lesson two
- 不等于表示为
~=
行向量
- 直接输入生成一个向量,例
v = [1 2 3]
各元素之间用空格或逗号分隔 - 空向量
v=[]
空向量可以用于删除向量中的元素,或删除矩阵中的行或列,赋值即删除 randi([imin,imax], [m, n])
生成m行n列从imin到imax随机整数向量- 冒号运算符生成,
v = a:h:b
从a开始按步长h依次取到不超过b,h缺省时默认为1 - linspace函数生成,
v = linspace(a,b,n)
从a开始到b结束的n维等差向量,即n个元素,n默认100
列向量
- 直接输入,
v = [1;2;3]
各元素之间用分号分隔 - 行向量转置,
c = v'
转置运算符'
向量的引用和修改
- 向量中的元素下标从1开始 访问元素用小括号,单个元素
v(7)
多个连续元素v(1:4)
多个不连续元素v([1 5 7])
- 可以通过指定索引修改元素的值,
v(1) = 3
- 可以通过不存在的索引扩展向量,若
v = [1 2 3]
则v(4) = 4
扩充一个元素,若v(8) = 8
则中间的元素用0填充
矩阵的创建
- 直接输入,
mat = [1 2 3;4 5 6]
依次输入各个元素,同行元素之间用空格或逗号隔开,行与行之间用分号或回车隔开 - 函数
rand(n)
生成n阶0到1随机数方阵rand(m,n)
生成m行n列0到1随机数矩阵randi([a,b],n)
生成n阶a到b之间随机整数的方阵randi([a,b],m,n)
生成m行n列a到b之间的随机整数矩阵zeros(m,n)
生成m行n列零矩阵ones(m,n)
生成m行n列全1矩阵eye(n)
生成n阶单位矩阵
矩阵的引用和修改
- 用行列两个下标访问 访问单个元素
mat(2,3)
访问多个连续元素第1、2行第2、3列mat(1:2,2:3)
mat(1:2,:)
访问矩阵第一行至第二行mat(:,1:2)
访问矩阵第一列至第二列- matlab存储矩阵以列为主,所以mat(3)访问矩阵从第一列逐列展开后的第3个元素
- 可以根据索引修改矩阵的一个元素
mat(1,2)=11
,也可同时修改多个元素mat(1,:)=5:7
修改第一行 - 扩展矩阵只能整行整列的添加,若添加行或添加列与当前矩阵有空隙,则用0填充
- 添加行
mat(3,:)=1:3
添加列(转置)mat(:,4)=[1 2 3]'
向量和矩阵的维数
length(A)
返回矩阵A的行列中的最大值,若A是向量则表示向量的维数size(A)
返回矩阵A的行数和列数size(A,1)
只返回行数size(A,2)
只返回列数numel(A)
返回矩阵A元素个数
矩阵操作
reshape(A,m,n)
重构矩阵A,m*n要等于矩阵A的元素个数,矩阵会按列展开重新填充fliplr(A)
左右翻转,第一列变最后一列,第二列变倒数第二列flipud(A)
上下翻转,与左右翻转类似rot90(A)
逆时针旋转矩阵A90°rot90(A,-1)
顺时针旋转90度rot90(A,2)
旋转180度repmat(A,m,n)
生成m行n列分块矩阵,每一块都是矩阵A
矩阵和向量的运算
2*A
A*2
矩阵的数乘 每个元素都乘2A/2
等同于数乘A+B
A-B
两矩阵必须同型A*B
A的列数必须等于B的行数A.*B
相同位置元素相乘,AB必须同型A./B
A.\B
相同位置元素做除法,AB必须同型A.^n
A的每个元素的n次方dot(x,y)
向量x和y的内积cross(x,y)
三维向量的叉乘inv(A)
A的逆矩阵pinv(A)
广义逆矩阵
lesson three
矩阵和向量的关系运算
- AB矩阵同型,
A > B
逐个比较每个元素,返回一个同型的结果矩阵,> < >= <= == ~=
- AB矩阵同型,
isequal(A, B)
完全一样返回一个1,否则返回一个0
逻辑内置函数
all(v)
逻辑向量全为1返回1,否则返回0all(A)
逻辑矩阵是否每一列全为1,返回一个逻辑向量any(v)
any(A)
判断向量、矩阵每一列 是否有1
矩阵和向量相关函数
min(v)
求向量v最小元素min(A)
求矩阵每一列最小元素,返回一个向量max(v)
求向量v最大元素max(A)
求矩阵每一列最大元素,返回一个向量- 最大和最小函数还能返回下标,
[value, index] = min(v)
sum(v)
求向量所有元素的和sum(A)
求矩阵每一列的和,返回一个向量prod(v)
求向量所有元素的乘积prod(A)
求矩阵每一列的乘积,返回一个向量cumsum(v)
求向量v的累加向量cumsum(A)
求矩阵每一列的累加和,返回一个与A同型的矩阵cumprod(v)
求向量v的累乘向量cumprod(A)
求矩阵每一列的累乘,返回一个与A同型的矩阵find(condition)
返回满足条件condition的索引diff(v)
求向量相邻元素之间的差,返回一个向量,维数比v少1diff(A)
求矩阵每一列相邻元素的差,返回一个矩阵,其行数减1- 函数
meshgrid
可以用来指定图像中点的坐标x和y,也可以用来计算x和y的函数,它接受两个向量作为输入参数,返回两个分别指定x和y数值的矩阵。
输入和输出
x = input('output')
类似python的函数 输入数字x = input('input str','s')
输入字符串,直接input()
输入'string'
也是输入字符串。空格也算入字符串- 输入变量名就会使用该变量
disp(x)
输出x的值,不显示变量名fprintf()
格式化输出函数%d
整数%-md
域宽m,负号左对齐%e
实数,科学计数法%f
实数,小数形式%m.nf
域宽是m,保留小数点后n位,m可省略 .不能省略%g
系统自动选取上述两种之一%s
字符串%ms
m是域宽%c
单个字符
lesson four
输入和输出
- 打印矩阵的元素
fprintf('%d ',mat)
disp(mat)
脚本生成图形
clf
clear figures- plot函数
plot(v)
连接向量v所有点,折线图- 例画三角函数,
x=0:0.1:2*pi; y=sin(x); plot(x,y)
hold on
之后画图在同一张图上title('sin function')
给图加titlexlabel('x')
ylabel('sin(x)')
给横纵坐标轴加labellegend('sin','cos')
区分两个函数曲线plot(x,y,':+r')
引号内设置格式+ o * . x s d ^ v < > p h
图形线条的填充
符号 | 说明 | 符号 | 说明 |
---|---|---|---|
- | 实线(默认) | r | 红色 |
– | 虚线 | g | 绿色 |
: | 点线 | b | 蓝色 |
-. | 点划线 | y | 黄色 |
m | 品红色 | c | 青蓝色 |
w | 白色 | k | 黑色 |
文件输入输出
save file.dat matrix2 -ascii
保存矩阵数据到dat文件,会覆盖原文件数据save file.dat matrix3 -ascii -append
追加,尽量使列数一致,不一致也可以保存但是后续load
会出问题load file.dat
把文件内数据加载成一个矩阵,矩阵名与文件名一致
函数定义
- 函数头↓ 函数尾的end可省略
function [ output_args ] = func_name ( input_args ) end
lesson five
if语句
if condition
%...
elseif
%...
else
%...
end
switch语句
switch 表达式
case xxx
%case语句不支持逻辑判断
case {x,y}
%...
case yyy
%...
otherwise
%...
end
lesson six
menu
choice = menu('title', 'opt1', 'opt2', ... , 'optn');
生成图形窗口,返回数字1、2…,不选返回0
is函数
isletter
isspace
ischar
isfloat
isinteger
islogical
isnumeric
isreal
isvector
isrow
iscolumn
ismatrix
isempty
for循环
for loopvar = range
%range通常是一个向量
end
while循环
while condition
%...
end
lesson seven
factorial(n)
计算阶乘[~,var2] = function(arg1)
只要函数的第二个返回值,不用的用波浪线占位。只用一个变量只接收第一个返回值
lesson eight
- 同一脚本文件内,与文件同名的函数是主函数,可以有其他函数。
- 持续变量,相当于静态变量,只能在函数内使用。
persistent var_name
声明持续变量。clear function_name
清除持续变量需要用函数名。其他函数使用该变量与该持续变量独立。
lesson nine
符号计算
sym
sym var
声明单个变量var = sym('var', set)
产生符号变量var属于集合setmat = sym('mat', [2, 3])
生成空符号矩阵
syms
syms x y ...
声明多个变量f(x) = x + 2 * y
声明符号表达式,f(1)
代数计算结果也是符号类型
symvar
symvar(f)
查看f的所有符号变量symvar(f, n)
查看前 $n$ 个符号变量,$n=1$ 时为默认变量
subs
subs(f, [old], [new])
用新符号变量替换旧的,不会覆盖 $f$。可同时替换多个,需要中括号subs(f, new)
替换默认变量
符号与数值之间的转换
t = 0.1;
sym(t);
sym(t, 'r'); %转为rational
sym(t, 'f'); %转为floating
sym(t, 'e'); %转为 rational + 浮点数与真实值的误差
sym(t, 'd'); %转为decimal
符号表达式化简
collect(f)
对表达式 $f$ 合并同类项collect(f, y)
指定变量 $y$expand(f)
展开factor(f)
因式分解numden(f)
通分,返回分子与分母simplify(f)
化简
符号微积分
limit(f, var, a, 'left')
左极限diff(y)
求导或差分diff(y, n)
求 $n$ 阶导数diff(y, x, n)
指定变量symsum(exp,var)
指定变量的前 $n$ 项和symsum(exp, var, a, b)
从 $a$ 到 $b$ 的和
lesson ten
int(exp, var, a, b)
指定变量的定积分,不指定 $a$ $b$ 则为定积分solve(f)
解 $f=0$ 方程,解出来是精确根roots([a, b, c])
解多项式方程 $ax^2+bx+c=0$ 的根f1 = ...; f2 = ...; f3 = ...; [x, y, z] = solve(f1, f2, f3)
解方程组ezplot(sin(x))
画二维图ezsurf(sin(x*y))
三维图
字符串
- 可以直接创建字符串矩阵,一个字符串是一行,每行长度必须一致
mat = char('how', 'dare', 'you')
长度可以不同,但是会用空格补齐- 输入单引号需要另一个单引号转义
strcat(str1, str2)
连接字符串,但是会删除后置空格blanks(n)
创建 $n$ 个空格的字符串sprintf()
生成格式化字符串num2str(n)
数字转字符串num2str(num, n)
数字转字符串并保留 $n$ 位有效数字int2str(n)
整数转字符串str2num(str)
字符串转数字,若有空格则转为向量deblank()
删除后置空格strtrim()
删除前置和后置空格
lesson eleven
upper()
lower()
字符串大小写转换strcmp(str1, str2)
相同返回1,不同返回0strncmp(str1, str2, n)
比较前 $n$ 个字符strcmpi(str1, str2)
忽略大小写比较strncmpi(str1, str2, n)
忽略大小写比较前 $n$ 个字符strfind(str1, str2)
在第一个字符串里找第二个字符串的匹配,返回匹配的第一个字符的所有索引,没有返回空findstr(str1, str2)
在较长字符串中匹配较短的,位置无所谓strrep(str, strold, strnew)
在指定字符串中用新的替换旧的[part1, part2] = strtok(str, delimeter)
按照指定的分隔符分割字符串为两段,分隔符放在第二段,默认为空格
元胞数组
- 直接输入,与矩阵类似,区别在用大括号
- 用函数生成,
cellmat = cell(2, 2)
- 元胞索引访问用小括号,返回类型是元胞,
cellmat(1)
- 内容索引访问用大括号,返回类型是元胞值,
cellmat{1}
cellstr(str)
字符转元胞
结构体
p = struct('attr1', val1, 'attr2', val2....)
p.attr1 = val1;
disp
可以显示完整的结构体或一个域,fprintf
只能打印单独的域p = rmfield(p, 'attr1')
删除指定域
lesson twelve
fid = fopen(filename, permission)
res = fclose(fid)
fprintf(fid, format, vars)
experiment 1
subplot
画子图,一个figure中画多张子图。比如subplot(2, 4, i)
2行4列共8张子图,当前第 $i$ 张- 画三维曲面。例
[x, y] = meshgrid([-5:0.1:5], [-10:0.1:10])
定义 $x$ 和 $y$ 的区间形成网格点坐标矩阵。z = sin(x .* y); surf(x, y, z)
定义函数之后surf
画图。 plot3
画三维曲线