chippyash/matrix

PHP 矩阵数据结构支持包

3.1.0 2018-07-04 22:58 UTC

This package is auto-updated.

Last update: 2024-09-22 22:17:37 UTC


README

质量保证

PHP 5.6 PHP 7 Build Status Test Coverage Code Climate

上面的徽章代表当前的开发分支。一般来说,除非测试、覆盖率和使用性都是可接受的,否则我不会向GitHub推送代码。在假期、需要为其他下游项目编写代码等短时间期间,这可能不成立。如果您需要稳定的代码,请使用标记版本。阅读“更多文档”和“安装”。

测试合同位于docs目录中。

请注意,该库对PHP 5.4 & 5.5的开发者支持已在3.0.0版本中取消。如果您需要支持PHP 5.4或5.5,请使用版本>=2,<3

是什么?

该库旨在提供矩阵转换功能,前提是

  • 所有内容都有测试用例
  • 它是PHP 5.4+

此库中提供的矩阵是通用的。它将矩阵视为数据结构,提供创建矩阵和执行转换的能力。

该库根据GNU GPL V3或更晚版本许可发布

为什么?

经过多年的等待,我终于有机会深入研究TDD作为一种严肃的方法。我一直对与数学相关的事物感兴趣,我认为尝试矩阵会让我重温那些早已忘记的知识,并带来一些乐趣。所以,这个库不仅关于矩阵,也关于使用TDD。采用TDD方法的好处是,当我(重新)学习矩阵时,我能够安全地进行重构。

何时

当前库涵盖了基本的矩阵操作。该库将涵盖大多数众所周知的通用矩阵转换和导数。

如果您需要更多,请提出建议,或者更好的是,将其分叉并提交拉取请求。

查看chippyash/Logical-Matrix进行逻辑矩阵操作

查看chippyash/Math-Matrix进行数学矩阵操作

查看chippyash/Strong-Type进行强类型支持,包括数字、有理数和复数类型

查看chippyash/Math-Type-Calculator进行上述强类型的算术运算

查看ZF4 Packages获取更多包

如何

编码基础

在PHP中,矩阵是数组的数组,即二维

  • [[]]

单个元素的矩阵可以通过提供一个单数组来快速创建

    use Chippyash/Matrix/Matrix;

    $mA = new Matrix([]);  //empty matrix
    $mA = new Matrix([[]]);  //empty matrix
    $mA = new Matrix([1]);  //single item matrix

与任何TDD应用程序一样,测试用例告诉您关于SUT的所有必要信息。请阅读它们!然而,对于那些缺乏耐心的人来说,以下要点是重要的

提供基本的Matrix类型

  • Matrix(array $source, bool $complete = false, bool $normalize= false, bool $normalizeDefault = null)

矩阵是从1开始的,而不是从0开始的

以下方法支持矩阵上的操作

  • toArray() : array - 返回矩阵数据作为数组
  • rows(): int - 矩阵中的行数(n)
  • columns(): int - 矩阵中的列数(m)
  • vertices(): int - 矩阵中的条目数(== n * m)
  • get(int $row >= 0, int $col >= 0): mixed - 如果 行或列中的任一为0,则当col == 0时返回行向量,当row == 0时返回列向量,否则返回由行和列指定的矩阵中的单个顶点。
  • is(string $attribute): boolean - 参见以下属性
  • test(string $attribute): boolean - is()方法的原始形式。您可以通过传递符合AttributeInterface的$attribute来测试库未提供的属性
  • transform(TransformationInterface $transformation, $extra = null): Matrix - 参见以下变换
  • setFormatter(FormatterInterface $formatter): fluent - 设置显示格式化器
  • display(): mixed - 以某种可显示的格式返回矩阵
  • equality(Matrix $mB, boolean $strict = true): boolean - 矩阵是否等于矩阵mB?
    • mA->rows() == mB->rows()
    • mA->columns() == mB->columns()
    • mA->get(i,j) ==[=] mB->get(i,j) 如果严格,则检查类型和值;否则仅检查值相等

矩阵是不可变的

对矩阵的任何操作都不会改变矩阵的内部结构。任何变换或类似操作都将返回另一个矩阵,保留原始矩阵不变。这允许进行算术稳定性。

但是,提供了一个可变性的特性,以便您可以根据特殊目的创建可变矩阵。

use Chippyash\Matrix\Traits\Mutability;

class MutableMatrix extends Matrix
{
    use Mutability;
}

这提供了一个set()方法

    /**
     * Set a matrix vertex, row or column vector
     * If row == 0 && col > 0, then set the column vector indicated by col
     * If col == 0 && row > 0, then set the row vector indicated by row
     * if row > 0 && col > 0, set the vertex
     * row == col == 0 is an error
     *
     * @param int $row
     * @param int $col
     * @param mixed|Matrix $data If setting a vector, supply the correct vector matrix
     *
     * @return Matrix
     
     * @throws VerticeOutOfBoundsException
     * @throws MatrixException
     */
    public function set($row, $col, $data);

