mcordingley/线性代数

PHP 的矩阵数学。

3.0.0 2022-08-27 19:24 UTC

This package is auto-updated.

Last update: 2024-09-28 00:00:41 UTC


README

Build Status Code Climate Code Coverage

PHP 的独立线性代数库

安装

composer require mcordingley/LinearAlgebra

或者,将其包含在您的 composer.json 中,然后更新

"mcordingley/linearalgebra": "^3.0.0"

如果 Composer 对您来说不是选项,请克隆此存储库并运行 build-phar.php 以生成一个 Phar 归档,您可以将它包含到项目中。PHP 将根据需要自动加载存档中的类。

用法

矩阵

首先使用 use 语句为类

use MCordingley\LinearAlgebra\Matrix;

然后,创建矩阵类的新实例

$matrix = new Matrix([
    [0, 1, 2],
    [3, 4, 5],
    [6, 7, 8]
]);

您还可以使用 identity 工厂函数生成单位矩阵

$threeByThreeIdentityMatrix = Matrix::identity(3);

使用矩阵实例,您可以使用您想要获取的行和列的零基索引通过 get 获取单个元素

$element = $matrix->get($row, $column);

您还可以使用 getRowCount()getColumnCount() 获取矩阵的大小

$rows = $matrix->getRowCount();
$columns = $matrix->getColumnCount();

您还可以将矩阵与标量值和其他矩阵进行加、减、乘运算。所有操作都返回一个新的 Matrix 对象,并不会修改底层矩阵

$addedScalar = $matrix->addScalar(3);
$addedMatrix = $matrix->addMatrix($anotherMatrix);
$subtractedScalar = $matrix->subtractScalar(2);
$subtractedMatrix = $matrix->subtractMatrix($anotherMatrix);
$multipliedByScalar = $matrix->multiplyScalar(4);
$multipliedByMatrix = $matrix->multiplyMatrix($anotherMatrix);

可以使用 equals 进行比较,以查看矩阵是否相等

if ($matrix1->equals($matrix2)) {
    // Equality for all!
}

除了这些基本操作之外,Matrix 类还提供了其他常见的矩阵操作

$matrix->inverse()
$matrix->adjugate()
$matrix->determinant()
$matrix->trace()
$matrix->transpose()

您可以通过调用 upper(bool)lower(bool) 获取上三角矩阵和下三角矩阵。唯一的参数告诉三角矩阵的主对角线是否应该设置为 1(true)或父矩阵的值(false)。

您还可以对矩阵运行映射操作

$squaredElements = $matrix->map(function($element, $row, $column, $matrix) {
    return $element * $element
});

可以使用 sliceColumns($offset, $length)sliceRows($offset, $length) 提取子矩阵。参数的语义与 PHP 的 array_slice 相同。

类似地,可以使用 spliceColumns($offset, $length, $replacement)spliceRows($offset, $length, $replacement) 创建具有特定行或列被删除或替换的新矩阵。与原生的 PHP array_splice 不同,这些操作不会就地修改矩阵,而是返回被删除的元素,并返回一个新的矩阵,其中应用了剪切操作。

如果您需要组合矩阵,可以通过调用连接方法来完成

$m1 = new Matrix([
  [1,2,3],
  [4,5,6],
]);

$m2 = new Matrix([
  [7],
  [8],
]);

$m3 = new Matrix([[3,2,1]]);

$m4 = $m1->concatenateRight($m2);
//  [
//      [1,2,3,7],
//      [4,5,6,8],
//  ]

$m5 = $m1->concatenateBottom($m3);
// [
//     [1,2,3],
//     [4,5,6],
//     [3,2,1],
// ]

LU 和 LUP 分解方法作为单独的类提供,并且分别公开了 lower()upper() 以分别表示分解的 L 和 U 部分。LUP 分解还公开了 permutationMatrixpermutationArray 以获取分解的 P 组件,以及 parity 以返回执行的完全转置的总数。

向量

Matrix 类似,将类导入到当前命名空间中

use MCordingley\LinearAlgebra\Vector;

由于 VectorMatrix 的特例,因此 Vector 继承自 Matrix。因此,Matrix 上可用的每个方法在 Vector 上也可用。Vector 还公开了特定于向量操作的其他方法。

创建 Vector 与创建 Matrix 的区别仅在于构造函数接受一个标量数组,而不是数组数组

$vector = new Vector([1, 2, 3, 4]);

请注意,Vector 实例都是行向量。如果您需要列向量,请使用 transpose() 将向量转换为具有单个列的 Matrix

如果您需要将 Matrix 转换为 Vector,请调用工厂方法 fromMatrix()

