mcordingley / 线性代数
PHP 的矩阵数学。
Requires
- php: ^8.0.0
Requires (Dev)
- phpunit/phpunit: ^9.5.0
README
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 分解还公开了 permutationMatrix 和 permutationArray 以获取分解的 P 组件,以及 parity 以返回执行的完全转置的总数。
向量
与 Matrix 类似,将类导入到当前命名空间中
use MCordingley\LinearAlgebra\Vector;
由于 Vector 是 Matrix 的特例,因此 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) 将返回表示两个向量外积的新 Matrix。 crossProduct($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。
- 引入严格的标量类型提示。
- 删除已弃用的函数和属性。
- 使用
final和private关键字收紧接口。 diagonal()现在返回一个完整的矩阵,而不是一个向量。- 将
adjoint()重命名为adjugate()以提高清晰度。 - 添加
entrywise()来计算 Hadamard 积。 - 添加
upper()和lower()。 - 添加
sliceColumns()和sliceRows()。 - 添加
spliceColumns()和spliceRows()。 - 将
LU和LUP分解作为类添加。
-
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()访问器。 - 弃用
rows和columns属性。
- 修复了
-
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类型
- 标量加法
- 标量减法
- 标量乘法
- 矩阵加法
- 矩阵减法
- 矩阵乘法
- 求逆
- 伴随矩阵
- 行列式
- 迹
- 转置
- 子矩阵
- 映射