matrix4cj 库

介绍

matrix4cj 是一个基本线性代数包,用于构造和操作真实密集矩阵的库。

1 构造和操作真实密集矩阵

需求来源:三方库 用户:仓颉开发者 场景:构造和操作真实密集矩阵 目标:实现构造和操作真实密集矩阵 验收标准:正确构造和操作真实密集矩阵

1.1 主要接口
/**
 * 矩阵存储顺序
 */
public enum StorageOrder {
    /** Column-major order */
    ColumnMajor |

    /** Row-major order */
    RowMajor
}

/**
 * 运算轴向
 */
public enum Axis {
    /** Row axis */
    Row |

    /** Column axis */
    Column
}

public class Matrix {

    /*
     * 矩阵行数
     */
    public prop rowNum: Int64

    /*
     * 矩阵列数
     */
    public prop colNum: Int64

    /*
     * 矩阵存储顺序
     */
    public prop storageOrder: StorageOrder

    /*
     * 内部存储的二维数组
     */
    internal prop data: Array<Float64>

    /*
     * 使用默认值value构造一个 m 乘 n 的常量矩阵,m,n 非法值时抛 NegativeArraySizeException
     * 参数 m - 行数
     * 参数 n - 列数
     * 参数 value - 用这个值填充矩阵
     */
    public init(m: Int64, n: Int64, value!: Float64 = 0.0)

    /*
     * 使用给定二维数组按照给定内存顺序构造矩阵,数组不符合矩阵格式抛 IllegalArgumentException
     * 参数 data - 二维 Float64 数组
     * 参数 order - 矩阵存储顺序 (默认 RowMajor) 
     */
    public init(data: Array<Array<Float64>>, order!: StorageOrder = StorageOrder.RowMajor)

    /*
     * 使用给定一维数组按照给定内存顺序构造矩阵,数组不符合矩阵格式抛 IllegalArgumentException
     * 参数 data - 一维 Float64 数组
     * 参数 rowNum - 矩阵行数
     * 参数 colNum - 矩阵列数 (默认 -1,将会通过rowNum计算)
     * 参数 order - 矩阵存储顺序 (默认 RowMajor)
     */
    public init(data: Array<Float64>, rowNum!: Int64, colNum!: Int64 = -1, order!: StorageOrder = StorageOrder.RowMajor)

    /*
     * 使用给定一维数组按照给定内存顺序 *不经过clone* 构造矩阵, 主要被用来Lib内部构造矩阵使用,数组不符合矩阵格式抛 IllegalArgumentException
     * 参数 data - 一维 Float64 数组
     * 参数 rowNum - 矩阵行数
     * 参数 colNum - 矩阵列数 (默认 -1,将会通过rowNum计算)
     * 参数 order - 矩阵存储顺序 (默认 RowMajor)
     * 参数 withoutClone - 不克隆数据(仅用来区分重载,这个变量不会在函数内被使用)
     */
    internal init(data: Array<Float64>, rowNum: Int64, colNum: Int64, order: StorageOrder, withoutClone!: Bool)

    /*
     * Matrix的拷贝构造函数
     * 参数 other - 其他矩阵
     * 返回值 Matrix - 复制的新矩阵
     */
    public init(other: Matrix)

    /*
     * 复制矩阵
     * 返回值 Matrix - 复制的新矩阵
     */
    public func clone(): Matrix

    /*
     * 获取内部一维数组的打包副本
     * 参数 order - 矩阵存储顺序 (默认 RowMajor)
     * 返回值 Array<Float64> - 内部一维数组
     */
    public func getOneDimensionalArray(order!: StorageOrder = StorageOrder.RowMajor): Array<Float64>

    /*
     * 比较两个矩阵是否相等
     * 参数 other - 其他矩阵
     * 返回值 Bool - 是否相等
     */
    public operator func == (other: Matrix): Bool

    /*
     * 比较两个矩阵是否不相等
     * 参数 other - 其他矩阵
     * 返回值 Bool - 是否不相等
     */
    public operator func != (other: Matrix): Bool

    /*
     * 获取单个元素,元素不存在抛 IndexOutOfBoundsException
     * 参数 row - 行索引
     * 参数 col - 列索引
     * 返回值 Float64 - 元素值
     */
    public func get(row: Int64, col: Int64): Float64
    public operator func [] (row: Int64, col: Int64): Float64

