科学计算软件
变量命名:
| 命令 | 含义 |
|---|---|
| clc | 清除命令行窗口的内容 |
| clear | 清除workspace中的所有变量 |
| clear x y z… | 清除workspace中的变量x, y, z等 |
| who、whos | 显示workspace中的变量信息 |
| help、doc | 在线帮助文档 |
路径相关问题
1 | path % 查看搜索路径 |
精度控制
默认数据类型为 double
默认是4位小数精度 short 格式精度,可以改为15位精度 format long,或者四舍五入保留两位小数format bank, 用指数形式表示并且精确到4位/15位小数: format short e 、format long e
逻辑表达式
& 与,| 或,~ 非,xor 异或
比较
< > <= >= == ~= (不等于)
关系运算符的运算方式
| 函数 | 作用 |
|---|---|
| exp(a) | e的a次方 |
| rem(A, 3) | 返回A矩阵除 3 的余数(变量或者矩阵) |
| log10(x) | 以10为底的x的对数 |
| log(x) | x的自然对数 |
| sin(x) ; cos(x) ; tan(x) | 三角函数(弧度) |
| asin(s); acos(x); atan(x) | 反三角函数(弧度) |
| 变量名 | 意义 |
|---|---|
| ans | 最近计算的结果 |
| eps | 正数的极小值 = 2.2204e-16 |
| pi | Π |
| inf | ∞ |
| i、j | 虚数单位 |
| NaN | not a number |
左除和右除是不一样的, a/b 是右除,表示a/b, a\b 是左除,表示 b/a
| 函数 | 作用 |
|---|---|
| real(z) | 实部(笛卡尔坐标表示) |
| imag(z) | 虚部(笛卡尔坐标表示) |
| angle(z) | 幅角(极坐标表示) |
| abs(z) | 模(极坐标表示) |
| 语句 | 作用 |
|---|---|
x = [1 2 3] 、 x = [1, 2, 3] |
创建行向量 |
x = [1; 2; 3] |
创建列向量 |
| x’ (单引号) | 转置 |
| x = [1 2 3]’ | 创建列向量 |
| x(a, b) | 取出x向量的第a行第b列的数值 |
从已有变量创建新变量 a = [1 2 3]; b = [2 3 4] c = [a; b]; 用空格链接表示并排组合,用分号连接表示上下组合排列
创建等差元素的向量
首元素为x1,跨度为q,q默认为1,末尾元素为x2,左闭右闭。
x = [x1: q: x2]
注意:向量的乘方应该在运算符前面加上句号(.)
| 语句 | 作用 |
|---|---|
| linspace(a, b) | 创建a和b之间含有100个元素的向量 |
| linspace(a, b, n) | 创建a和b之间含有n个元素的向量 |
| logspace(a, b, n) | 创建n个对数值相隔相同的向量 |
函数创建向量
help elmat 获取的矩阵生成和操作函数列表
| 函数 | 作用 |
|---|---|
| ones(n), ones(m,n) | 生成全是1的矩阵 |
| zeros(n),zeros(m,n) | 生成全是0的矩阵 |
| reshape(n), reshape(m, n) | 重塑矩阵 |
| eye(n) | 生成单位矩阵 |
reshape:
向量的访问
| 语句 | 作用 |
|---|---|
| a(n) | 寻访第n个元素 |
| a(:) | a的所有元素按列组合组成的向量 |
| a(n) = m | m的值赋给a(n) |
| a([n m]) = [p q] | p赋值n,p赋值给m |
| a([n1 n2 n5]) | 寻访第1,2,5个元素组成的子数组 |
| a(n: m) | 寻访第n到m个元素组成的子数组 [n, m] |
| a(n : d: m) | 从n到m,按照下表递增d的方式组成子数组,d可以为负数 |
| a(n: end) | 返第3个(包括)到最后的子数组,end表示最后一个,不是具体值,end可以参与表达式 |
注意:
a([1 1 1 2 3 4 5 5 5]) 像这样,是可以的1 | a = [1 2 3 4 5; 1 2 3 4 5]; |
双下标和单下标的转换
sub2ind() 函数
1 | a = [1 2 3 4; 4 3 3 3; 5 6 6 6]; |
$$
第一页:
\begin{bmatrix}
1 & 2 &3 & 4 \
4 & 3 & 3 & 3 \
5 & 6 & 6 &6 \
\end{bmatrix}
第二页:
\begin{bmatrix}
-9 & -8 & -7 & -6 \
-6 & -7 & -7 & -7 \
-5 & -4 & -4 & -4 \
\end{bmatrix}
$$
1 | a(2, 1, 2); % 第2行第1列第2页,也就是 -6 |
单下标到双下标
ind2sub() 函数
1 | b = zeros(3); |
$$
结果为:
\ x =
\begin{bmatrix}
3&1&2&3
\end{bmatrix}
\y =
\begin{bmatrix}
1&2&2&2
\end{bmatrix}
$$
$$
解读:ind为索引,其值为 [3\ 4\ 5\ 6]意为在单下标表示中第 3\ 4\ 5\ 6个下标对应的数据。\
原数据为:
\begin{bmatrix}
1 & 4 & 7\
2 & 5 & 8\
3 & 6 & 9
\end{bmatrix}\也就是说,第 3\ 4\ 5\ 6个下标对应的数据,他们的二维索引分别为(列优先):\
\begin{bmatrix}3&1\end{bmatrix}\
\begin{bmatrix}1&2\end{bmatrix}\
\begin{bmatrix}2&2\end{bmatrix}\
\begin{bmatrix}3&2\end{bmatrix}\
也就是:\
\begin{bmatrix}3\1\end{bmatrix}\
\begin{bmatrix}1\2\end{bmatrix}\
\begin{bmatrix}2\2\end{bmatrix}\
\begin{bmatrix}3\2\end{bmatrix}\
亦即:\
\begin{bmatrix}
3 & 1 & 2 & 3\
1 & 2 & 2 &2
\end{bmatrix}
$$
找到指定区间内的向量的位置
1 | A = [4, 15, -45, 10, 6; 56, 0, 17, -45, 0]; |
注意:元素是按列排的
向量的*操作前面要加上点号
| 语句 | 作用 |
|---|---|
| length(A) | 返回向量的最大维数 |
| size(A) | 返回向量的大小(行和列数) |
| max(A)/min(A) | 向量中最大最小的元素 |
如果变量中有复数,在用(.*)计算模的时候必须计算其共轭复数,用原向量 .*共轭向量
conj(A) 计算A向量的共轭复数向量
abs(A) A向量的绝对值
| 语句 | 作用 |
|---|---|
| dot(a, b) | a和b的点乘(数量积) |
dot(a, a) 计算向量的模,适用于复数向量
数组降维
| 函数 | 作用 |
|---|---|
| double(string) | 查看ASCII码 |
| char(A) | 将ASCII码数组恢复成字符串的形式 |
| class(A) | 判断A变量的类型 |
| char(X) | 判断X是不是char型 |
一个变量存储多个字符串
str = ['asd'; 'a '; ' b ']char()str = char('asd', 'a', ' b')| 函数 | 作用 |
|---|---|
| deblank(str) | 清除尾部空格 |
str(1, :) 第一行的全部元素,也就是第一个字符串
访问二维字符串的时候别忘了清楚尾部空格
| 函数 | 作用 |
|---|---|
| strcmp(str1, str2) | 比较字符串,相同返回1,不同返回0 |
对于一维数组
| 函数 | 作用 |
|---|---|
| y = max(X) | X最大值赋给y,复数应取模 |
| [y, I] = max(X) | X最大值赋给y,最大值的下表给I,按照模取最大值 |
| min 和以上同理 | |
| sum(X) | 向量的所有元素的和 |
| prod(X) | 向量的所有元素的乘积 |
| mean(X) | 向量的所有元素的算数平均值 |
| median(X) | 向量的所有元素的算数中间值 |
对于矩阵
| 函数 | 作用 |
|---|---|
| X = max(A) | 返回每一列上的最大值组成的行向量 |
| [Y, U] | 返回每一列上的最大值组成的行向量,和他们的行号 |
| max(A, [], dim) | dim 取 1或2. 取1的时候等效于max(A); 取2的时候,返回一个列向量,其中第i个元素是A矩阵的第i行上的最大值 |
| min同理 | |
| sum(A) | 返回每一列的所有元素的和组成的行向量 |
| prod(A) | 返回每一列的所有元素的积组成的行向量 |
| mean(A) | 返回每一列的所有元素的平均值组成的行向量 |
| median(A) | 返回每一列的所有元素的中位数组成的行向量 |
| sum(A, dim) | 求和,同理 |
| prod(A, dim) | 求积,同理 |
| mean(A, dim) | 平均值,同理 |
| median(A, dim) | 中位数,同理 |
plot(x)
x为向量时,以该元素的下标为横坐标、元素值为纵坐标绘出曲线
x为实数二维数组时,则按列绘制每列元素值相对其下标的曲线,曲线数等于x数组的列数。
x为复数二维数组时,则按列分别以数组的实部和虚部为横、纵坐标绘制多条曲线
plot(x, y)
x、y为同维数组时,绘制以x、y元素为横纵坐标的曲线
x为向量,y为二维数组、且其列数或行数等于x的元素数时,绘制多条不同颜色的曲线
x为二维数组,y为向量时,情况与上相同,只是y仍为纵坐标。
1 | x = 0:pi/100:2*pi; |

