Vim 学习笔记
vim 被称为编辑器之神,学习难度很大,但是熟练掌握后可以更高效地敲代码,因此有必要学一下,但是没必要鼓捣各种插件。 主要参考:【Vim】可能是B站最系统的Vim教程 vim 介绍与版本 vim 是古董编辑器 vi 的升级版,在现代的 Linux 发行版中通常自带 vim,无需手动安装,虽然版本通常不是最新的,但是也足够使用。在很多发行版中都将 vi 命令链接到 vim 命令,因此 vi 命令和 vim 命令通常是等价的,都是在调用 vim 编辑器。 在 vim 中输入 :version 可以查看版本信息,例如 123VIM - Vi IMproved 8.2 (2019 Dec 12, compiled Nov 22 2021 19:31:05)Included patches: 1-3582Compiled by <https://www.msys2.org/> vim 的各种功能模块化,在编译安装时可以选择精简其中一部分功能,至少有几种安装模式:tiny, small, normal, big, huge,显然 huge 版本的功能最完整。 在 :version...
K-means 算法
K-means 算法是一种经典的无监督学习算法,用于将数据自动分为 \(k\) 个簇,这里的 \(k\) 需要提前给定。 K-means 算法假设簇是凸的、大小相近,此时处理效果最好,但是并不能处理复杂形状的簇(如半月形),对维度高的稀疏数据(如文本)不太适用。 算法步骤 设数据集为 \(X = \{x_1, x_2, \dots, x_n\}\),\(x_i \in \mathbb{R}^d\),希望聚为 \(k\) 类,算法流程如下: 初始化:随机选择 \(k\) 个数据点作为初始的簇中心。 分配:将每个数据点分配到最近的簇中心,以形成 \(k\) 个簇。设当前中心为 \(\mu_1, \dots, \mu_k\),对于样本 \(x_i\),所属的簇为 \[ x_i \in C_s \,\, \text{where} \,\, s = \arg\min_{j=1,\dots,k} \| x_i - \mu_j \|^2 \] 更新:重新计算每个簇的中心,记 \(C_s\) 是第 \(s\) 个簇内的数据点集合,那么中心 \(\mu_s\) 为 \[ \mu_s = \fra...
Julia 学习笔记——8. 模块与包
TODO 项目管理 Julia 的项目下面有两个文件 Project.toml 项目配置文件 Manifest.toml 项目依赖包列表 作用大致相当于 package.json 和 package-lock.json,通常不需要手动修改。 Julia 调用 Python 在 Julia 的实际使用中,如何调用其它语言尤其是 Python 是一个重要的需求,目前有两种做法: PyCall.jl,搭配 Conda.jl 使用 PythonCall.jl,搭配 CondaPkg.jl 使用 前者是早期或者说是主流的做法,后者则是一种新方案。
Julia 学习笔记——7. 多维数组
概述 TODO 创建数组 数组字面量 特殊数组 向量化函数的点语法 TODO
Julia 学习笔记——6. 函数进阶
函数的参数类型 Julia 允许给函数的(一部分或全部)参数加上类型约束,例如 123function add2(x::Int64, y::Int64) return x + yend 正常使用例如 12add2(1, 3) # 4add2(Int64(1), Int64(10)) # 11 注意 Julia 不会对参数进行自动的类型转换,即使转换是安全无损的,例如 1add2(Int32(1), Int32(2)) # error 使用过于具体的参数类型约束通常不是合适的选择,可以使用更抽象的类型约束,例如使用一般的整数类型 123function add3(x::Integer, y::Integer) return x + yend 此时可以支持更多种类的参数进行调用,例如 12add3(Int32(1), Int32(10)) # 11add3(Int32(1), 10) # 11 注意到这里允许两个参数是不同的整数类型,Julia 提供了 where 关键字为泛型编程增加额外约束(类似 C++ 的 concepts 和 requires),例如要求两个参数的...
Julia 学习笔记——5. 变量作用域与类型系统
Julia 具有强烈的学院派风格,类型系统设计的非常复杂,并且比 C++ 充满历史包袱的类型系统和模板机制精巧很多。 变量作用域 Julia 有相对复杂的作用域机制,包括全局作用域,局部作用域,对于局部作用域又分为软作用域和硬作用域。 大部分语句都会产生作用域,但是有两个例外:begin 语句和 if 语句。 Julia 使用词法作用域,也就是说一个函数的作用域不继承自调用了函数的调用者作用域,而继承自该函数定义处作用域。 容器 元组和具名元组 Julia 支持和 Python 几乎一样的元组,元组中的元素可以是不同类型,例如 1234(1, 2)1, 2(1, "2", 3.0) 这里的括号在不存在歧义时可以省略,只含一个元素的元组和空元组有固定的写法,例如 12(1,)() 元组中的元素可以使用索引访问(索引从1开始),例如 123a = (1,'a');a[1] # 1a[2] # 'a' 和 Python 一样,Julia 的元组赋值可以自动解包,因此可以用来同时定义多个变量,例如 123(x,y,z) = (1...
Julia 学习笔记——4. 函数基础
Julia 中的函数与 Python 很类似,都是作为语言的一等公民,包括直接把函数视作变量,可以用函数赋值和作为参数传递等都是一样的,两者最大的区别可能就是关键字从 Python 的 def 换成 Julia 的 function,除此以外都是一些细节差异。 函数基础 简单例子 最基本的例子如下 12345function f(x,y) x + yendf(1,2) # 3 和 Python 一样,Julia 的函数不需要额外的类似函数句柄的机制,函数对象可以和普通的值一样被传递。 12345function f(x,y) x + y;endg = f; g(1,2) # 3 函数的赋值形式 Julia 支持以单行的赋值形式定义简单的函数 1f(x, y) = x + y; 此时的函数体只能是一个单行表达式,这个表达式的结果自然就是函数的返回值。由于函数分派机制的存在,这种简单函数在 Julia 中实际上很常见。 return 语句 Julia 可以使用 return 语句返回值,但是和 Python 不同的是,Julia 在不使用 return 语句时,自动将最后...
Julia 学习笔记——3. 流程控制
简单过一遍 Julia 中的流程控制。 条件语句 if 条件语句和其它语言一样,注意其中的条件表达式不需要括号 123456789101112x = 3;y = 2;if x < y println("x is less than y")elseif x > y println("x is greater than y")else println("x is equal to y")end# x is greater than y C/C++ 使用 else if;Python 使用 elif;MATLAB 使用 elseif,Julia 也使用 elseif。 Julia 严格要求 if 和 elseif 所接受的条件必须是 Bool 值,不接受隐式转换,例如下面的语句会报错 123if 1 # error println("1 is true")end if 语句整体在运行时会将对应分支的执行结果作为返回值,这相比于其他语言有点奇怪。 123456ju...
Julia 学习笔记——2. 基本数据类型与运算符
整数与浮点数 整数 Julia 支持固定长度的整数类型,包括有符号和无符号的版本,例如 Int8,Int32,UInt32 等。对于十进制整数字面量,在64位系统中默认使用 Int64 类型整数。可以使用 typeof() 查看字面量的类型(Python 对应的函数为 type()) 1typeof(1) # Int64 类型也是可以作为参数进行运算的,例如使用 typemin() 和 typemax() 直接查看类型的最大最小值 123typemin(Int32) # -2147483648typemin(Int64) # -9223372036854775808typemax(Int64) # 9223372036854775807 注: Julia 支持使用 _ 作为数字的分隔符,可以提高可读性,例如10_000。 由于整数的位数是固定的,在运算中自然也存在溢出问题,与其它语言中的处理类似,不再赘述。 Python 的整数是无限精度的,Julia 也提供了 BigInt 类型以支持无限精度。 对于非十进制的整数字面量,Julia 采用了不同的处理:默认将其视作无类型整数...
Julia 学习笔记——1. 概述
尝试学一下 Julia,但是这份笔记的时间跨度可能很长,有空就写一点吧。 需要说明的是,这个系列不是零基础的 Julia 笔记,而是直接从 Python 和 MATLAB 到 Julia 的迁移学习,并且笔记是围绕主题进行的,不是逐渐展开的。 介绍 Julia是一门新兴的科学计算语言,它的设计目标非常宏大:希望 Julia 可以同时拥有 Python/MATLAB 一样的易用性和 C/C++/Fortran 一样的运算效率。 Julia有很多与众不同的特点: 从设计定位来说,Julia 具有后发优势,是为 JIT 编译而量身定制的语言,目的是解决现在泾渭分明的动态语言和静态语言之间,优劣不能兼顾,因而必须组合使用的问题。 从计算效率的角度,虽然和Python在使用时很相似,但是Julia的计算效率却比Python高很多。Python的科学计算模块Numpy等必须依赖于C/C++编写的底层库,但是Julia自身就可以提供足够的科学计算能力(主要是通过预编译实现的)。 从语法设计的角度,Python并没有关注于科学计算编程中的便利性,Julia和MATLAB、Fortran、R语言...