    /*
     * 设置单一元素, 索引对应的元素不存在时抛 IndexOutOfBoundsException
     * 参数 row - 行索引
     * 参数 col - 列索引
     * 参数 value - 元素值
     */
    public func set(row: Int64, col: Int64, value: Float64): Unit
    public operator func [] (row: Int64, col: Int64, value!: Float64): Unit

    /*
     * 获取指定行的元素数组的副本,行索引不存在抛 IndexOutOfBoundsException
     * 参数 row - 行索引
     * 参数 colRange - 列索引范围,步长为1
     * 返回值 Array<Float64> - 元素数组
     */
    public operator func [] (row: Int64, colRange: Range<Int64>): Array<Float64>

    /*
     * 设置指定行的元素数组,行索引不存在抛 IndexOutOfBoundsException
     * 参数 row - 行索引
     * 参数 colRange - 列索引范围,步长为1
     * 参数 value - 元素数组
     */
    public operator func [] (row: Int64, colRange: Range<Int64>, value!: Array<Float64>): Unit

    /*
     * 获取指定列的元素数组的副本,列索引不存在抛 IndexOutOfBoundsException
     * 参数 rowRange - 行索引范围,步长为1
     * 参数 col - 列索引
     * 返回值 Array<Float64> - 元素数组
     */
    public operator func [] (rowRange: Range<Int64>, col: Int64): Array<Float64>

    /*
     * 设置指定列的元素数组,列索引不存在抛 IndexOutOfBoundsException
     * 参数 rowRange - 行索引范围,步长为1
     * 参数 col - 列索引
     * 参数 value - 元素数组
     */
    public operator func [] (rowRange: Range<Int64>, col: Int64, value!: Array<Float64>): Unit

    /*
     * 获取子矩阵的副本
     * 参数 rowRange - 行索引范围,步长为1
     * 参数 colRange - 列索引范围,步长为1
     * 返回值 Matrix - 子矩阵
     */
    public operator func [] (rowRange: Range<Int64>, colRange: Range<Int64>): Matrix

    /*
     * 设置子矩阵,行列索引大于等于当前矩阵的行列值抛 IndexOutOfBoundsException
     * 参数 rowRange - 行索引范围,步长为1
     * 参数 colRange - 列索引范围,步长为1
     * 参数 value - 子矩阵
     */
    public operator func [] (rowRange: Range<Int64>, colRange: Range<Int64>, value!: Matrix): Unit

    /*
     * 挑选指定行的副本构成新的子矩阵
     * 参数 rowIndices - 行索引数组
     * 参数 colRange - 列索引范围,步长为1
     * 返回值 Matrix - 子矩阵
     * 示例:可以使用本方法将矩阵的偶数行挑选出来构成新的子矩阵
     */
    public operator func [] (rowIndices: Array<Int64>, colRange: Range<Int64>): Matrix

    /*
     * 将指定行的值赋值为给定矩阵的对应行
     * 参数 rowIndices - 行索引数组
     * 参数 colRange - 列索引范围,步长为1
     * 参数 value - 子矩阵
     * 示例:可以使用本方法批量修改矩阵的不同行的值
     * 注意:行索引数组的长度必须与 value 矩阵的行数相同
     */
    public operator func [] (rowIndices: Array<Int64>, colRange: Range<Int64>, value!: Matrix): Unit

    /*
     * 挑选指定列的副本构成新的子矩阵
     * 参数 rowRange - 行索引范围,步长为1
     * 参数 colIndices - 列索引数组
     * 返回值 Matrix - 子矩阵
     * 示例:可以使用本方法将矩阵的偶数列挑选出来构成新的子矩阵
     */
    public operator func [] (rowRange: Range<Int64>, colIndices: Array<Int64>): Matrix

    /*
     * 将指定列的值赋值为给定矩阵的对应列
     * 参数 rowRange - 行索引范围,步长为1
     * 参数 colIndices - 列索引数组
     * 参数 value - 子矩阵
     * 示例:可以使用本方法批量修改矩阵的不同行的值
     * 注意:行索引范围的长度必须与 value 矩阵的行数相同
     */
    public operator func [] (rowRange: Range<Int64>, colIndices: Array<Int64>, value!: Matrix): Unit