参数方程的绘制:
$$
\begin{cases}
x = tcos(3t)\
t = tsin^2(t)
\end{cases}, -\pi \le t \le \pi
$$
1 | t = -pi:pi/100:pi; |
调制波形:低频信号 * 高频信号 的过过程
1 | t = (0:pi/100:pi)'; |
多次调用plot命令在一幅图上绘制多条曲线;需要hold指令的配合。
hold on 保持当前坐标轴和图形,并可以接受下一次绘制。
hold off 取消当前坐标轴和图形保持,这种状态下,调用plot绘制完全新的图形,不保留以前的坐标格式、曲线。
绘制离散的波形
1 | t = 2 * pi * (0 : 20) / 20; |
x1,y1在左,x2,y2在右边
1 | x = 0:0.01:20; |
subplot(,m, n, k)
图形窗口包含(mxn)个子图,k为要指定的当前子图的编号。
其编号原则:左上方为第1子图,然后向右向下依次排序。该指令按缺省值分割子图区域。
使(mxn)幅子图中第k个子图成为当前图
subplot(‘postion’,[left,bottom,width,height])
subplot(“postion’,[left,bottom,width,height])用于手工指定子图位置.
指定位置的四元组采用归一化的标称单位,即认为整个圈形窗口绘图区域的高、宽的取值范围都是[0,1],而左下角为(0,0)坐标。
产生的子图彼此独立。
所有的绘图指令均可以在子图中使用。
举例:
1 | t = (pi*(0:1000)/1000)'; |
| 符号 | - | : | -. | – |
|---|---|---|---|---|
| 含义 | 实线 | 虚线 | 电话线 | 双划线 |
b: 蓝
r:红
g:绿
c:青
m:品红
y:黄
k:黑
w:白
| 符号 | . | + | * | < | > |
|---|---|---|---|---|---|
| 含义 | 实心黑点 | 十字符 | 八线符 | 左三角 | 右三角 |
| ^ | v | d | h | o | |
| 上三角 | 下三角 | 菱形符号 | 六角形 | 空心圆 | |
| p | s | x | |||
| 五角星 | 方块符 | 叉字符 |
坐标框
坐标轴
xlabel、ylabel
图中的坐标的表示形式
set(gca, ‘xtick’, xs, ‘ytick’, ys)
1 | t = 6 * pi * (0:100)/100; |
| 图形 | 指令 |
|---|---|
| 柱状图 | bar(x, y, args[]) |
| 累计式直方图 | bar(x, y, ‘stack’, args[]) |
| 分组式直方图 | bar(x, y, ‘group’, args[])、barh(x, y, ‘group’, args[]) |
pie(x, y, args[])
stem(x, y, args[])
$$
\rho = sin(2\theta)cos(2\theta) \
polar(\theta, \rho, args[])
$$
polar(theta, tho, args[])
plot3(x, y, z, args[])
步骤:
1 | x = -4: 0.01; 4; |
| 指令 | 作用 |
|---|---|
| imread(filePath) | 读取图像文件 |
| imshow(var) | 显示图像 |
| imwrite(var, filePath) | 保存图像 |
命令文件没有输入参数,也不返回输出参数;函数文件可以带输入参数,也可以返回输出参数。
命令文件对工作空间中的变量进行操作,文件中所有命令的执行结果也返回工作空间中;函数文件中定义的变量为局部变量,当函数文件执行完毕时,这些变量也被清除。
命令文件可以直接运行;函数文件不能直接运行,要以函数调用的方式来调用它。
输入数据
A = input(提示信息, 选项)
输出数据
disp(a)
程序暂停
pause(暂停的秒数)
Ctrl + C 强行停止
函数单独写在一个文件中
1 | 格式: |
1 | while语句: |
1 | if 表达式 |
1 | switch语句: |
基本结构
1 | function 输出形参表 = 函数名(输入形参表) |
1.关于函数文件名
函数文件名通常由函数名再加上扩展名.m组成。
当函数文件名与函数名不同时,Matlab将忽略函数名而确认文件名因此调用时使用函数文件名。
2.关于注释说明部分
注释说明包括3部分:
①紧随引导行之后以%开头的第一注释行。这一行一般包括大写的函数文件名和函数功能简要描述,供lookfor关键词查询和help在线帮助时使用。
②第一注释行及之后连续的注释行。通常包括函数输入/输出参数的含义及调用格式说明等信息,构成全部在线帮助文本。
③与在线帮助文本相隔一空行的注释行。包括函数文件编写和修改的信息,如作者和版本等。
3、关子return语句
如果在函数文件中插入了return语句,则执行到该语句就结束函教的执行,流程转至调用该函数的位置。通常也不使用return语句。
全局变量与局部变量
Matlab中,函数文件中的变量是局部变量。了如在若干函数中,都把某一变量定义为全局变量,那么这些函数将共用这个变量。
全局变量的作用域是整个Matlab的工作空间,所有函数都可以对它进行存取和修改。
全局变量用global命令定义,格式为:global变量名
例题1
建立文件函数交换两个参数的值,返回执行后的结果
1 | %f_exchange.m |
1 | a = input('a = '); |
运行截图为:

