# linearalgebra
**Repository Path**: MechDancer/linearalgebra
## Basic Information
- **Project Name**: linearalgebra
- **Description**: No description available
- **Primary Language**: Kotlin
- **License**: WTFPL
- **Default Branch**: master
- **Homepage**: None
- **GVP Project**: No
## Statistics
- **Stars**: 0
- **Forks**: 0
- **Created**: 2019-10-01
- **Last Updated**: 2020-12-19
## Categories & Tags
**Categories**: Uncategorized
**Tags**: None
## README
# Kotlin 线性代数库
[  ](https://bintray.com/mechdancer/maven/linearalgebra/_latestVersion)
[](https://www.travis-ci.org/MechDancer/linearalgebra)
支持线性代数各类常用判定和计算,以及线性空间内的一些解析几何计算问题。
## 开始使用
* Gradle
* Maven
* Bintray
您需要将其添加至 [仓库和依赖](https://docs.gradle.org/current/userguide/declaring_dependencies.html) 中。
### Gradle
```groovy
repositories {
jcenter()
}
dependencies {
compile 'org.mechdancer:linearalgebra:0.2.5-dev-3'
}
```
### Maven
```xml
jcenter
JCenter
https://jcenter.bintray.com/
org.mechdancer
linearalgebra
0.2.5-dev-3
pom
```
### Bintray
您总可以从 bintray 直接下载 jar:[  ](https://bintray.com/mechdancer/maven/linearalgebra/_latestVersion)
## 算法支持概览
### 向量
* 对应项四则运算
* 内积
* 范数:1范数、2范数、∞范数
* 长度标准化
### 矩阵
#### 变形
* 数乘、除以数
* 相加、相减
* 右乘、右除
* 右乘向量
* 乘方
* 转置
* 求伴随阵
* 求逆
* 行初等变换
#### 求值
* 行列式
* 秩
* 迹
* 范数:1范数、2范数、∞范数
* 方阵条件数
### 分解
* 特征值分解(雅各比过关法)
### 方程组
* 适定:直接解算
* 超定:最小二乘
### Jama依赖
现在库直接依赖于 Jama,并包含两个简单的函数与 Jama 互操作,你可以随时转入 Jama 以获取高度优化的性能。
```kotlin
matrix.toJamaMatrix() // 转入 Jama
buildFromJama(jamaMatrix) // 转出 Jama
```
## 路线图
未来将会实现以下功能:
* 非方阵的二条件数
* SVD分解等其他矩阵分解法
* 表示欠定方程组的基础解系
欢迎开发者提出你需要的算法!
## 类型
库主要支持三类线性代数的数学结构,`向量` 、`矩阵` 和 `线性方程组`。出于性能考虑,向量和矩阵各自有多种实现,用户需要从中选择一种。
### 向量
目前向量提供两种实现:
* 列表向量 `ListVector`
* 二维向量 `Vector2D`
列表向量的数据存在一个 `List` 中,可以通过成员 `data` 直接访问。0 维向量也是有效的。
二维向量是特化为二维的向量,支持一些平面几何的相关操作。两个二维向量进行返回向量的二元运算时返回的仍是二维向量。处理平面几何问题时使用这种实现可以避免许多不必要的维数检查。
这两种实现都是不可变的。
### 矩阵
矩阵的很多操作只修改矩阵内很少的元素,此时原地计算将具有很大的性能优势。为了支持这些操作,矩阵有两种接口:不可变的 `Matrix` 和元素值可变的 `ValueMutableMatrix`。库为这两种接口分别提供了一种实现:
| 接口 | 实现 | 直接访问数据 |
| :----------------: | :---------: | :----------: |
| Matrix | ListMatrix | data |
| ValueMutableMatrix | ArrayMatrix | data |
现在,库为下列特殊矩阵提供了特化的实现:
| 特殊矩阵 | 类名 | 备注 |
| :---------: | :---------------: | :-----------------------------: |
| 零矩阵 | ZeroMatrix | |
| 数值矩阵 | NumberMatrix | 单位矩阵是等价于 1.0 的数值矩阵 |
| 对角矩阵 | DiagonalMatrix | 方阵 |
| 希尔伯特矩阵 | HilbertMatrix | |
| 范德蒙矩阵 | VandermondeMatrix | |
特化实现**必然**占用较少的内存,并且在进行特定计算时可能有性能优势。
### 方程组
目前方程组并无实现的必要,因此只是一些类型别名。
```kotlin
typealias Equation = Pair //方程包括参数向量和常数项
typealias EquationSet = Set //方程组是方程的集合
typealias AugmentedMatrix = Pair //增广矩阵是系数矩阵和常数向量的组合
```
* 注意:由于 Java 不支持 Kotlin 的类型别名,因此在 Java 中调用库需要使用这些类型的本名。
* 扩展方法在 Java 中会表现为有一个参数的静态函数。
## 录入和构造
借助丰富的 DSL 函数,用户可以选择多种录入风格。
### 向量
* 可变参数函数:`listVectorOf(x, y, z)`
* n 维零向量:`listVectorOfZero(n)`
* 2 维向量:`vector2DOf(x, y)`
* 2 维零向量:`vector2DOfZero()`
* 从数字可遍历集 `Itorable` 或数字数组 `Array` 构造:
```kotlin
list .toListVector()
array.toListVector()
```
### 矩阵
构造矩阵的方式更多:
* 使用函数构造:
```kotlin
// map := (行号, 列号) → 元素值
listMatrixOf(row, column, map)
arrayMatrixOf(row, column, map)
```
* 折叠数组或列表:
```kotlin
list foldToRowOf 3 //数字列表折叠到 3 列的不可变矩阵
list foldToRows 3 //数字列表折叠到 3 行的不可变矩阵
list foldToColumnOf 3 //数字列表折叠到 3 行的不可变矩阵
list foldToCloumns 3 //数字列表折叠到 3 列的不可变矩阵
array foldToRowOf 3 //数字数组折叠到 3 列的值可变矩阵
array foldToRows 3 //数字数组折叠到 3 行的值可变矩阵
array foldToColumnOf 3 //数字数组折叠到 3 行的值可变矩阵
array foldToCloumns 3 //数字数组折叠到 3 列的值可变矩阵
```
* 使用函数把值可变矩阵初始化为零矩阵、单位矩阵或数值矩阵:
```kotlin
arrayMatrixOfZero(n) // 初始化 n 阶值可变矩阵为零矩阵
arrayMatrixOfUnit(n) // 初始化 n 阶值可变矩阵为单位矩阵
2.5 toArrayMatrix 5 // 初始化等价于 2.5 的 5 阶值可变数值矩阵
```
* 从向量构造矩阵:
```kotlin
vector.toListMatrix() // 将列向量转化为一列的不可变矩阵
vector.toListMatrixRow() // 将行向量转化为一行的不可变矩阵
vector.toArrayMatrix() // 将列向量转化为一列的值可变矩阵
vector.toArrayMatrixRow() // 将行向量转化为一行的值可变矩阵
```
* 列出矩阵元素:
```kotlin
// 按行构造不可变矩阵
matrix {
row(0, 0, 1)
row(0, 1, 0)
row(1, 0, 0)
}
// 按列构造值可变矩阵
matrix(ValueMutable) {
column(0, 0, 1)
column(0, 1, 0)
column(1, 0, 0)
}
```
* 元素要么按行列举,要么按列列举,混合行列将在运行时产生错误。
* 使用 “数学家” 缩写:
```kotlin
val a = O(3) // 3 x 3 零矩阵
val b = O(5, 3) // 5 x 3 零矩阵
val c = I(2) // 2 阶单位阵
val d = N(6, .2) // 等价于 0.2 的 6 阶数值阵
```
* 这些缩写本质是只用静态方法的单例类,由于名字非常短,很可能与其他同名同型的东西混淆,使用时应谨慎。
### 方程组
我们只为方程组提供了一种构造工具:
```kotlin
equations { // 今有雉兔同笼,
this[1, 1] = 35 // 上有三十五头,
this[2, 4] = 94 // 下有九十四足,
}.solve() // 问雉兔各几何?
```
由于所谓方程组只是方程的集合,因此可以方便地使用 `flatten()` 来合并方程组。
```kotlin
val set = listOf(set1, set2, set3).flatten().toSet()
```
由于集合 `Set` 的特性,在 `toSet()` 过程中,完全相同的方程会被消除掉。
## 运算
本线性代数库以扩展方法形式支持极其丰富的线性代数运算,未来还将越来越多。因此在此不一一列举,使用 IDEA 和 Kotlin 语言的用户请开启代码补全以查阅,或查看本工程的单元测试代码,那里提供了一些示例。
使用 Java 的用户请注意:
* 访问字段被转化为了 getXXX() 函数
* 设置字段被转化为里 setXXX(value) 函数
* 扩展函数被转化为了静态函数,可直接打开类调用
## 显示
库同时提供了美观的可视化功能。
* 矩阵
```kotlin
matrix {
row(1, 2, 3)
row(3, 2, 1)
}
```
```shell
2 x 3 Matrix
┌ 1 2 3 ┐
└ 3 2 1 ┘
```
* 向量
```kotlin
listVectorOf(23, 12)
```
```shell
2d vector
┌ 23 ┐
└ 12 ┘
```
* 方程组
```kotlin
equations {
this[1, 1] = 35
this[2, 4] = 94
}
```
```shell
2 members equation set
┌ 1 1 ┐ | ┌ 35 ┐
└ 2 4 ┘ | └ 94 ┘
```