{"id":28468589,"url":"https://github.com/cnwhy/bitmatrix","last_synced_at":"2025-06-25T20:30:49.310Z","repository":{"id":57189787,"uuid":"177592674","full_name":"cnwhy/BitMatrix","owner":"cnwhy","description":"Low-cost dot matrix","archived":false,"fork":false,"pushed_at":"2019-08-20T09:57:21.000Z","size":149,"stargazers_count":47,"open_issues_count":0,"forks_count":3,"subscribers_count":3,"default_branch":"master","last_synced_at":"2025-06-07T08:07:58.932Z","etag":null,"topics":["matrix","matrix-library"],"latest_commit_sha":null,"homepage":"","language":"TypeScript","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":null,"status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/cnwhy.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":null,"code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null}},"created_at":"2019-03-25T13:32:14.000Z","updated_at":"2025-03-11T02:16:27.000Z","dependencies_parsed_at":"2022-09-15T07:02:04.027Z","dependency_job_id":null,"html_url":"https://github.com/cnwhy/BitMatrix","commit_stats":null,"previous_names":[],"tags_count":4,"template":false,"template_full_name":null,"purl":"pkg:github/cnwhy/BitMatrix","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/cnwhy%2FBitMatrix","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/cnwhy%2FBitMatrix/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/cnwhy%2FBitMatrix/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/cnwhy%2FBitMatrix/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/cnwhy","download_url":"https://codeload.github.com/cnwhy/BitMatrix/tar.gz/refs/heads/master","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/cnwhy%2FBitMatrix/sbom","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":261948753,"owners_count":23234884,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["matrix","matrix-library"],"created_at":"2025-06-07T08:08:03.056Z","updated_at":"2025-06-25T20:30:49.305Z","avatar_url":"https://github.com/cnwhy.png","language":"TypeScript","funding_links":[],"categories":[],"sub_categories":[],"readme":"# BitMatrix\n[![Coverage Status](https://coveralls.io/repos/github/cnwhy/BitMatrix/badge.svg?branch=master)](https://coveralls.io/github/cnwhy/BitMatrix?branch=master)\n[![Build Status](https://travis-ci.org/cnwhy/BitMatrix.svg?branch=master)](https://travis-ci.org/cnwhy/BitMatrix)\n\u003e **BitMatrix** 以 `ArrayBuffer` 为基础, 以 `bit` 为单元的矩阵类实现;\n\n**特性:**  \n1. 按需选择矩阵类,节省内存;\n2. 统一API方便矩阵操作;\n3. 支持将矩阵对像通过 `base64` 导入导出, 打通存储问题;\n\n**适用场景:**  \n任何需要存储点阵信息的场景;\n\n**类说明:**  \n\u003e 除了 `ArrayBuffer` 做存储的矩阵, 还提供 `AnyMatrix`, `AnyMatrixUseObject` 两个类;  \n\u003e 这两个类主要用于做为参照物; 也可以做为可以存储任意值的矩阵来使用; API相同\n\nclass | base DataView | value range \n-- | -- | --\nBitMatrix | \u003cBit\u003e | `0` / `1`\nInt8Matrix | Int8Array | Int8\nUint8Matrix | Uint8Array | Uint8\nUint8ClampedMatrix | Uint8ClampedArray | Uint8\nInt16Matrix | Int16Array | Int16\nUint16Matrix | Uint16Array | Uint16\nInt32Matrix | Int32Array | Int32\nUint32Matrix | Uint32Array | Uint32\nFloat32Matrix | Float32Array | Float32\nFloat64Matrix | Float64Array | Float64\nAnyMatrix | Array | any\nAnyMatrixUseObject | Object | any\n\n## 安装\n```\nnpm i bitmatrix\n```\n\n## 使用\n**nodejs**\n\n```js\nconst BitMatrix = require('bitmatrix').BitMatrix;\n//使用其它的矩阵类\n//const {BitMatrix, Uint8Matrix, AnyMatrix} = require('bitmatrix');\nlet bm = new BitMatrix(2,2,0); //初始化一个以 0 填充的 2*2 矩阵 \nconsole.log(bm.showView());\n```\n\n**ES2015**\n\n```js\n// 默认导出 BitMatrix 类\nimport BitMatrix from 'bitmatrix'; \n//使用其它的矩阵类\n//import {BitMatrix, Uint8Matrix, AnyMatrix} from 'bitmatrix' \nconsole.log(bm.showView());\n```\n**浏览器**\n浏览器使用时可选择 己打包依赖的文件 `./dist/BitMatrix.umd.js`\n```html\n\u003cscript src=\"//unpkg.com/@cnwhy/base64/dist/BitMatrix.umd.js\"\u003e\u003c/script\u003e\n```\n\n## API\n\u003e API 可能还会有变化, 欢迎提意见. \n```typescript\nclass Matrix {\n\tconstructor(width: number, height: number, defaultValue?: any);\n\t//宽(只读)\n\twidth: number;\n\t//高(只读)\n\theight: number;\n\t//单元格总数(只读)\n\ttotal: number;\n\t// 填充矩阵\n\tfill(value: any);\n\t// 填充一行\n\tfillRow(row: number, value: any);\n\t// 填充一列\n\tfillColumn(column: number, value: any);\n\t// 读取指定单元格\n\tget(x: number, y: number): any;\n\t// 设置指定单元格\n\tset(x: number, y: number, value: any);\n\t// 读取一行 返回 Array\n\tgetRow(y: number): any[];\n\t// 设置一行\n\tsetRow(y: number, row:any[]);\n\t// 读取一列 返回 Array\n\tgetColumn(x: number): any[];\n\t// 设置一列\n\tsetColumn(x: number, column: any[]);\n\t// 暴露矩阵原型数据对像, 如果你不清楚是什么, 请勿使用\n\tgetPrototypeData():Object;\n\t// 遍历矩阵\n\tcellForEach(fn: (value: any, x: number, y: number) =\u003e void);\n\t// 以','分隔列, '\\n'分隔行, 返回当前矩阵数据\n\tshowView(): string;\n\t// 创建一个副本\n\tclone(): Matrix;\n\t// 用现有数据创建矩阵\n\tstatic from(arr:[][]): Matrix;\n\tstatic from(arr:[],width:number): Matrix;\n\t// 用现有矩阵对像 创建一个此类型的矩阵对象 注意区别clone(); from可以创建不同类型的矩阵\n\tstatic from(matrix:Matrix,callback:(value: any, x: number, y: number)=\u003eany,thisArg): Matrix;\n\t// 通过base64导出矩阵,便于存储\n\tstatic output(matrix:Matrix): string;\n\t// 通过导入base64,创建矩阵\n\tstatic input(base64:string): Matrix;\n}\n```\n\n### 复制矩阵\n推荐使用矩阵对像的 `clone()` 方法;  \n\n### 导入导出 \n\u003e 为获取最大兼容,选用 `base64` 为媒介进行导入(`input()`), 导出(`output()`);\n\n**导入/导出的数据结构:**  \n前9个字节为描述字节, 后面为数据;\n\u003ctable border=\"1\"\u003e\n\u003ctr\u003e\u003ctd\u003e0\u003c/td\u003e\u003ctd\u003e1\u003c/td\u003e\u003ctd\u003e2\u003c/td\u003e\u003ctd\u003e3\u003c/td\u003e\u003ctd\u003e4\u003c/td\u003e\u003ctd\u003e5\u003c/td\u003e\u003ctd\u003e6\u003c/td\u003e\u003ctd\u003e7\u003c/td\u003e\u003ctd\u003e8\u003c/td\u003e\u003ctd\u003e\u003c/td\u003e\u003ctd\u003e\u003c/td\u003e\u003c/tr\u003e\n\u003ctr\u003e\n\t\u003ctd colspan=4\u003eUint32LE(width)\u003c/td\u003e\n\t\u003ctd colspan=4\u003eUint32LE(height)\u003c/td\u003e\n\t\u003ctd colspan=1\u003eUint8(typeMark)\u003c/td\u003e\n\t\u003ctd colspan=12\u003e...(data)\u003c/td\u003e\n\u003c/tr\u003e\n\u003c/table\u003e\n\n\n```js\nimport BitMatrix from 'bitmatrix';\nlet bm = new BitMatrix(7,7,0);\nbm.fillColumn(3,1);\nbm.fillRow(3,1);\n\nlet b64 = BitMatrix.output(bm);\nconsole.log(b64);\nlet bm1 = BitMatrix.input(b64);\nconsole.log(bm1.showView())\n\n/*\nAAAABwAAAAcDCATij0AgAA==\n0,0,0,1,0,0,0\n0,0,0,1,0,0,0\n0,0,0,1,0,0,0\n1,1,1,1,1,1,1\n0,0,0,1,0,0,0\n0,0,0,1,0,0,0\n0,0,0,1,0,0,0\n*/\n```\n\n## 兼容\n\u003e 基于 `BufferArray` 只能运行于支持 `ES2015` 的环境;\n\n## 性能测试\n### 内存占用 `node v10.13.0`\n从以下的表格看, 是符合预期的.\n```\n生成 2000 个 100*100 矩阵, 并用 1 填充, 内存及耗时占用情况:\n┌─────────┬──────────────────────┬────────────┬────────────┬──────────────────────┬───────────────────┐\n│ (index) │      className       │  heapUsed  │  external  │         sum          │       time        │\n├─────────┼──────────────────────┼────────────┼────────────┼──────────────────────┼───────────────────┤\n│    0    │     'BitMatrix'      │  '0.77MB'  │  '2.38MB'  │   '3.16MB | 1.91%'   │    '7 | 1.46%'    │\n│    1    │     'Int8Matrix'     │  '0.87MB'  │ '19.07MB'  │  '19.94MB | 12.07%'  │   '16 | 3.33%'    │\n│    2    │    'Uint8Matrix'     │  '0.82MB'  │ '19.07MB'  │  '19.90MB | 12.04%'  │   '14 | 2.92%'    │\n│    3    │ 'Uint8ClampedMatrix' │  '0.82MB'  │ '19.07MB'  │  '19.89MB | 12.04%'  │   '15 | 3.13%'    │\n│    4    │    'Int16Matrix'     │  '0.80MB'  │ '38.15MB'  │  '38.95MB | 23.57%'  │   '17 | 3.54%'    │\n│    5    │    'Uint16Matrix'    │  '0.68MB'  │ '38.15MB'  │  '38.83MB | 23.50%'  │   '19 | 3.96%'    │\n│    6    │    'Int32Matrix'     │  '0.53MB'  │ '76.29MB'  │  '76.82MB | 46.49%'  │  '147 | 30.63%'   │\n│    7    │    'Uint32Matrix'    │  '0.53MB'  │ '76.29MB'  │  '76.82MB | 46.49%'  │  '139 | 28.96%'   │\n│    8    │   'Float32Matrix'    │  '0.53MB'  │ '76.29MB'  │  '76.82MB | 46.49%'  │  '140 | 29.17%'   │\n│    9    │   'Float64Matrix'    │  '0.49MB'  │ '152.59MB' │ '153.08MB | 92.64%'  │  '286 | 59.58%'   │\n│   10    │     'AnyMatrix'      │ '153.61MB' │  '0.00MB'  │ '153.61MB | 92.96%'  │ '2445 | 509.38%'  │\n│   11    │ 'AnyMatrixUseObject' │ '153.75MB' │  '0.00MB'  │ '153.75MB | 93.05%'  │ '6056 | 1261.67%' │\n│   12    │      'number[]'      │ '153.13MB' │  '0.00MB'  │ '153.13MB | 92.67%'  │ '2808 | 585.00%'  │\n│   13    │     'number[][]'     │ '165.24MB' │  '0.00MB'  │ '165.24MB | 100.00%' │  '480 | 100.00%'  │\n└─────────┴──────────────────────┴────────────┴────────────┴──────────────────────┴───────────────────┘\n```\n\u003e 可执行 `npm run test-memory` 命令测试, 获取本结果;\n\n### 基准测试 `node v10.13.0`\n```\n操作同为 1000*1000 矩阵, 基础方法的QPS比较: \n┌─────────┬─────────────────┬───────────┬─────────────┬─────────────┬─────────────┐\n│ (index) │      name       │   fill    │     get     │     set     │ cellForEach │\n├─────────┼─────────────────┼───────────┼─────────────┼─────────────┼─────────────┤\n│    0    │   'BitMatrix'   │ '210.31K' │ '8194.21K'  │ '6275.51K'  │  '700.17'   │\n│    1    │  'Uint8Matrix'  │ '25.63K'  │ '10969.26K' │ '9658.56K'  │  '991.44'   │\n│    2    │ 'Uint32Matrix'  │  '2.66K'  │ '11844.04K' │ '10304.60K' │  '992.45'   │\n│    3    │ 'Float64Matrix' │  '1.19K'  │ '11845.38K' │ '10639.79K' │  '988.99'   │\n│    4    │   'AnyMatrix'   │  '1.23K'  │ '11453.06K' │ '10560.18K' │  '987.83'   │\n│    5    │   'number[]'    │  '1.15K'  │ '15009.22K' │ '14345.48K' │  '960.72'   │\n│    6    │  'number[][]'   │ '752.19'  │ '12196.47K' │ '11029.79K' │   '1.48K'   │\n└─────────┴─────────────────┴───────────┴─────────────┴─────────────┴─────────────┘\n```\n\u003e `get` 与 `set` 测试都使用了9个点, 所以真实值应该再乘上9;  \n\u003e 可执行 `npm run test-benchmark` 命令, 获取本结果;\n\n\n## Other\n- [x] 添加各API参数合法性检测\n- 处理好 单元测试, 基准测试, 内存测试代码;\n\t- [x] 单元测试\n\t- [x] 基准测试\n\t- [x] 内存占用测试\n- [ ] 增加基准测试范围;\n- Matrix.from(arr:[][]|[][,width])\n\t- [x] 编码\n\t- [x] 测试\n- .clone()\n\t- [x] 编码\n\t- [x] 测试\n- .copy() .copyTo()\n\t- [ ] copy()\n\t- [ ] copyTo()\n- 导出, 导入;\n\t- [x] typeBuffer Matrix 转 base64\n\t- [x] base64 转 Matrix ","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fcnwhy%2Fbitmatrix","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fcnwhy%2Fbitmatrix","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fcnwhy%2Fbitmatrix/lists"}