    /*
     * 挑选指定行和列的副本构成新的子矩阵
     * 参数 rowIndices - 行索引数组
     * 参数 colIndices - 列索引数组
     * 返回值 Matrix - 子矩阵
     * 示例:可以使用本方法将矩阵的偶数行和偶数列挑选出来构成新的子矩阵
     */
    public operator func [] (rowIndices: Array<Int64>, colIndices: Array<Int64>): Matrix

    /*
     * 将指定行和列的值赋值为给定矩阵的对应行和列
     * 参数 rowIndices - 行索引数组
     * 参数 colIndices - 列索引数组
     * 参数 value - 子矩阵
     * 示例:可以使用本方法批量修改矩阵的不同行和列的值
     * 注意:行索引数组的长度必须与 value 矩阵的行数相同,列索引数组的长度必须与 value 矩阵的列数相同
     */
    public operator func [] (rowIndices: Array<Int64>, colIndices: Array<Int64>, value!: Matrix): Unit

    /*
     * 将两个矩阵沿指定轴连接
     * 参数 other - 要连接的矩阵
     * 参数 axis - 连接轴,Row 表示行连接,Column 表示列连接
     * 返回值 Matrix - 连接后的矩阵
     * 注意:连接的两个矩阵在非连接轴上的维度必须相同
     */
    public func concat(other: Matrix, axis!: Axis): Matrix

    /*
     * 矩阵转置
     * 参数 fast - 当fast为true时,仅仅修改矩阵的存储顺序,而不实际转置数据
     *             当fast为false时,实际发生内存的拷贝
     * 返回值 Matrix - 运算后矩阵
     */
    public func transpose(fast!: Bool = false): Matrix

    /*
     * 矩阵的快速转置
     * 仅仅修改矩阵的存储顺序,而不实际发生内存的拷贝
     * 返回值 Matrix - 运算后矩阵
     */
    public prop T: Matrix

    /*
     * 矩阵的逆或伪逆
     * 如果矩阵是方阵,则返回逆矩阵,否则返回伪逆矩阵
     * 如果矩阵是奇异矩阵,则抛 IllegalArgumentException 异常
     * 返回值 Matrix - 逆矩阵或伪逆矩阵
     */
    public func inverse(): Matrix
    public prop I: Matrix

    /*
     * 矩阵取反
     * 返回值 Matrix - 运算后矩阵
     */
    public operator func - (): Matrix

    /*
     * 矩阵加法运算
     * 不符合矩阵加法规则抛 IllegalArgumentException
     * 参数 other - 要相加的矩阵
     * 返回值 Matrix - 运算后矩阵
     */
    public operator func + (other: Matrix): Matrix

    /*
     * 矩阵加法运算
     * 参数 value - 要相加的标量
     * 返回值 Matrix - 运算后矩阵
     */
    public operator func + (value: Float64): Matrix

    /*
     * 矩阵减法运算
     * 不符合矩阵减法规则抛 IllegalArgumentException
     * 参数 other - 要相减的矩阵
     * 返回值 Matrix - 运算后矩阵
     */
    public operator func - (other: Matrix): Matrix

    /*
     * 矩阵减法运算
     * 参数 value - 要相减的标量
     * 返回值 Matrix - 运算后矩阵
     */
    public operator func - (value: Float64): Matrix

    /*
     * 矩阵乘法运算
     * 参数 s: 要相乘的标量
     * 返回值 Matrix - 运算后矩阵
     */
    public operator func * (s: Float64): Matrix

    /*
     * 矩阵乘法运算
     * 不符合矩阵乘法规则抛 IllegalArgumentException
     * 参数 other - 要相乘的矩阵
     * 返回值 Matrix - 运算后矩阵
     */
    public operator func * (other: Matrix): Matrix
    public func matMul(other: Matrix): Matrix

    /*
     * 获取给定大小的单位矩阵
     * 参数 rowNum - 矩阵行数
     * 参数 colNum - 矩阵列数
     * 返回值 Matrix - rowNum * colNum 的单位矩阵
     */
    public static func Identity(rowNum: Int64, colNum: Int64): Matrix

    /*
     * 获取单位矩阵
     * 返回值 Matrix - 单位矩阵
     */
    public func identity(): Matrix

    /*
     * 用随机元素生成矩阵
     * 参数 rowNum - 矩阵行数
     * 参数 colNum - 矩阵列数
     * 返回值 Matrix - rowNum * colNum 的随机数矩阵
     */
    public static func Random(rowNum: Int64, colNum: Int64): Matrix

