MATLAB面向对象学习笔记——2. 进阶
现在我们关注一些进阶的内容,这部分内容并不是标准的面向对象编程内容, 而是MATLAB的特殊机制所带来的,在面向对象编程中必须考虑的问题,更具体地说,是由MATLAB内存管理机制所带来的问题。 与Java的垃圾收集机制不同,在MATLAB的内存管理机制中,内存的释放发生在确定的时刻。 句柄类和全值类 在MATLAB中实际上有两种类型: 继承自handle基类的类型,可以称为handle类、句柄类或引用类; 其他的类型,可以称为Value类、全值类。 下面以两个自定义类型作为对比 1234567891011classdef demo1 properties data endendclassdef demo2 < handle properties data endend 在创建对象时两者都需要开辟内存来存储数据属性,但是对象和属性的关系是不一样的: 对于句柄类,对象和属性之间相当于指针指向的关系; 对于全值类,对象和属性之间是彻底的包含关系。 例如下面的赋值语句会触发对象的拷贝行为 123>> s1 =...
MATLAB面向对象学习笔记——1. 基础
随着代码越来越复杂,我实在是无法忍受修改完全面向过程的混乱程序了,急需引入面向对象的语法进行重构。 MATLAB面向对象的笔记主要参考的是《MATLAB面向对象编程——从入门到设计模式》(徐潇,李远),书中使用的版本不清楚,估计是2015左右的版本。 简单示例 从最简单的一个自定义类型开始 point2d.m1234567891011121314151617181920212223242526classdef point2d properties x y end methods function obj = point2d(x0,y0) if nargin == 0 obj.x = 0; obj.y = 0; elseif nargin == 2 obj.x = x0; obj.y = y0; else ...
MATLAB 绘图笔记
MATLAB的语法学习曲线很特别:入门时用起来特别简单舒服,但是深入学下去就会感觉到语法非常混乱,无所适从。 尤其在绘图部分,MATLAB杂揉了命令式语句和面向对象的语句,存在太多太多的语法糖,毫无逻辑性可言。 随便记录一点关于绘图的代码吧。 基本作图 MATLAB可以非常容易地画一个曲线图,只需要三行代码即可(下面的figure;语句可以省略) 12345x=linspace(0,2*pi);y=sin(x);figure;plot(x, y); MATLAB将会弹出一个绘图窗口,在其中绘制曲线。 我们可以在曲线图中加上常见的绘图元素 1234567891011121314% 标题title('Sine Wave');% 轴标签xlabel('x');ylabel('sin(x)');% x轴和y轴范围axis([0 2*pi -1.5 1.5]);% 或者单独设置x轴范围% xlim([xmin xmax])% 添加网格grid on; 我们可以一次性使用plot绘制多条曲线 123456x =...
MATLAB 学习笔记——6. 输入输出
虽然MATLAB将字符数组和字符串,字符串数组进行了区分,但是出于兼容性考虑,在下面的各种输入输出方式中无论是使用字符数组还是字符串都是一样的效果。 显示变量的值 disp函数可以用来显示一个变量的值,如果这个变量是字符串的话,也可以达到输出信息的效果,但是会自动添加一个回车。 例如 12disp('hello,world!');% hello,world! 这里的disp(X)语句加不加;都是一样的。 disp函数只接受一个参数,我们可以将字符数组拼接起来进行显示 12disp(['hello', ',', 'world']);%...
MATLAB 学习笔记——5. 脚本与函数
.M 文件 MATLAB 的.m文件可以分成两类: 脚本文件,不接受输入参数,它们处理工作区中的变量和数据。 函数文件,可接受输入参数,并且可以有返回值,内部变量是函数的局部变量。 除此之外,MATLAB也提供了.mlx格式的实时脚本(实时函数)文件,大致就是Jupyter Notebook的模仿,但是用起来并没有后者那么好用,各种操作不够自然。如果我们需要在.m文件和.mlx文件之间转换,直接改文件后缀的做法是不安全的,可能会导致格式错误,需要用MATLAB专门提供的工具进行转换。 MATLAB 对于 .m...
MATLAB 学习笔记——4. 流程控制
在划分控制结构所对应的代码块时,编程语言通常采用如下三种做法: 基于大括号{}:例如C/C++,Java 基于end标记:例如FORTRAN,MATLAB 基于缩进:Python MATLAB受到FORTRAN的影响很大,也采用基于end的代码块标记。 if 条件语句 提供例子即可 123if x>1 x=1;end 12345if x>1 y=x;else y=1;end 1234567if x>10 y=x;elseif x>0 y=1;else y=0end switch 条件语句 MATLAB支持基本的switch语句,我们可以判断表达式的值以进入不同的分支,不需要在分支结束使用break,因为不会进入下一个分支,默认分支为otherwise。MATLAB并不要求case后面的结果是常量。 12345678switch x case 1 z=1 case 2 z=2 otherwise ...
MATLAB 学习笔记——3. 元胞数组和结构体数组
在编程实践中,仅仅只靠浮点数数组还是不够的,我们还需要其他更灵活的数据结构(运行效率也会更慢),最常见的数据结构是元胞数组和结构体数组。 元胞数组 元胞数组是一种包含名为cell的索引数据容器的数据类型,其中的每个cell都可以包含任意类型的数据。 元胞数组可以包含文本列表、文本和数字的组合或者不同大小的矩阵等,通常用于打包一组矩阵或多组矩阵。 通过将索引括在圆括号()中可以引用cell,使用花括号{}进行索引来直接访问cell的内容,两者区别见下文。 元胞数组的创建方式如下,元胞数组通常使用二维的结构,m行n列,每一个元素是一个矩阵或其他对象,元胞数组也支持多维的定义和操作。 123C1 = {}; % 空的元胞数组C2 = {1,2,3; 'text',rand(5,10,2),{11; 22; 33}} % 2*3的元胞数组 还可以定义指定尺寸的,每一个元素均为空矩阵的元胞数组: C = cell(n),返回由空矩阵构成的\(n\times n\)元胞数组。 C...
MATLAB 学习笔记——2. 矩阵
概述 MATLAB 对于矩阵的支持非常好,以矩阵运算为代表的基本运算功能一直是 MATLAB 引以为自豪的核心与基础。我们可以把向量和矩阵都视作矩阵进行统一的操作。在下文中我们默认讨论二维矩阵,但 MATLAB 支持多维矩阵。行向量即行数为 1 的矩阵,列向量即列数为 1 的矩阵。 在内存中,MATLAB 使用列主序进行连续存储,与 Fortran 相同,与 C 语言是反的。在下标的使用中,MATLAB 默认下标从 1 开始,与 Fortran 相同,与 C 语言等绝大部分编程语言都不同。 矩阵的尺寸信息可以通过下面的语句获取: size(A) 行数和列数,返回一个1x2的行向量; size(A,1) 行数; size(A,2)...
MATLAB 学习笔记——1. 基础
之前对 MATLAB 的使用都是轻量级的,因此总是不太熟,趁着必须要用 MATLAB 的机会,小结一下 MATLAB 的基本语法,便于查阅。(2022年9月) 之前的MATLAB笔记还是太简陋了,必须加上面向对象等部分组成更完整的系列笔记。因为现在手上的代码还是太乱了,必须彻底重构一下,先把笔记补上。(2024年6月) 基本语法 注释:MATLAB 使用百分号%进行单行注释,使用%{...%}进行多行注释。 分号:; MATLAB 并不需要强制使用分号作为语句的结尾,以空格或回车结尾即可。不使用分号结尾时会把计算结果显示出来,使用分号结尾则会抑制计算结果的显示。 续行符:在第一行的结尾使用...可以把命令接续到第二行。(如果直接把...接在数字后面会报错,可以加空格) 命令补全:Tab 键。 对命令行窗口清屏:clc MATLAB 的一切数据都是矩阵:行向量是行数为 1 的矩阵,数是行数列数均为 1 的矩阵,甚至一个无效命令,它的返回值[]都是一个 0 行 0 列的空矩阵。 和其他现代编程语言类似: MATLAB 对大小写敏感,这与它所参考的...
UML类图速成
...