例题3
$$
计算分段函数
\begin{cases}
cos(x+1)+\sqrt{x^2 + 1},x=10\
x\sqrt{x+\sqrt{x}},x \ne 10
\end{cases}
$$
代码如下:
1 | x = input('请输入x的值:'); |
运行截图如下:
输入一个字符,若为大写字母,则输出其对应的小写字母;若为小写字母,则输出其对应的大写字母;若为数字字符则输出其对应的数值,若为其他字符则原样输出
代码如下:
1 | c = input('请输入一个字符', 's'); |
某商场对顾客所购买的商品实行打折销售,标准如下:
price<200 没有折扣
200<=price<500 3%折扣
500<=price<1000 5%折扣
1000<=price<2500 8%折扣
2500<=price<5000 10%折扣
5000<=price 14%折扣
输入所售商品的价格,求其实际销售价格。
代码如下:
1 | price = input('请输入商品价格'); |
例题6
矩阵乘法运算要求两矩阵的维数相容,否则会出错。先求两矩阵的乘积,若出错则自动转去求两矩阵的点乘。
1 | A = [1,2,3;4,5,6]; |
例题7
$$
已知 y=\frac{1}{1^2} + \frac{1}{2^2} + \frac{1}{3^2} +…\frac{1}{n^2} , 当n=100时,求y的值。
$$
1 | y = 0;n = 100; |
例题8
从键盘输入若干个数,当输入0时结束输入,求这些数的平均值和它们的和。
1 | sum = 0; |
结果截图:
例题9
求[100,200]之间第一个能被21整除的整数。
1 | for n = 100:200 |
例题10
求半径为r的圆的面积和周长
1 | % getCircleInfo.m |
例题11
利用函数文件实现直角坐标和极坐标之间的转换
1 | % tranDicarerPolar.m |
例题12
算n!
1 | function f = myFactor(n) |
例题13
1 | % 参数的数量可以改变 |
例题14
全局变量的使用
1 | function f = weightAdd(x, y) |
表达:
由行向量表示
元素是多项式的系数
按照降幂次序排列
$$
x^4-12x^3+25x+116 \
$$
p = [1 -12 0 25 116] (没有的用0表示)
多项式是行向量,根是列向量
求解多项式的根 roots()
1 | p = [1 -12 0 25 116]; |
已知根,求解多项式 :poly()
1 | p = [1 -12 0 25 116]; |
多项式乘法conv()
1 | a =[ 1 2 3 4 ]; |
多项式加法:直接加,不够的补上 0
1 | a =[ 1 2 3 4 ]; |
1 | function rst = poly_add(a, b) |
多项式除法deconv()
1 | c = [0 6 20 50 75 84 64]; |
1 | b = [1 4 9 16]; |

