chippyash / matrix
PHP 矩阵数据结构支持包
Requires
- php: >=5.6
- zendframework/zend-stdlib: ~2.3.1
Requires (Dev)
- phpunit/phpunit: ~4.0
README
质量保证
上面的徽章代表当前的开发分支。一般来说,除非测试、覆盖率和使用性都是可接受的,否则我不会向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格式化器输出到屏幕。
更改库
- 分支它
- 编写测试
- 修改它
- 发起拉取请求
发现了一个无法解决的bug吗?
- 分支它
- 编写测试
- 发起拉取请求
注意。在发起拉取请求之前,确保你已经将代码变基到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