    /*
     * 用随机元素生成矩阵
     * 返回值 Matrix - m * n 的随机数矩阵
     */
    public func random(): Matrix

    /*
     * 矩阵L1范数计算
     * 返回值 Float64 - 运算值
     */
    public func normL1(): Float64

    /*
     * 矩阵L2范数计算
     * 返回值 Float64 - 运算值
     */
    public func normL2(): Float64 

    /*
     * 矩阵L∞范数计算
     * 返回值 Float64 - 运算值
     */
    public func normInf(): Float64

    /*
     * 矩阵F范数计算
     * 返回值 Float64 - 运算值
     */
    public func normFrobenius(): Float64

    /*
     * 矩阵LU分解
     * 返回值 LUDecomposition - LU分解后的LUDecomposition
     */
    public func lu(): LUDecomposition

    /*
     * 矩阵QR分解
     * 返回值 QRDecomposition - QR分解后的QRDecomposition
     */
    public func qr(): QRDecomposition

    /*
     * 矩阵乔里斯基分解
     * 返回值 CholeskyDecomposition - 乔里斯基分解后的CholeskyDecomposition
     */
    public func chol(): CholeskyDecomposition

    /*
     * 矩阵奇异值分解
     * 返回值 SingularValueDecomposition - 奇异值分解后的SingularValueDecomposition
     */
    public func svd(): SingularValueDecomposition

    /*
     * 矩阵特征值分解
     * 返回值 EigenvalueDecomposition - 特征值分解后的EigenvalueDecomposition
     */
    public func eig(): EigenvalueDecomposition

    /*
     * 求解 A*X = B ,A,B矩阵不符合矩阵计算规则抛 IllegalArgumentException
     * 参数 B - 矩阵
     * 返回值 Matrix - X 矩阵
     */
    public func solve(B: Matrix): Matrix

    /*
     * 求解 X*A = B,也就是 A'*X' = B',A,B矩阵不符合矩阵计算规则抛 IllegalArgumentException
     * 参数 B - 矩阵
     * 返回值 Matrix - X 矩阵
     */
    public func solveTranspose(B: Matrix): Matrix

    /*
     * 矩阵行列式
     * 返回值 Float64 - 矩阵行列式的值
     */
    public func det(): Float64

    /*
     * 矩阵的秩
     * 返回值 Int64 - 矩阵的秩
     */
    public func rank(): Int64

    /*
     * 矩阵条件数
     * 返回值 Float64 - 矩阵条件数
     */
    public func cond(): Float64

    /*
     * 矩阵的迹
     * 返回值 Float64 - 矩阵的迹
     */
    public func trace(): Float64

    /*
     * 获取矩阵对象的elementWise包装器
     * 包装器中支持矩阵的按元素运算
     * 返回值 ElementWiseWapper<Matrix> - 矩阵的elementWise包装器
     */
    public func elementWise(): ElementWiseWapper<Matrix>

    /*
     * 矩阵的按元素乘法
     * 参数 other - 要相乘的矩阵的elementWise包装器
     * 返回值 Matrix - 运算后矩阵
     */
    public operator func *(other: ElementWiseWapper<Matrix>): Matrix 

    /*
     * 矩阵的按元素除法
     * 参数 other - 要相除的矩阵的elementWise包装器
     * 返回值 Matrix - 运算后矩阵
     */
    public operator func /(other: ElementWiseWapper<Matrix>): Matrix
}

public class Maths {
    /*
     * 计算 sqrt(a^2 + b^2)
     * 参数 a - 数字a
     * 参数 b - 数字a
     * 返回值 Float64 - 运算结果
     */
    public static func hypot(a: Float64, b: Float64): Float64
}

public class CholeskyDecomposition {
    /*
     * 构造 CholeskyDecomposition 实例
     * 参数 Arg - 矩阵
     */
    public init(Arg: Matrix)

    /*
     * 矩阵是否对称且正定
     * 返回值 Bool - 判断结果
     */
    public func isSPD(): Bool

    /*
     * 获取下三角矩阵
     * 返回值 Matrix - 下三角矩阵
     */
    public func getL(): Matrix