矩阵具有属性

  • 属性始终返回布尔值。
  • 属性实现了Chippyash\Matrix\Interfaces\AttributeInterface
  • 您可以使用矩阵的is()方法来测试属性
    if ($mA->is('square')) {}
    //is the same as
    $attr = new Matrix/Attribute/IsSquare();
    if ($attr($mA) {}

支持的属性

  • IsColumnvector() - 矩阵是列向量吗?
  • IsComplete() - 矩阵是否具有所有条目?
  • IsDiagonal() - 是否只有主对角线上的条目非零?
  • IsEmpty() - 矩阵是空的吗?
  • IsRectangle() - 矩阵非空且非正方形吗?
  • IsRowVector() - 矩阵是行向量吗?
  • IsSquare() - 矩阵是方阵吗?即n == m & n >= 0
  • IsVector() - 矩阵是行向量或列向量吗?

矩阵可以变换

  • 变换始终返回一个Matrix
  • 原始矩阵保持不变
  • 您可以使用神奇的__invoke功能
  • 变换实现了Chippyash\Matrix\Interfaces\TransformationInterface
    $mB = $mA("Transpose");
    //same as :
    $comp = new Matrix\Transformation\Transpose;
    $mB = $comp($mA);
    //or
    $mB = $mA->transform($comp);

支持的变换

  • Circshift - 在矩阵中左右移动列(默认)围绕Y轴
  • Cofactor - 返回顶点的伴随矩阵
  • Colreduce - 返回减去1+列的矩阵
  • Colslice - 返回矩阵列的切片(1+)
  • Concatenate - 返回附加到右侧的额外矩阵的矩阵
  • Diagonal - 将矩阵减少到其对角线元素,用零替换非对角线条目
  • MFunction - 将函数应用于矩阵中的每个条目
  • Reflect - 在X平面、Y平面、y=x平面和原点反射矩阵
  • Resize - 通过分别从底部和右侧添加或减去行和列来调整矩阵的大小
  • Rotate - 通过90度、180度或270度旋转矩阵
  • Rowreduce - 返回减去1+行的矩阵
  • Rowslice - 返回矩阵行的切片(1+)
  • Shift - 在矩阵中左右移动行和列,用值替换新列
  • Stack - 返回堆叠在额外矩阵上的矩阵
  • Transpose - 返回行和列围绕对角线交换的矩阵

神奇的调用方法允许您以函数式方式编写

例如(来自Transformation\Cofactor)

        $fC = new Colreduce();
        $fR = new Rowreduce();
        //R(C(mA))
        return $fR($fC($mA,[$col]),[$row]);

或者这个(来自Transformation\Colreduce)

        $fT = new Transpose();
        $fR = new Rowreduce();

        return $fT($fR($fT($mA), [$col, $numCols]));

矩阵可以用于显示输出

您可以通过display()方法提供格式化器来创建输出。库目前有一个Ascii格式化器。要使用它

    use Chippyash\Matrix\Formatter\Ascii;
    use Chippyash\Matrix\Matrix;

    $mA = new Matrix([[1,2,3],['a','b','c'],[true, false, 'foo']]);
    echo $mA->setFormatter(new Asciii())->display();
  • 格式化器实现了Chippyash\Matrix\Interfaces\FormatterInterface接口
  • Matrix::display()方法接受一个可选的选项数组,这些选项会被传递给格式化器
  • 格式化器不仅限于字符串输出。例如,你可以编写一个格式化器来输出SVG文件

你可以调试一个Matrix

如果你发现一些奇怪的事情发生,利用Debug特质将矩阵使用Ascii格式化器输出到屏幕。

更改库

  1. 分支它
  2. 编写测试
  3. 修改它
  4. 发起拉取请求

发现了一个无法解决的bug吗?

  1. 分支它
  2. 编写测试
  3. 发起拉取请求

注意。在发起拉取请求之前,确保你已经将代码变基到HEAD

在哪里?

该库托管在Github。它可在Packagist.org找到

安装

安装Composer

对于生产环境

添加

    "chippyash/matrix": ">=3,<4"

到你的composer.json的"requires"部分

对于开发环境

克隆此仓库,然后在本地仓库根目录中运行Composer以拉入依赖项

    git clone git@github.com:chippyash/Matrix.git Matrix
    cd Matrix
    composer update

要运行测试

    cd Matrix
    vendor/bin/phpunit -c test/phpunit.xml test/

许可协议

此软件库在BSD 3 Clause许可下发布

此软件库的版权为(c) 2014-2018,Ashley Kitson,英国

历史

V1.0.0 原始发布

V1.0.1 小型错误修复

V1.1.0 新的转换

  • 连接
  • 堆叠
  • 旋转

V1.1.1 代码分析一致性

V1.1.2 更新readme

V1.2.0 新的转换

  • 反射

V1.2.1 代码分析一致性

V1.2.2 修复Ascii格式化器以与子矩阵一起工作

V1.2.3 修复转换以与子矩阵一起工作

V1.2.4 修改IsSquare属性测试以接受空矩阵为正方形

Update documentation

V1.2.5 添加equality()方法

V1.2.6 添加在Debug特质上设置格式化的能力

V1.2.7 添加在调试时设置格式化器选项的能力

V1.2.8 将phpunit更新到~V4.3.0

V2.0.0 BC中断:将chippyash\Matrix命名空间更改为Chippyash\Matrix

V2.0.1 删除重复的测试

V2.0.2 添加到包的链接

V2.0.3 代码清理

V2.1.0 添加Circshift转换

V2.2.0 添加Shift转换

V2.3.0 添加IsVector属性

V2.3.1 添加get()方法以返回向量的能力

V2.4.0 添加可变集合特质

V2.4.1 代码清理

V2.4.2 删除用户配置文件

V2.5.0 添加Resize转换

V2.5.1 更新构建脚本

V3.0.0 BC中断。撤销对旧PHP版本的支持

V3.1.0 许可证从GPL V3更改为BSD 3 Clause