$vector = Vector::fromMatrix($matrix);

toArray() 方法被重写以返回一个标量数组,以反映构造函数的工作方式。它相当于在 Matrix 实例上调用 $matrix->toArray()[0]

getSize() 提供了 getColumnCount() 的别名。 sum() 将返回 Vector 元素的和,而 dotProduct($otherVector) 将返回 $vector$otherVector 的逐对乘积之和,也可以作为 innerProduct($otherVector) 使用。 outerProduct($otherVector) 将返回表示两个向量外积的新 MatrixcrossProduct($otherVector) 也可用。向量可以使用 normalize() 进行归一化。它们还可以使用 project($otherVector) 投影到其他向量上。两个向量之间也可以使用 euclideanDistance($otherVector) 计算欧几里得距离。

对于向量大小的度量,提供了 l1Norm()l2Norm()maxNorm(),其中 length()l2Norm() 的别名。

在函数文档中提供了相关维基百科文章的链接,以提供更多详细信息。

变更日志

  • 3.0.0

    • 更新到 PHP 8 以开始利用新功能。
    • 添加了一些由 PHP 8 启用的先前缺失的类型断言。
    • euclideanDistance 添加到 Vector
  • 2.2.0

    • Matrix 上实现 ArrayAccess 接口以返回行向量。
    • Vector 上实现 ArrayAccess 接口以返回标量。
    • Vector 添加 addVector()subtractVector()
    • magnitude() 作为 length() 的别名添加到 Vector
  • 2.1.1

    • 修复了与 map() 相关的继承问题。
  • 2.1.0

    • Vector 作为 Matrix 的子类添加。感谢 battlecook 的贡献。
  • 2.0.0

    • 停止支持 PHP 5.x。
    • 引入严格的标量类型提示。
    • 删除已弃用的函数和属性。
    • 使用 finalprivate 关键字收紧接口。
    • diagonal() 现在返回一个完整的矩阵,而不是一个向量。
    • adjoint() 重命名为 adjugate() 以提高清晰度。
    • 添加 entrywise() 来计算 Hadamard 积。
    • 添加 upper()lower()
    • 添加 sliceColumns()sliceRows()
    • 添加 spliceColumns()spliceRows()
    • LULUP 分解作为类添加。
  • 1.3.2

    • 弃用 __toString() 魔法方法。
    • 弃用 isSymmetric()
  • 1.3.1

    • 弃用 ArrayAccess 接口的用法。
    • 进行更多内部代码风格修复。
  • 1.3.0

    • 修复了 concatenateRight()concatenateBottom() 名称中的拼写错误。
    • 移除生成的 Phar 文件。需要它的用户应使用 build-phar.php 脚本生成一个。
    • 重构 LUDecomposition 以使其构造函数不那么笨拙。
    • add() 分解为 addMatrix()addScalar()。弃用 add()
    • subtract() 分解为 subtractMatrix()subtractScalar()。弃用 subtract()
    • multiply() 分解为 multiplyMatrix()multiplyScalar()。弃用 multiply()
    • 添加 getRowCount()getColumnCount() 访问器。
    • 弃用 rowscolumns 属性。
  • 1.2.0

    • 添加 concatenateBottom($other)
    • 添加 concatencateRight($other)
  • 1.1.0

    • 添加 diagonal()
  • 1.0.0

    • 切换到 PSR-4 从 PSR-0。
    • isSymmetric() 公开。
    • 重新排列 Matrix.php 中的源代码以使其更具可读性和符合 PSR。
  • 0.9.1

    • 修复了 Cholesky 分解和逆的几个错误。
  • 0.9.0

    • 将版本提升到表示其接近最终形式。
    • 合并了更快 inverse 计算的 PR。
    • Vector 类说再见。
    • eq 重命名为 equals
    • 移除了set函数,因此实例化的对象是不可变的。
  • 0.3.0

    • 添加了identity工厂函数
    • 对于适用的矩阵,使用Cholesky分解来加速矩阵求逆
    • 添加了eq函数来测试矩阵的相等性
    • 实现了ArrayAccess接口
  • 0.2.0

    • 创建了Vector类型
    • 命名空间\MCordingley现在为\mcordingley
    • 返回新Matrix的矩阵函数现在返回调用类的新实例
  • 0.1.0

    • 创建了Matrix类型
    • 标量加法
    • 标量减法
    • 标量乘法
    • 矩阵加法
    • 矩阵减法
    • 矩阵乘法
    • 求逆
    • 伴随矩阵
    • 行列式
    • 转置
    • 子矩阵
    • 映射