    /*
     * 求解 A*X = B,A 为当前矩阵, B 为入参矩阵, A 要为对称正定矩阵,否则抛 Matrix4cjException 异常
     * 参数 B - 矩阵
     * 返回值 Matrix - X 矩阵
     */
    public func solve(B: Matrix): Matrix 
}

public class EigenvalueDecomposition {
    /*
     * 初始化矩阵
     * 参数 Arg - 矩阵
     */
    public init(Arg: Matrix)

    /*
     * 返回特征向量矩阵
     * 返回值 Matrix - 矩阵
     */
    public func getV(): Matrix

    /*
     * 返回特征值的实部
     * 返回值 Array<Float64>  - 实部值
     */
    public func getRealEigenvalues(): Array<Float64> 

    /*
     * 返回特征值的虚部
     * 返回值 Array<Float64>  - 虚部值
     */
    public func getImagEigenvalues(): Array<Float64>

    /*
     * 返回对角线特征值矩阵 D
     * 返回值 Matrix  - 矩阵
     */
    public func getD(): Matrix
}

public class LUDecomposition {
    /*
     * 初始化矩阵
     * 参数 Arg - 矩阵
     */
    public init(A: Matrix)

    /*
     * 判断是否为非奇异矩阵
     * 返回值 Bool  - 判断结果
     */
    public func isNonsingular(): Bool

    /*
     * 获取下三角矩阵
     * 返回值 Matrix  - 矩阵
     */
    public func getL(): Matrix

    /*
     * 获取上三角矩阵
     * 返回值 Matrix  - 矩阵
     */
    public func getU(): Matrix

    /*
     * 获取 Int64 类型的主元序列
     * 返回值 Array<Int64>  - 向量值
     */
    public func getPivot(): Array<Int64>

    /*
     * 获取 Float64 类型的主元序列
     * 返回值 Array<Float64>  - 向量值
     */
    public func getDoublePivot(): Array<Float64>

    /*
     * 返回该矩阵的行列式的值
     * 返回值 Float64  - 该矩阵的行列式的值
     */
    public func det(): Float64

    /*
     * 求解 A*X = B,A 为当前矩阵, B 为入参矩阵, A 不是非奇异矩阵抛 Matrix4cjException
     * 参数 B - 矩阵
     * 返回值 Matrix - X 矩阵
     */
    public func solve(B: Matrix): Matrix
}

public class QRDecomposition {
    /*
     * 初始化矩阵
     * 参数 Arg - 矩阵
     */
    public init(A: Matrix) {

    /*
     * 判断一个矩阵是否是满秩
     * 返回值 Bool  - 判断结果
     */
    public func isFullRank(): Bool

    /*
     * 获取 Hessenberg 矩阵
     * 返回值 Matrix  - 矩阵
     */
    public func getH(): Matrix

    /*
     * 获取上三角矩阵
     * 返回值 Matrix  - 矩阵
     */
    public func getR(): Matrix

    /*
     * 返回正交矩阵
     * 返回值 Matrix  - 矩阵
     */
    public func getQ(): Matrix

    /*
     * 求解 A*X = B,A 为当前矩阵, B 为入参矩阵, A 不是满秩矩阵抛 Matrix4cjException
     * 参数 B - 矩阵
     * 返回值 Matrix - X 矩阵
     */
    public func solve(B: Matrix): Matrix
}

public class SingularValueDecomposition {
    /*
     * 初始化矩阵
     * 参数 Arg - 矩阵
     */
    public init(Arg: Matrix)

    /*
     * 返回左奇异矢量
     * 返回值 Matrix  - 矩阵
     */
    public func getU(): Matrix 

    /*
     * 返回右奇异矢量
     * 返回值 Matrix  - 矩阵
     */
    public func getV(): Matrix

    /*
     * 返回奇异值的一维数组
     * 返回值 Array<Float64> - 数组
     */
    public func getSingularValues(): Array<Float64>

    /*
     * 返回奇异值的对角矩阵
     * 返回值 Matrix - 矩阵
     */
    public func getDiagonalValues(): Matrix

    /*
     * 矩阵L2范数计算
     * 返回值 Float64 - 运算值
     */
    public func norm2(): Float64

    /*
     * 矩阵的矩阵条件数
     * 返回值 Float64 - 运算后值
     */
    public func cond(): Float64

    /*
     * 矩阵的秩
     * 返回值 Int64 - 运算后值
     */
    public func rank(): Int64
}