多项式的估值polyval()
$$
绘制 p(x)=x^3+4x^2-7x-10在[-1, 3]上的曲线
$$
1 | x = linspace(-1, 3); % x轴上的点 |
matlab中没有直接求导的函数,只有计算向前差分的函数diff()
DX=diff(x) % 计算向量X的向前差分
DX=diff(X, n) %X的n阶向前差分
设x由[0, 2pi]间均匀分布的10个点组成,求sin(x)的1-3阶差分
一阶差分:f(x+1)-f(x)
2阶差分:f(x+2)-f(x)
n阶差分:f(x+n)-f(x)
1 | x = linspace(0, 2*pi, 10); |
$$
设f(x) = \sqrt{x^2+2x^2-x+12} + (x + 5)^{1/6} + 5x + 2 在[-3,3]内以0.01为步长求数值导数,并画图
$$
1 | f = inline('sqrt(x.^3+2*x.^2-x+12)+(x+6).^(1/6)+5*x+2'); % 内联函数 |
一元函数的数值积分
常用积分指令 quad、quadl
调用格式:
1 | q = quadl(fun, a, b); % 被积函数, 上限, 下限 |
$$
求定积分 I=\begin{equation*}
\int_{0}^{1} xe^{-x}dx
\end{equation*}
$$
1 | fun = inline('exp(-x.*x)', 'x'); % 第二个参数x表示这个函数的变量为x |
$$
\begin{equation*}
\int_{0}^{1} \sqrt{ln(\frac{1}{x})}, dz
\end{equation*}
$$
1 | fun = inline('sqrt(log(1./x))', 'x'); |
sort(X) 返回一个对X中元素按照每列升序排列的新向量
也可以对矩阵A的各行或者各列重新排序:[Y, I] = sort(A, dim) dim=1按列排序,=2,按行排序,Y是排序后的矩阵,I记录Y中的元素在A中的位置。
1 | A = [1 -8 5; 4 12 6; 13 7 -13]; |
一维数据插值:被插的函数只有一个单变量
一维数据插值Y1 = interp1(X, Y, X1, method) 函数根据X,Y的值计算函数在X1处的值。
XY是两个等长的已知向量,分别描述采样点和样本值。
X1是一个向量或标量,描述想要插值的点,Y1是一个与X1等长的插值结果。
method取值:
表示四种插值方式
一般来说,3次样条和3次多项式的插值结果比线性插值和最近点插值方法好,但是插值方法的好坏依赖于被插值的函数
例:给出概率积分数据如下,用不同的插值方法计算f(0.472)
1 | x = 0.46:0.01:0.49 |
用 ployfit 求最小二乘拟合多项式的系数,再用polyval函数按照所得的多项式计算所给出点上的函数的近似值。
1 | [P, S] = polyfit(X, Y, m) |
例题:
用一个三次多项式在区间0到2pi内逼近函数sinx
1 | x = linspace(0, 2*pi, 20); % |
符号对象的定义
sym \ symsf = sym(arg) 或者 f = syms('arg1', 'arg2', ...) 或者 syms arg1, arg2...1 | syms x y a b; |
基本符号运算和操作
collect(s) collect(s, v)
s 是将要进行合并的函数
v 是以什么为基准合并,字符串
1 | clear |
1 | clear |
展开 expand
嵌套形式 horner
找到分子和分母 numden
使用sym创建符号数组
1 | a1 = sym('[1/3 1/2 sqrt(2)]') |
创建符号常数数组
1 | a = reshape(1:9, 3, 3) |
创建一般符号数组
符号矩阵可以乘以普通标量、符号标量、点乘等
符号极限指令:
limit(f, x, a) 计算变量x->a的时候,函数f的极限值limit(f, a) 计算有findsym(f)确定的自变量->a的时候,函数f的极限值limit(f) 计算a = 0的时候函数f 的极限值limit(f, x, 'right') limit(f, x, 'left') 计算x->a时的右极限、左极限1 | syms x t y h |
MATLAB符号微分指令: diff
1 | syms x y; |
int 计算不定积分和定积分
1 | syms x w t; |
代数方程求解代数方程的指令:
linsolvesolve$$
求方程组 uy^2+vz+w=0,y+z+w=0 关于y,z的解
$$
求解方程的根
$$
2x^5-3x^3+71x^2-9x+13=0
$$
1 | % 建立多项式系数行向量 |
求解线性方程组
$$
\begin{cases}
2x+3y-z=2 \8x+2y+3z=4 \45x+3y+9z=23
\end{cases}
$$
1 | a = [2, 3, -1; 8, 2, 3; 45, 3, 9]; % 建立系数矩阵a |
$$
原方程组可化为
\begin{cases}
2x+3y-z-2=0 \8x+2y+3z-4=0 \45x+3y+9z-23=0
\end{cases}
$$
1 | syms x y z; % 声明变量 |
求解定积分
$$
\int_{0}^{1}{x\ln(1+x)}dx
$$
1 | quad('x.*log(1+x)', 0, 1); |
多项式曲线拟合
1 | % 考虑以下实验数据 |