Python 笔记汇总
Python 学习笔记——1.基础 Python 学习笔记——2.字面量与运算符 Python 学习笔记——3.流程控制与异常 Python 学习笔记——4.函数 Python 学习笔记——5.类 Python 学习笔记——6.模块和包 Python 学习笔记——7.输入输出 Python 学习笔记——8.函数与类进阶 Python 学习笔记——9.变量 Python 学习笔记——10.基本类型常用操作 Python 学习笔记——11.类型注解和帮助系统 Python 学习笔记——12.函数式编程 Python 命令行参数解析 argparse Python 代码测试 unittest / pytest Python 日志库 logging Pytorch 环境配置记录 VSCode Python 配置 Python 包下载和虚拟环境管理 Jupyter notebook 本地和远程部署 Numpy 学习笔记之一 Numpy 学习笔记之二 Numpy 学习笔记之三 Python 理解切片的底层原理 Python 绘图笔记——1.基础 Python 绘图笔记——2.曲线...
MATLAB 高性能编程笔记
记录一些常用的MATLAB编程技巧/规范,目标是写出高效并且可维护的MATLAB代码。主要参考官方文档中的提升性能的方法。 这里的讨论只关注运算效率,假设内存总是足够的,并且不涉及并行计算和GPU。 关于代码结构 我们有很多方式执行代码:命令行 vs 脚本 vs 函数,虽然绝大多数代码在不同方式中执行都是等效的,但是考虑优化就不是一回事了,通常的运行效率关系为:命令行 < 脚本 < 函数,也就是说函数的执行速度通常是最快的。 基于模块化编程的思维,避免使用过大的单一文件,考虑将其中重复使用的功能拆分为简洁的函数文件,这种做法可以降低首次运行的成本。 优先使用局部函数而非嵌套函数,嵌套函数可以直接访问外层函数的变量(按照引用捕获),这会影响效率,更好的做法是将所有需要的变量以函数参数的形式显式传递。 关于数组操作 预分配+向量化 两个核心原则:预分配 + 向量化 预分配数组:提前分配数组大小,避免在循环中动态扩展数组。 向量化计算:尽可能使用矩阵和向量运算,避免 for 循环。 我们可以对 for 循环中的几种常见写法进行简单的对比: 123456789101112...
Python 理解切片的底层原理
在学习 Python 的字符串和列表所支持的切片操作,以及 Numpy 所支持的各种花式索引操作时,总是会感到非常困惑, 究其原因,就是没有理解这背后的底层原理,因此有必要专门学习一下。 __getitem__ 和 __setitem__ 方法 Python 为类型的 [] 操作提供支持的方法是 __getitem__ 方法和 __setitem__ 方法,分别提供读写的功能。 例如我们可以实现一个支持 [] 读操作的实验类型: 1234class Demo: def __getitem__(self, index): print(f"type(index) = {type(index)}") print(f"index = {index}") 尝试一下基本的索引操作 12345678910111213a = Demo()a[0]# type(index) = <class 'int'># index = 0a[-1]# type(in...
LaTeX 笔记汇总
LaTeX Tex Live 安装 VSCode LaTeX WorkShop 配置 LaTeX 基本概念 LaTeX Beamer 笔记 🔥 LaTeX 参考文献笔记 LaTeX 命令行编译 LaTeX 算法与代码环境 LaTeX 插入图片 LaTeX 中文字体配置 LaTeX 英文字体配置 LaTeX 数学公式与字体笔记 LaTeX 数学定理与证明环境 LaTeX 论文排版笔记
MATLAB 单元测试
学习一下关于 MATLAB 单元测试的内容,为了维护一份健壮的代码库,单元测试是必不可少的,参考官方文档。 MATLAB 提供的测试主要包括三种风格: 基于脚本 基于函数 基于类 基于脚本的单元测试 可以通过一个脚本对指定功能进行测试,脚本名称必须以 test 开头或结尾,不区分大小写,否则测试文件可能被忽略。 每一代码节(%%)作为一个测试单元,随后的文本视作测试单元的名称,否则MATLAB会提供一个默认名称。 如果脚本中不含代码节,那么整个文件会被视作一个测试单元,测试单元的名称为脚本名称。 在测试单元中主要通过 assert 语句进行检查。 在第一个代码节之前的内容是测试的初始化代码,可以用于配置测试环境,如果这部分出现错误,会导致所有测试单元失败。 执行单元测试的流程为:在每次开始时执行初始化代码,然后跳转到某个测试单元执行,执行结束即退出,不会执行多个测试单元,无论成功或失败。 这种执行方式可以保证一个测试单元的失败不会导致整个测试中断,不同测试单元使用的变量不会相互影响。 但是由于脚本仍然是一个合法的MATLAB文件,我们还是可以直接运行整个文件,这意味着依次执行...
MATLAB 帮助系统
这篇笔记只为了解决两个问题:如何基于命令行使用MATLAB的帮助文档系统?如何让自己编写的代码(函数和类)适配MATLAB的帮助系统? 获取帮助 doc & docsearch 打开 MATLAB 文档浏览器(最新版已经改成使用系统浏览器),显示帮助中心对应的完整页面。 打开帮助中心首页 1doc 打开abs对应的页面 1doc abs 在帮助中心搜索关键字 1docsearch abs 这两个命令都是完全基于离线版的MATLAB帮助中心,和在线的MATLAB帮助中心几乎一致(除了版本和语言可能不同),通常不支持对用户自定义代码的帮助。 help help 命令可以在命令行中显示简要帮助信息。 help name 会显示 name 指定的功能的帮助文本,例如函数、方法、类、工具箱、变量或命名空间。 help 则会显示与先前操作相关的内容。 例如查找函数的帮助信息 1help abs 输出内容如下 123456789abs Absolute value. abs(X) is the absolute value of the elements of X. ...
MATLAB 踩坑记录
记录一下 MATLAB 踩过的小坑,MATLAB的各种内置函数的用法实在是太奇怪了,一个小细节就可以搞出各种问题。 矩阵元素个数 除了最常见的size(A)可以获取数组的尺寸,还有如下函数: numel(A) 可以获取(任意维度数组)所有元素个数; length(A) 可以获取向量的长度(也就是元素个数),但是扩展到高维数组的行为是非常反直觉的——返回最大维数长度,相当于max(size(A))。 矩阵偏移 函数 circshift 可以用于向量或矩阵的循环偏移,不会修改原始数据。 向量偏移 123456A = [1, 2, 3, 4, 5];circshift(A, 1)% [5, 1, 2, 3, 4]circshift(A, -1)% [2, 3, 4, 5, 1] 矩阵的偏移就比较复杂了,按照前面的做法会以行为整体进行偏移!!! 1234567A = [1 2 3; 4 5 6; 7 8 9];circshift(A, 1);% 7 8 9% 1 2 3% 4 5 6 如果希望以列进行...
Cpp 多态方案对比——回字的四种写法
虽然C++没有直接提供interface,但是却提供了虚函数、模板类型等各种语法,使得我们可以用各种方式实现多态,这里我们不区分动态多态和静态多态,而是从设计一个框架的角度,分别使用四种方案实现: 虚函数(最简单直接的方式) std::function CRTP(最晦涩的方式) deducing this(可以视作CRTP的简化,不再需要将派生类作为模板参数传递,要求C++23) 需求 我们考虑这样一个需求: 基类A包括:(不可实例化) 主方法run:调用func1,func2和func3 实现方法func1 实现方法func2(多态,允许子类修改) 实现方法func3(多态,子类必须实现) 派生类B1:继承A 实现方法func3(多态,允许子类修改) 派生类B2:继承A 实现方法func3(多态,允许子类修改):调用func4 实现方法func4(多态,允许子类修改) 具体类C1:继承B2 实现方法func4 具体类C2:继承B2 实现方法func3 最终我们直接通过各种对象自身来调用run方法,达到如下效果: 12345678Running B1 ...
解读一份极其晦涩的c++代码
事先声明,下面的各种语法技巧都是炫技式的,刻意降低代码的可读性,只是写着玩,在实际应用中是不会允许这么乱写的。 先来几个开胃菜。 开胃菜 (1) 嵌入网址? 下面这段代码看起来是在c++中直接嵌入了一个网址 1234567#include <iostream>int main(){ https://www.zhihu.com std::cout << "Hello World!" << std::endl; return 0;} 它确实是合法的c++代码,但是含义却并不是网址: 左半部分https: 是一个标签,可以通过goto跳转; 右半部分由于//的存在,就是一个注释,直接被忽略了。 下面的代码就更利于理解了 123456789#include <iostream>int main() {label: // 这是注释 std::cout << "Hello World!" << std::endl; ...
Jupyter notebook 本地和远程部署
整理一下 jupyter notebook 的各种使用方式。 本地部署 直接在本地主机上启动 jupyter notebook 服务是最简单的用法 1jupyter notebook 需要说明的是: jupyter服务默认监听本机的 8888 端口,如果本机的 8888 端口已经被占用,在启动时会自动递增,例如改为 8889 端口等,也可以使用--port选项指定; jupyter 在启动时会尝试打开本地浏览器,或者手动通过http://localhost:8888/访问即可,可以加上选项阻止自动开启浏览器 --no-browser; 默认只允许接收来自localhost的请求,可以使用 --ip 选项指定,例如--ip=0.0.0.0代表允许所有的ip访问; 默认的工作目录是执行命令时所处的目录,可以在后面加上工作目录作为位置参数,例如jupyter notebook /path/to/notebooks,还可以使用 --notebook-dir 选项指定,例如--notebook-dir=/path/to/notebooks。 除了直接在前台运行,在Linux中还可以使用...