markbaker/matrix

PHP矩阵操作类

安装: 179,944,689

依赖者: 39

建议者: 0

安全: 0

星标: 1,430

关注者: 8

分支: 13

开放问题: 4

3.0.1 2022-12-02 22:17 UTC

README

PHP矩阵处理类

Build Status Total Downloads Latest Stable Version License

Matrix Transform

矩阵变换

此库目前提供以下操作:

  • 加法
  • 直接和
  • 减法
  • 乘法
  • 除法(使用[A].[B]-1)
    • 除以
    • 分配到

包括以下函数:

  • 伴随矩阵

  • 反对角线

  • 余子式

  • 行列式

  • 对角线

  • 单位矩阵

  • 逆矩阵

  • 小矩阵

  • 转置

  • 求解

    给定矩阵A和B,计算X,使得A.X = B

和以下类的操作:

  • 分解
    • LU分解(部分行置换),

      使得[P].[A] = [L].[U]并且[A] = [P]^|.[L].[U]

    • QR分解

      使得[A] = [Q].[R]

待办事项

  • power()函数
  • 分解
    • Cholesky分解
    • 特征值分解
      • 特征值
      • 特征向量

安装

composer require markbaker/matrix:^3.0

重要BC注意

如果您之前一直使用此库(markbaker/matrix)的函数和操作的程序调用,那么从版本3.0开始,您应使用MarkBaker/PHPMatrixFunctions(在Packagist上作为markbaker/matrix-functions提供)代替。

您需要在您的composer.json文件中将markbaker/matrix替换为新库,但除此之外,命名空间或您过去调用矩阵函数的方式不应有任何差异,因此不需要实际的代码更改。

composer require markbaker/matrix-functions:^1.0

您不应在您的composer.json中引用此库(markbaker/matrix),Composer会为您处理。

使用方法

要创建一个新的Matrix对象,请将数组作为构造函数参数提供

$grid = [
    [16,  3,  2, 13],
    [ 5, 10, 11,  8],
    [ 9,  6,  7, 12],
    [ 4, 15, 14,  1],
];

$matrix = new Matrix\Matrix($grid);

Builder类提供了创建特定矩阵的辅助方法,特别是指定大小的单位矩阵;或者具有指定维度的矩阵,每个单元格包含一个设定值。

$matrix = Matrix\Builder::createFilledMatrix(1, 5, 3);

将创建一个5行3列的矩阵,每个单元格填充了1;而

$matrix = Matrix\Builder::createIdentityMatrix(3);

将创建一个3x3的单位矩阵。

Matrix对象是不可变的:每次您调用一个方法或将网格传递给返回矩阵值的函数时,都会返回一个新的Matrix对象,而原始对象将保持不变。这也允许您像使用流畅接口一样链式调用多个方法(只要它们是会返回Matrix结果的函数)。

执行数学运算

要使用矩阵执行数学运算,您可以调用矩阵值上的相应方法,传递其他值作为参数

$matrix1 = new Matrix\Matrix([
    [2, 7, 6],
    [9, 5, 1],
    [4, 3, 8],
]);
$matrix2 = new Matrix\Matrix([
    [1, 2, 3],
    [4, 5, 6],
    [7, 8, 9],
]);

var_dump($matrix1->multiply($matrix2)->toArray());

或将所有值传递给相应的方法

$matrix1 = new Matrix\Matrix([
    [2, 7, 6],
    [9, 5, 1],
    [4, 3, 8],
]);
$matrix2 = new Matrix\Matrix([
    [1, 2, 3],
    [4, 5, 6],
    [7, 8, 9],
]);

var_dump(Matrix\Operations::multiply($matrix1, $matrix2)->toArray());

您可以将参数作为Matrix对象或数组传递。

如果您要对多个值执行相同的操作(例如,添加三个或更多矩阵),则可以将多个参数传递给任何操作。

使用函数

在调用任何矩阵值的可用函数时,您可以调用Matrix对象的相关方法

$grid = [
    [16,  3,  2, 13],
    [ 5, 10, 11,  8],
    [ 9,  6,  7, 12],
    [ 4, 15, 14,  1],
];

$matrix = new Matrix\Matrix($grid);

echo $matrix->trace();

或调用静态方法,将Matrix对象或数组作为参数传递

$grid = [
    [16,  3,  2, 13],
    [ 5, 10, 11,  8],
    [ 9,  6,  7, 12],
    [ 4, 15, 14,  1],
];

$matrix = new Matrix\Matrix($grid);
echo Matrix\Functions::trace($matrix);
$grid = [
    [16,  3,  2, 13],
    [ 5, 10, 11,  8],
    [ 9,  6,  7, 12],
    [ 4, 15, 14,  1],
];

echo Matrix\Functions::trace($grid);

分解

此库还提供了矩阵分解的类。您可以通过以下方式访问这些类

$grid = [
    [1, 2],
    [3, 4],
];

$matrix = new Matrix\Matrix($grid);

$decomposition = new Matrix\Decomposition\QR($matrix);
$Q = $decomposition->getQ();
$R = $decomposition->getR();

或者使用分解工厂,并确定您想使用的分解形式

$grid = [
    [1, 2],
    [3, 4],
];

$matrix = new Matrix\Matrix($grid);

$decomposition = Matrix\Decomposition\Decomposition::decomposition(Matrix\Decomposition\Decomposition::QR, $matrix);
$Q = $decomposition->getQ();
$R = $decomposition->getR();