前言1
历时近四个月,这部学习笔记终于完成了,与预期时间差距巨大,具体原因也在后记中介绍了,不再赘述。希望最后完成的作业能对大家有所帮助。
本篇前言写于全部笔记完成时,不出意外的话笔记中的错误会有很多,接下来我也会马上开始第一次的校对修改工作,也欢迎发现问题的朋友们与我联系。
下面说一些朋友们在阅读该笔记时可能会遇到的问题。首先,由于简书单篇文章字数的限制,我把教程的第20章-指令表作为单独的一部分发出了,这样也方便的大家的查看。本篇文中一些概念是从英文直接字面翻译过来的,可能与其在编程中的中文术语不同,在接下来的修改校对中我会尽力完善,但由于受自身学识所限,使用的又不是汉语版MATLAB,这样的问题还是会存在。另外,文中一些奇怪的洋文其实是德语,由于我本上在德国读书,会使用零星的德语概念,但应该不会给大家的使用造成困扰。
由于是关于软件学习的笔记,我另外还写了一片实践笔记,主要是把自己在MATLAB中写的程序和运行结果都按照该笔记的顺序截图整理了,还包括一些教程上的练习题也会放在里面,方便没有MATLAB环境的朋友查看。
现在大概要说的就是这些了,希望本篇笔记能给您在学习MATLAB时带来点点的帮助。
以上。
27.09.2018
04.06.2018
本科阶段的倒数第二个学期已快过半,matlab要学起来了,NuMa教授推荐的教程,短小精悍,正文内容只有21页,争取用一个周完成。
引言
MATLAB以矩阵为基础,用于科学和工程上的数值计算和仿真。MATLAB的名字来自MATrix LABoratory.
具体函数的用法,要注重“帮助”的应用,指令 “help functionname”, “help”, “help topic” “demo”。本教程在最后的部分也给出了常用的函数。
更具体详细的帮助可以从用户指南获取。
MATLAB 适用于多种环境:Sun/ Apollo/ VAXstation/ HP workstation/ VAX/ Micro VAX, Gould/ PC und AT kompatibles/ 80386 und 80486 computers, Apple Macintosh 等等
———- 時の涙 (ノへ ̄、) ———-
05.06.2018
1. Accessing MATLAB/ 访问MATLAB
在多进程系统支持下,同时保持MATLAB和本地编辑器的开启是很方便的,具体原因会在14.Managing M-files介绍。
2. Entering matrics/ 输入矩阵
MATLAB其实只有一种处理对象,即矩阵。两种特殊情况:只有一项的矩阵被译为scalars,单行或者单列的矩阵被译作向量vectors。
MATLAB中矩阵的几种不同的引入方式:
*明确输入所有项
*有软件内置的语句和函数生成
*使用本地编辑器在磁盘中创建
*从外部存储或者应用中载入
例: A =[1 2 3;4 5 6;7 8 9;] 等同于
A = [1 2 3
4 5 6
7 8 9]
一行中的元素可以用逗号或者空格隔开,但要注意,一个数用指数形式引入时(z.B. 2.34e-9),其中不能有空格。
MATLAB所有的计算和函数中都允许复数,两种引入复数的方法:
A = [1 2; 3 4] +i*[5 6; 7 8]
A = [1+5i 2+6i; 3+7i 4+8i] ,一个数用复数形式引入时(z.B. 2+6i),其中不能有空格。
i 或者 j 都可以用作复数虚部的标记,但如果把他们作为变量并赋值之后,就需要一个新的虚数单位(z.B. ii = sqrt(-1)).
引入(明确输入所有项)大型矩阵的最好方法是用本地编辑器制作ASCII 文件,这样可以非常方便地修改(K. 12,K. 14)如果这个文件被命名为 data.ext 可以直接在MATLAB中使用指令”load data.ext” 将该文件中的变量数据读取到 workspace 中。这也可以用 script file 来完成。
软件内置的函数 rand, magic, and hilb, 提供了几种创建矩阵的简单方法。
* rand(n) : 引入n*n 矩阵,其各项均匀分布在0到1之间。rand(m,n):引入m*n 矩阵。
* magic(n):引入n*n 矩阵, magic square: 每行,每列和对角线的各项和相等。
* hilb(n):引入n*n 矩阵, Hilbert 矩阵,King of ill-conditioned matrices, Hij=1/(i+j-1)。
* 使用 for-loop 引入矩阵(K. 6)
大写字母后加圆括号和参数,可以表示矩阵/向量中具体的一项。
例: A(2,3) 表示矩阵A的第二行第三列的项; x(3)表示向量x 的第三项。
05.06.2018
3. Matrix operations, array operations/ 矩阵运算,数组运算
MATLAB中允许的矩阵(scalars)运算有:
+ 加,- 减,* 乘,^ 乘方,’ 共轭转换,\ 左除,/ 右除
如果矩阵的大小于要进行的运算不相符,则导致错误。
左除:x = A\b 是 A x = b 的解
x = b/A 是 x A = b 的解, b/A = (A’\b’)’
数组运算:
对于 *, ^, \, / 四种运算,如果在矩阵后面,预算符前面 加一个点, 则变成了对矩阵中的每一项进行相应的运算。这在用MATLAB绘图是很有用。
例: [1, 2, 3, 4 ].*[1, 2, 3, 4 ] = [1, 2, 3, 4].^2
06.06.2018
4. Statements, expressions, and variables; saving a session./ 语句, 表达式 和变量; 保存会话
MATLAB是一种expression语言, 我们输入的expression会被解读和评估。
MATLAB表达式的一般形式: variable = expression 或者简单的 expression
Expression一般由operators,functions和变量名组成。
由expression得到一个矩阵,它会显示在频幕上并被赋给变量。如果之前没有写“variable =”, 则系统会自动创建一个变量”ans” 并将由expression得到的matrix赋给它。
一般一个statement以回车结束,也可以分为几行,几个statement也可以写在同一行,中间用逗号或者分号隔开。如果以分号结尾,则该语句不会显示,但赋值会执行。这对于不需要显示的中间结果很有意义。
在MARTLAB的命令,函数和变量名中,大小写是被严格区分的。
指令:
* who :列出目前在workspace中的所有变量
* clear variablesname:删除该变量
* clear:删除所有非永久性的变量
永久变量 eps (epsilon/小量)给出了机器单位的舍入,一般是10^-16。它在指定迭代过程收敛的公差方面很有用。
在MATLAB中强制结束死循环可以用组合键CRTL+C(allg. CRTL+Break)。
会话的保存:当登出或者推出MATLAB时,所有的变量就删除了。通过 save 指令,可以将所有的变量写入一个文件 matlab.mat,之后可以用 load 指令调用,workspace会回到之前的状态。
5. Matrx building functions./ 创建矩阵的函数
常用的创建矩阵的函数:
* eye identity matrix/ 单位矩阵
* zeros 所有项都是0的矩阵
* ones 所有项都是1的矩阵
* diag 提取对角线
* triu 上三角
* tril 下三角
* rand 0到1的正态分布随机矩阵
* hilb Hilbert矩阵
* magic magic矩阵
* toeplitz 看help
例: zeros (size (A)) : 创建一个于A相同纬度的零矩阵;
矩阵可以分块建立, z.B. A是3×3矩阵, B = [ A, zeros (3,2) ; zeros (2,3), eye (2) ]就是一个5×5矩阵。
6. For, while, if – and relations
for, while, if are “MATLAB flow control statements operate”
for 循环:
例: x = []; for i = 1:n, x = [x, i^2], end 创建一个n维向量
x = []; for i = n:-1: 1, x = [x , i^2] 创建一个于上面顺序相反的向量。
for 语句中的 i = 1: n 也可以变成 c = A,其意义是将矩阵A中的项以列的顺序赋值给c。
while 循环:
while relation
statements
end
当满足relation的时候statement会被循环。
if 循环:
if relation
statements
end
当满足relation的时候statement会被执行。也可以用else if 形成多重分支。
Relations:
< less than; > greater than; <= less than or equal; >= greater than or equal;
== equal; ~= not equal.
对于scalars, relation运算若为真,也结果是1,否则是0。
对于同样大小的矩阵,relation运算的结果也是一个有0和1组成的矩阵,他们是对原来两个矩阵的对应项分别计算的结果。如果所有项都为1,则relation运算作为 if 或者 while 的条件时值为1,否则为0。
7. Scalar functions.
以下为MATLAB中主要用于scalar的函数,但也可以用于matrix里的项。
sin; cos; tan; asin; acos; atan; exp; log(natural log); rem(remainder);
abs; sqrt; sign; round; floor; ceil.
8. Vector functions.
以下为MATLAB中主要用于向量的函数,但也可以用于矩阵中的每一列,其结果组成一个行向量。若相对矩阵中的行向量运行这些函数,可以通过转置实现。
max; min; sort; sum; prod; median; mean; std; any; all
07.06.2018
9. Matrix functions.
矩阵函数是MATLAB的最大力量( •̀ ω •́ )y
eig; chol; scd; inv; lu; qr; hess; schur; rref; expm; sqrtm; poly; det; sitze; norm; cond; rank;
MALTAL函数可以有单/多输出参数,例:
y = eig(A) 或者 eig(A) 输出的是一个列向量,它的项是A的Eigenwert.
[U,D] = eig(A)输出的是一个矩阵U,它的列向量是A的Eigenvektor, 还有一个对角矩阵D,它的对角线元素是A的Eigenwert.
10. Command line editing and recall/
MATLAB里的command line 可以方便地编辑。编辑的介绍可以用help cedit / type cedit查看。向上移动光标可以和方便地回到之前的指令行,对其recall,已经进行编辑和再执行。
对于小的程序,使用M-file会带来极大的便利,它可以在MATLAB和其他的编辑器之间移动。比如flopcounts(K. 15)在计算一个矩阵的逆矩阵是用来计数:
a = rand(8); flops(0), inv(a); flops
如果想比较函数 y = sin mx 和 y = cos nx在区间[ 0, 2pi] 的图像:
m=2; n=3; x=0: .01: 2*pi; y=sin(m*x); z=cos(n*x); plot(x,y,x,z)。
11. Submatrices and colon notation/ 子矩阵和冒号标记
向量和子矩阵经常用来在MATLAB中实现非常复杂的数据操作。”colon notation“冒号标记和subscripting/下标是高效处理这些对象的关键。灵活地运用这些功能来是计算矢量化可以让loop尽量减少,也能使代码更简单和可读。要下功夫熟悉它们(~ ̄▽ ̄)~
冒号标记用来访问矩阵的子矩阵:
A(1:4,3)是一个4个元素的列向量,其元素是A的第三列的1到4元素。
A(:,3)表示A的第三列
A(1:4,:)表示A的第1至4行
A(:,[2 4])表示A的第2和第4列
A(:,[2 4 5]) = B(:,1:3)表示B的1到3列被赋值到A的2,4,5列
A(:,[2,4]) = A(:,[2,4])*[1 2;3 4]表示A的2,4列与[1 2;3 4]相乘
09.06.2018
12. M-files.
MATLAB可以执行存储在磁盘文件中的一系列语句。这些文件被称为”M-files”,因为文件名的后缀是”.m”。M文件一般用本地编辑器创建。
M文件有两种类型:script files/脚本文件 和 function files/ 函数文件
script files:
script files 由一系列普通的MATLAB语句构成。如果文件名是 rotat.m,那么用指令 rotat 就可以执行文件中的语句。script files 中的变量是global的,并且它们改变会导致当前MATLAB会话中的同名变量。
script files 可以用来输入大型矩阵,因为这样的文件中错误可以很容易地改正。比如,在磁盘文件 data.m 中输入
A = [
1 2 3 4
5 6 7 8
];
那么MATLAB中使用语句 data 会使得 data.m 中给出的赋值被执行,然而一般情况下使用road命令会更加简单(K. 2)。在M文件中可以引用其他M文件,也可以以递归形式引用自身。
function files:
funcition files 提供了MATLAB的可扩展性。可以针对自己的问题创建特殊的函数,其于MATLAB中的其他函数地位相同。function files 中的变量默认是local的,但也可以把它声明为global变量。function files 可以有一个或者多个输出。
例子见《…函数实例》
符号%表示之后的内容是注释,这样的注释应该一直伴随function files 给出,他们可以用 help functionname 来调取显示。
MATLAB中一些函数是内建的,另外一些则分散在M-files 中,使用指令 type functionname 可以查看非内建的和自定义的函数。
11.06.2018
13. Text strings, error messages, input
MATLAB中的文本输入要用单引号,例: s = ‘This is a test’。
显示文本用函数 disp,例:disp(‘this message is hereby display’)。
错误显示显示用函数 error,例:error(‘Sorry, the matrix must be symmetric’)。
他们都可以写入M-files中并被执行。
在M-file中也可以交互式地提醒用户,用函数输入‘输入数据/input data’,例:如果遇到如下语句 iter = input(‘Enter the number of iterations: ‘),这则提示信息会显示,并且程序会暂停直到用户键入数据。之后按回车健,数据就被赋值给了变量iter并且程序继续执行之后的步骤。
14. Managing M-files
在使用MATLAB时经常会希望用本地编辑器创建和编辑M-files然后再返回MATLAB。此时人们肯定会希望保持MATLAB活动,因为否则推出MATLAB的话所有的变量都会丢失。
这可以使用 !-功能 简单地完成。比如,在MATLAB中,在任何系统指令,比如编辑、输出、或者复制一个文件,之前加感叹号!,就可以不退出MATLAB来执行它。
比如,系统指令 ed – 访问你的编辑器:
>> !ed rotate.m 表示用你的编辑器访问rotate.m文件,在离开编辑器之后会自动返回之前离开MATLAB的地方。
然而如第一节所述的,Unix和Windows中都可以多任务进行。所以保持MATLAB和编辑器同时运行是最好的选择。
有许多 debugging tools,使用指令 help dbtype 或者在最后一章的函数表可以查看。
MATLAB中可以用指令 pwd 返回当前工作目录的名称, 指令 cd 可以改变工作目录。
指令 dir 或者 ls 可以列出工作空间中的左右内容,用 what 只可以列出工作空间中的 M-files。
指令 delete 用来删除磁盘文件; 指令 type 用来把 M-file 显示在屏幕上。
M-files必须位于MATLAB可访问的目录中。当前工作目录中的M-files都是可以访问的。在MATLAB的搜索路径中的当前目录列表可以由指令 path 获得,这个指令也可以用来在搜索路径中添加或者删除工作目录,具体见 help path。
19.06.2018
15. Comparing efficiency of algorithms: flops, tic and toc./ flops,tic和toc三种算法的效率比较
考量一个算法的效率有两个因素:执行浮点运算(flops)的数目和消耗的时间。
MATLAB函数 flops: 指令 flops(0) (注意不是 flops = 0 !) 会把 flops 重置为0。由此,在执行一个算法之前输入 flops(0),之后输入 flops,将会给出浮点运算的总数。例如,一个线性系统进行高斯消元的flops可以如此获得:
flops(0), x = A\b; flops
消耗的时间(秒数)可以用秒表计时器 tic 和 toc 获得。tic 开启计时器,toc 返回消耗的时间。由此可得指令:
tic, any statement, toc
将会返回执行该statemet所消耗的时间。解决如上线性系统所消耗的时间可用指令:
tic, x = A\b; toc 获得。
例:比较x = A\b 和 x = inv(A)*b 的消耗时间和flop数。
需要注意的是,在时间分配机器上,消耗的时间不一定是算法效率的可靠度量,因为执行的效率始于系统当时的忙碌程度有关的。
16. Output format/ 输出格式
尽管MATLAB中所有的运算都是以双倍精度执行的,显示输出的格式却可以用以下的指令来控制:
format short (固定小数点带4位有效数字)
format long (固定小数点带14位有效数字)
format short e (科学记数法带4位有效数字)
format long e (科学计数法带15位有效数字)
format rat (以小整数的比值形式近似)
format hex (十六进制形式)
format bank (固定的元和分)
format + (+, -, 空格)
一旦选用了一种格式,则其将保持直到改变格式。
指令 format compact 将会阻止空白行并将更多的信息输出在屏幕上。 指令 format loose 将会返回到 non-compact 格式。 这两个指令是独立于其他format指令的。
12.09.2018
17. Hardcopy/硬复制
最方便的硬复制方法是使用 diary 指令。用:
diray filename
这一指令将会把其后所有屏幕上的内容(图像除外)写入给定名称的磁盘文件中(若没有给出文件名称则默认为diary),直到给出指令 diary off 这一过程将会停止。指令 diary on 可以是写入过程恢复。当结束后,可以按需对文件进行操作并将其输出到本地系统。使用 !-feature (见14节)允许我们不离开MATLAB就对文件进行编辑和输出。
18. Graphics/图像
MATLAB可以绘制平面曲线,3维曲线,3维网格面和3维曲面。他们对应的指令分别为 plot, plot3, mesh 和 surf。下面对其分别进行介绍。输入指令 demo 并选择图像选项可以对这些功能进行预览。
18.1 Planar plots/平面图
指令 plot 创建线性的x-y图像。 如果x和y是相同长度的矢量,指令 plot(x,y) 会打开一个图像窗口并绘制y元素关于x元素变化的x-y图像。例如,你用如下指令可以在-4到4之间的等长区间内绘制sin函数:
x = -4:0.1:4;y = sin(x); plot(x,y)
向量x是该区域以0.01的网格划分,向量y是在网格节点上的sin的值。
人们一般希望保持当前的图像窗口露出并移到屏幕边缘,并保持指令窗口activ。可以由多个图像窗口,其中一个可以在任意时间被指定为“当前”,并把随后绘图指令的结果放入其中。比如,绘图窗口1是当前窗口,输入指令 figure(2) (或者简单的 figure),将会打开第二个绘图窗口(根据需要)并将其设定为当前的绘图窗口。指令 figure(1) 将会呼出窗口1并将其再次设为当前窗口。指令 gcf 会返回当前绘图窗口中的参数。
接下来我们来看第二个例子,在区间 -1.5 到 1.5 之间绘制函数 y = e^(-x^2) 的图像:
x = -1.5: .01: 1.5; y = exp(-x.^2); plot(x,y) (注意 ^ 的使用,见3节)
MATLAB提供了一个函数 fplot 来更简单和高效地绘制函数图像。比如要绘制如上的函数图像,可以先在M-file中定义一个函数,比如叫做 expnormal.m :
function y = expnormal (x)
y = exp (-x.^2);
然后指令:
fplot (‘expnormal’, [-1.5,1.5]) 将会创建一个图像。
也可以绘制参数定义的曲线。尝试如下指令:
t = 0: .001:2*pi; x = cos(3*t); y = sin(2*t); plot(x,y)
用下面的指令,图像可以被指定标题,坐标轴和文字区域,指令变量是字符串:
title graph title
xlabel x-axis label
ylabel y-axis label
gtext palce text on the graph using the mouse
text postion text at specified coordinates
例如:
指令 titel(‘Best Least Squares Fit’) 给图像指定了标题。指令 gtext(‘The spot’) 允许交互式地放置指定地文字,通过将鼠标放在当前图像地合适区域并点击鼠标来完成。要把文字放在图像中的特定位置,可以使用指令 text 完成(详见 help text )。
指令 grid 用来在当前图像中放置网格线。
默认情况下,坐标轴是自动缩放的,也可以用指令 axis 来覆盖。一些常用的 axis-features:
axis([xmin, xmax, ymin, ymax]) 设定坐标轴缩放到规定的极值
axis(axis) 将接下来的图像坐标轴缩放冻结
axis auto 返回到自动缩放
v = axis 返回向量v, 显示当前的缩放值
axis square 两坐标轴取相同的缩放值
axis equal 两坐标轴去相同的缩放值和刻度线
axis off 关闭坐标轴的缩放和刻度线
axis on 打开坐标轴的缩放和刻度线
这些 axis 指令要在 plot 指令之后给出。
两种在同一图像中绘制复合图形的方法:
x = 0: 0.1: 2*pi; y1 = sin(x); y2 = sin(2*x); y3 = sin(4*x); plot(x, y1, x, y2, x, y3)
或者创建矩阵Y,把函数值作为列上的值:
x = 0: 0.1: 2*pi; Y = [sin(x)’, sin(2*x)’, sin(4*x)’]; plot (x,Y)
另一种方法是使用 hold。指令 hold on 冻结屏幕上的当前图像并将之后的图像叠加在其之上,但是坐标轴可以重新缩放。输入 hold off 可以解除 hold。
默认的线型,点型和颜色可以被覆盖,例如:
x = 0: 0.1: 2*pi; y1 = sin(x); y2 = sin(2*x); y3 = sin(4*x);
plot(x, y1, ‘–‘, x, y2, ‘:’, x, y3, ‘+’)
将第一条线定义为虚线,第二条线为点线,第三条线是以+为节点连成的线。线型和标记型有:
Linetypes: solid(-), dashed(–), dotted(:), dashdot(-.)
Marktypes: point(.), plus(+), star(*), circle(o), x-marl(x)
颜色也可以被指定到线性和标记型上:
Colours: yellow(y), magenta(m), cyan(c), red(r), green(g), blue(b), white(w), black(k)
比如 plot(x, y, ‘r–‘) 为绘制一条红色虚线。
指令 subplot 可以用来划分屏幕以使几个小的图像放入用一个绘图窗口中。详见 help subplot。
另外的特殊的2维绘图功能可以根据需要查看help:
polar, bar, hist, quiver, compass, feather, rose, stairs, fill
18.2 Graphics hardcopy
最方便的对当前绘制图像的复制可以使用MATLAB指令 print 完成,一份当前图像的高分辨率附件将被发送到默认打印机。printopt M-file 用来指定默认的print设定,也就是说可以通过编辑这个文件来改变默认值。(详见 help printopt )
指令 print filename 会以给定的文件名称和文件格式保存当前的绘图窗口。如果没有给定文件扩展名,可以附加一个特定的附加名,比如:.ps, .eps 或者 .jet。例如:PostScript 是默认的文件格式,则:
print lissajous
将为当前图像创建一个PostScript 文件 lissajous.ps,之后可以用指令 print 将它打印出来。如果文件名已经存在了,将其内容会被重写,除非使用 -append 选项。
指令 print -append lissajous 将会把当前图像附加到已经存在的 lissajous.ps 文件中。通过这种方法可以将多个图像存储到一个文件中。
默认设定当然也可以重写,比如:
print -deps -f3 saddle
将把图像3,尽管它不是当前图像,存储在Encapsulated PostScript格式的文件 saddles.eps 中。
18.3 3D line plots/ 3维线图
与在2维空间中绘制类似,指令 plot3 用于在3维空间中绘制曲线。如果x, y, z是尺度相同的三个向量,指令 plot3(x, y, z) 将创建一个分段线性曲线的透视图,其通过点的坐标由x, y和z给出。比如:
t = .01: .01: 20*pi; x = cos(t); y = sin(t); z = t.^3; plot3(x, y, z)
会创建一条被压缩到x-y平面附近的螺旋线。
像2维图像一样,标题和坐标轴标记也可以在3维绘图中被添加。axis 指令的功能也适用于3维绘图,当然,这里我们需要6个极值用于设定坐标轴的缩放。
18.4 3-D mesh and surface plots/3维网格图和曲面图
3维网格线图是用指令 mesh 完成的。指令 mesh(z) 创建了一个3维的基于矩阵z的项的透视图。mesh曲面是通过z坐标定义在x-y面之上的矩形网格的点集。尝试 mesh(eye(10))。
相似的,3维曲面图是用指令 surf 完成的。尝试 surf(eye(10))。
为了在一个长方形中绘制函数 z = f(x,y),先要定义向量 xx 和 yy ,它们给出了长方形各边的尺度。使用函数 meshgrid 可以创建一个矩阵 x ,每行等于 xx , 每列的长度是 yy 的长度,类似的矩阵y,每列等于 yy ,如下:
[x,y] = meshgrid (xx, yy);
然后通过输入x和y来得到f的值,用于计算一个矩阵z,其用于 mesh 或者 surf。
例如,可以用如下指令绘制在正方形区域[-2,2]x[-2,2]上绘制 z = e^( (-x^2) (-y^2) )的图像:
xx = -2: .2: 2;
yy = xx;
[x, y] = meshgrid(xx, yy);
z = exp(-x.^2-y^2);
mesh(z)
当然也可以可以将前三行更换为:
[x, y] = meshgrid(-2: .2: 2, -2: .2: 2);
可以尝试把 mesh 更换维 surf 看绘制出的图形。
和以上一样,axis 指令的功能也适用于3维网格面和曲面绘图。
曲面表面的阴影可以通过 shading 指令设置,有三种阴影设定: faceted(默认),interpolated 和 flat,相应的指令为:
shading faceted, shading interp, shading flat
21.09.2018
要注意,在用 surf 生成的表面上,设定 interpokated 和 flat 移除叠加的网格线。在上面生成的表面上可以用可变的阴影实验。指令 shading (跟下面的 colormap 和 view 一样)应该在指令 surf 之后输入。
颜色的配置可以使用指令 colormap 控制。可用的预定义的色谱包括:
hsv(默认), hot, cool, jet, pink, copper, flag, gray, bone
指令 colormap 会为当前的图像设定某一种颜色。
指令 view 可以使用球坐标或者笛卡尔坐标指定一个3维对象的观察点。详见 help view。
MATLAB函数 peaks 可以在研究者感兴趣的表面生成用于实验的 shading, colormap 和 view。
参数化定义的图像也可以生成,MATLAB函数 sphere 和 cylinder 可以在指定的表面生成这样的图像(详见 type sphere 和 type cylinder)。下面的例子是一个在圆环面上生成图像的简单函数。
function [x, y, z] = torus(r, n, a)
%TORUS Generate a torus
% torus(r, n, a) generates a plot of a torus with central
% radius a and lateral radius r. n controls the number
% of facets on the surface. These input variables are optional
% with defaults r = 0.5, n = 30, a = 1.
%
% [x, y, z] = torus(r, n, a) generates three (n+1)-by-(n+1)
% matrices so that surf(x, y, z) will produce the torus
%
% See also SPHERE, CYLINDER
if nargin < 3, a = 1; end
if nargin < 2, n = 30; end
if nargin <1, r = 0.5; end
theta = pi*(0: 2: 2*n)/n;
phi = 2*pi*(0: 2: n)’/n;
xx = (a + r*cos(phi))*cos(theta);
yy = (a + r*cos(phi))*sin(theta);
zz = r*sin(phi)*ones(size(theta));
if nargout == 0
surf (xx, yy, zz)
ar = (a + r)/sqrt(2);
axis([-ar, ar, -ar, ar, -ar, ar])
else
x = xx; y = yy; z = zz;
end
其他的3维绘图函数可以通过 help 了解:
meshz, surfc, surfl, contour, pcolor
18.5 Handle Graphics/ 图像处理
除了上面所说的,为了生成复杂的图像,MATLAB的绘图系统还提供低层的函数来控制图像环境的各个方面。输入指令 set(1) 和 gca,set(ans) 去观察图像1的哪些部分可以被控制。这一系统被称为Handle Graphics,具体参见MATLAB用户手册。
19. Sparse Matrix Computations/稀疏矩阵计算
在执行矩阵运算时,MATLAB通常假设矩阵是稠密的,即其任意一个元素都可能是非零的。然而,如果一个矩阵包含足够多的零项,计算次数可以通过避免零项的算术计算来减少,只对非零项操作也使得对存储空间有更少的要求。单位时间内效率的提升和存储的优势可以使其作为解决大型问题的方案。MATLAB提供了利用稀疏矩阵的能力。
23.09.2018
MATLAB有两种存储模式:full 和 sparse,其中 full 是默认模式。使用指令 full 和 spares 转换这两种模式。对于一个full或者sparse的矩阵A, 指令 nnz(A) 返回A中的非零项的个数。
稀疏矩阵A是其非零元素按照他们的行列系数排成的线性阵列。如果一个传统的full矩阵F是通过如下指令创建的:
F = floor(10*rand(6)); F = triu(tril(F, 1), -1);
那么指令 S = sparse(F) 会把F创建为sparse模式。注意,输出的排列是以列序号为主要参数的。指令 F = full(S) 把 S 重新存储为full模式。使用指令 issparse(A) 可以查看矩阵A的存储模式。
一个稀疏矩阵通常是直接生成的,而不是通过 sparse 对full矩阵转存生成的。一个指定对角线的稀疏的带状矩阵可以简单地通过函数 spdiags 创建。例如,一个熟悉的稀疏带状矩阵用如下指令创建:
m = 6; n = 6; e = ones(n,1); d = -2*e;
T = spdiags([e, d, e], [-1, 0, 1], m, n)
区间向量[-1, 0, 1]指定了[e, d, e]中列的应该放入哪些对角线中(使用 use full(T) 查看)。用m 和 n 的其他值来实验,比如用[-3, 0, 2]代替[-1, 0, 1]。spdiags 的其他功能通过 help spdiags 查看。
于对full矩阵一样,eye, zeros, ones 和 randn 也适用于sparse矩阵,他们分别是:
speye, sparse, spones, sprandn
后两个取矩阵的项并只将非零项替换为1或者正态分布随机数。rand 也允许稀疏结构的随机化。指令 sparse(m, n) 可以创建一个稀疏零矩阵。
功能繁多的函数 sparse 还允许通过列出非零项的方法来创建一个稀疏矩阵。如下:
i = [1 2 3 4 4 4]; j = [1 2 3 1 2 3 ]; s = [5 6 7 8 9 10];
S = sparse(i, j, s, 4, 3), full(S)
一般来说,向量s列出S的非零项,向量i和j列出他们相应的行和列系数,则:
sparse(i, j, s, m, n)
会创建期望的 mxn 矩阵S。请尝试另外一个例子:
n = 6; e = floor(10*rand(n-1, 1)); E = sparse(2:n, 1:n-1, e, n, n)
算术计算和大多数的MATLAB函数都可以应用于独立的存储模式。full矩阵的运算结果也总是full的。可选的其他结果有(S = sparse, F = full):
Sparse: S+S, S*S, S.*S, S.*F, S^n, S.^n, S\S
Full: S+F, S*F, S\F, F\S
Sparse: inv(S), chol(S), lu(S), diag(S), max(S), sum(S)
对于系数矩阵S, 如果S是对称的话,eig(S) 就是full的,否则其是不能定义的。svd 要求full的元素。一个分块构成的矩阵A,比如[A, B; C, D],如果每一块都是稀疏的,则该矩阵也是稀疏的。
你也许想对比两种存储模式在计算三角函数方程组是的效率,比如:在n = 20, 50, 500, 1000时,输入,调用和编辑如下两行指令:
n = 20; e = ones(n, 1); d = -2*e; T = spdiags([e, d, e], [-1, 0, 1], n, n); A = full(T);
b = ones(n, 1); s = sparse (b); tic, T\s, sparsetime = toc, tic, A\b; fulltime = toc
24.09.2018
后记
本次的学习笔记从六月初开始,至九月底结束,远远超出了自己当时预想的时间,首先一个原因是中途的智齿,龋齿造成的牙齿手术和治疗耽误了大量的时间,几乎三个月的时间人是半废状态,强打精神考了四场考试还挂了一门流体;另一方面,软件类的学习在上机实践上也要耗费大量时间,大部分指令靠纯看书并不能直观地理解,必须实际操作,相应地我开写了实践笔记,还在充实中,也会按部就班完成。在这里做学习笔记地效果还算比较突出,唯一的缺点是文本的排版受限,不过应对这种较为简单清晰的内容也足够了。之后也会继续把合适的学习笔记发在简书,与大家一起学习,成长。
板儿车 二零一八年秋 达姆施塔特