MATLAB 学习笔记——6. 输入输出
虽然MATLAB将字符数组和字符串,字符串数组进行了区分,但是出于兼容性考虑,在下面的各种输入输出方式中无论是使用字符数组还是字符串都是一样的效果。 显示变量的值 disp函数可以用来显示一个变量的值,如果这个变量是字符串的话,也可以达到输出信息的效果,但是会自动添加一个回车。 例如 12disp('hello,world!');% hello,world! 这里的disp(X)语句加不加;都是一样的。 disp函数只接受一个参数,我们可以将字符数组拼接起来进行显示 12disp(['hello', ',', 'world']);% hello,world 在很多默认行为中都会调用disp函数,例如一个普通的赋值语句如果不以;结尾,可能会对赋值结果调用disp函数以展示它的值。 对于自定义类型也可以通过定义 disp 方法来达到自定义输出效果的目的。 格式化字符串 MATLAB支持和C语言几乎一样的字符串格式化函数,包括fprintf和sprintf。 fprintf格式化输出到控制台或文件中,返...
MATLAB 学习笔记——5. 脚本与函数
.M 文件 MATLAB 的.m文件可以分成两类: 脚本文件,不接受输入参数,它们处理工作区中的变量和数据。 函数文件,可接受输入参数,并且可以有返回值,内部变量是函数的局部变量。 MATLAB 对于 .m 文件的文件名有一些特殊要求: 文件名允许由字母、数字、下划线(_)和点(.)组成,注意不包括-和空格; 文件名必须以字母开头; 文件名区分大小写。 较新版本的MATLAB提供了后缀为.mlx的实时脚本/函数文件,大致就是对Jupyter Notebook的模仿,但是用起来并没有后者那么好用,各种操作不够自然。由于.mlx文件不是纯文本文件,如果我们需要在.m文件和.mlx文件之间转换,必须通过MATLAB专门提供的工具进行转换,vscode等编辑器也并不支持.mlx文件的显示。 脚本文件 载入脚本文件会依次执行所有命令,在重复执行大量命令时,可以整理为一个脚本进行执行。 对于当前目录下的myfile.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. 结构体数组和元胞数组
在编程实践中,仅仅只靠浮点数数组还是不够的,我们还需要其他更灵活的数据结构(运行效率也会更慢),最常见的数据结构是结构体数组和元胞数组。 结构体数组 虽然MATLAB官方将其称为结构体数组,但是实际上不管是从使用还是实现的角度,将其称为字典都更合适。在C++的语境中,结构体约等于自定义类型,而对于MATLAB,自定义类型和结构体数组是截然不同的。 结构体数组(struct)是 MATLAB 中一种非常灵活的具名数据类型,可以将不同类型的数据直接组合在一起,每个字段具有名称,可以包含不同类型和大小的数据,结构体数组使得组织和管理复杂数据更加方便。 结构体数组的使用非常灵活,可以使用点符号直接创建 12345% 此前person未定义% 创建一个结构体数组并添加字段person.name = 'John Doe';person.age = 30;person.height = 1.75; 需要注意的是,这里的person变量尚未定义,否则上述语句只有在person已经是一个结构体数组时才会成立,此时的效果是创建或修改对应的字段。 甚至支持下面这种多层结构体的直...
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 行 1 列的矩阵。 MATLAB 的很多内置函数对于行/列向量有特殊处理,在语义上并不能自然地推广到矩阵,可能是为了用户的便利,也可能是历史兼容性。例如不建议通过length获取尺寸信息,为了兼容行列向量的长度语义,这个函数只会返回矩阵的行数和列数之间的最大值。 下面...
MATLAB 学习笔记——1. 基础
之前对 MATLAB 的使用都是轻量级的,因此总是不太熟,趁着必须要用 MATLAB 的机会,小结一下 MATLAB 的基本语法,便于查阅。(2022年9月) 之前的MATLAB笔记还是太简陋了,必须加上面向对象等部分组成更完整的系列笔记。因为现在手上的代码还是太乱了,必须彻底重构一下,先把笔记补上。(2024年6月) 基本语法 注释:MATLAB 使用百分号%进行单行注释,使用%{...%}进行多行注释(不常见),使用%%开头的内容不仅是注释,而且会被视作节标题。(在字符数组中%仍然被用于占位符) 分号:; MATLAB 并不需要强制使用分号作为语句的结尾,以空格或回车结尾即可。不使用分号结尾时会把计算结果显示出来,使用分号结尾则会抑制计算结果的显示。 续行符:在第一行的结尾使用...可以把命令接续到第二行。(如果直接把...接在数字后面会报错,可以加空格) 命令补全:Tab 键。 对命令行窗口清屏:clc MATLAB 几乎所有数据都是矩阵:行向量是行数为 1 的矩阵,数是行数列数均为 1 的矩阵,甚至一个无效命令,它的返回值[]都是一个 0 行 0 ...
UML类图速成
类的表示 一个类在类图中用矩形框表示,矩形框分为三层: 类名 类的成员变量:名称和类型 类的方法:名称,参数类型和名称,返回值类型(也就是完整的函数签名) 对于成员变量和方法,使用不同的前缀代表访问修饰符: 缺省代表default +代表public -代表private #代表protected 对于一个抽象类或接口,它的类名以及抽象方法(留给子类实现的方法)名称使用斜体表示,以示区别。 类的关系 下面的几种关系讨论的都是两个类之间的关系,也可以理解为两个类的实例之间的关系。 对于满足后四种关系的两个类,如果屏蔽了其中一个类的定义,另一个类是无法通过编译的。 有的教程将后四种关系统称为关联关系,将聚合/组合/依赖关系视作特殊的关联关系。 继承与实现 继承和实现是类之间非常强的关系,在代码中的特征非常明显: 继承关系(泛化关系) 子类和父类之间的继承关系。 在记号上使用带空心三角箭头的实线相连,空心三角箭头指向父类。 实现关系 类和接口之间的实现关系。 在记号上使用带空心三角箭头的虚线相连,空心三角箭头指向接口。 这里的接口主要是针对Java的,Java...
Cpp Pimpl 模式
Pimpl(Pointer to Implementation)是一种常用的C++设计模式,用于隐藏类的实现细节、减少编译依赖性和提高封装性。 概述 Pimpl模式主要的思路就是:在实现类的外层套上一层简单的接口类,接口类只含有一个指向实现类的指针,并暴露必要的接口。 注意接口类包含的不是实现类对象,而是实现类指针,否则修改实现类无法做到二进制的稳定性。 Pimpl模式可以达到如下的效果: 隐藏实现细节:实现细节被封装在实现类中,提供给用户的接口类只暴露必要的接口,提高代码的封装性 维护接口稳定性:我们只需要维护暴露在接口类中的接口稳定性即可,实现类的内部可以自由地进行更改 减少编译依赖性:由于接口类的实现细节被隐藏,接口类只含有实现类的指针,对实现类进行的细节改变不会导致依赖于接口类的文件重新编译,从而减少编译时间。 Pimpl模式和继承以及虚函数的作用是不重合的,并不存在相互取代的关系。 和虚函数类似,Pimpl增加了间接的指针调用,这必然会影响到程序的运行效率。 示例 包括三个文件: Demo.h:接口类的声明 Demo.cpp:实现类的完整实现,以及接口类的实现 m...
Linux ssh 笔记
详细记录一下关于ssh的内容,这部分内容比较繁杂。 基本使用(1) ssh 最基本的用途就是登录远程服务器 1ssh user@hostname 其中: user是登录用户名 hostname是主机名,它可以是域名,也可以是某个具体的 IP 地址或局域网内部的主机名。 可以缺省用户名,此时将使用本地用户名作为远程服务器的登录用户名。 1ssh hostname 用户名也可以通过-l参数指定,这样用户名和主机名就不用写在一起了,在脚本中可能更方便 1ssh -l username hostname ssh 会默认连接远程服务器的22端口,使用-p参数也可以指定其他端口(同时也要修改远程服务器的监听端口) 1ssh -p 8821 foo.com ssh 在连接到远程服务器后会进行验证:如果第一次通过ssh连接某一台服务器, 命令行会显示一段文字,表示不认识这台机器,提醒用户确认是否需要连接 123The authenticity of host 'foo.com (192.168.121.111)' can't be established.ECD...
C/Cpp 枚举类与强枚举类
整理一下关于C/C++中枚举类的用法。 概述 C和C++中提供了枚举类型,用于定义一组相关的命名离散常量, 通常直接使用非负整数实现,并且枚举可以很方便地和非负整数进行相互转换。 但是这不符合C++类型系统的设计要求,C++将之前的枚举称为弱枚举类型,并且提供了更加安全的强枚举类型, 强枚举相比弱枚举有如下优点: 作用域限制:枚举成员不会污染所在作用域的命名空间。 类型安全:强类型枚举不允许隐式转换为整数,必须显式进行转换。 明确的基础类型:可以指定枚举成员的基础类型,默认是int。 弱枚举类型 使用enum定义枚举类型和枚举变量,例如 12345enum DAY{ MON, TUE, WED, THU, FRI, SAT, SUN};enum DAY day; 也可以将它们合在一起简写 1234enum DAY{ MON, TUE, WED, THU, FRI, SAT, SUN} day1, day2; 使用枚举类例如 12345678910111213#include <stdio.h>enum DAY &...