UNPKG

@rayyamhk/matrix

Version:

A professional, comprehensive and high-performance library for you to manipulate matrices.

199 lines (150 loc) 5.82 kB
"use strict"; function _slicedToArray(arr, i) { return _arrayWithHoles(arr) || _iterableToArrayLimit(arr, i) || _unsupportedIterableToArray(arr, i) || _nonIterableRest(); } function _nonIterableRest() { throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); } function _unsupportedIterableToArray(o, minLen) { if (!o) return; if (typeof o === "string") return _arrayLikeToArray(o, minLen); var n = Object.prototype.toString.call(o).slice(8, -1); if (n === "Object" && o.constructor) n = o.constructor.name; if (n === "Map" || n === "Set") return Array.from(o); if (n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen); } function _arrayLikeToArray(arr, len) { if (len == null || len > arr.length) len = arr.length; for (var i = 0, arr2 = new Array(len); i < len; i++) { arr2[i] = arr[i]; } return arr2; } function _iterableToArrayLimit(arr, i) { var _i = arr == null ? null : typeof Symbol !== "undefined" && arr[Symbol.iterator] || arr["@@iterator"]; if (_i == null) return; var _arr = []; var _n = true; var _d = false; var _s, _e; try { for (_i = _i.call(arr); !(_n = (_s = _i.next()).done); _n = true) { _arr.push(_s.value); if (i && _arr.length === i) break; } } catch (err) { _d = true; _e = err; } finally { try { if (!_n && _i["return"] != null) _i["return"](); } finally { if (_d) throw _e; } } return _arr; } function _arrayWithHoles(arr) { if (Array.isArray(arr)) return arr; } function _typeof(obj) { "@babel/helpers - typeof"; if (typeof Symbol === "function" && typeof Symbol.iterator === "symbol") { _typeof = function _typeof(obj) { return typeof obj; }; } else { _typeof = function _typeof(obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }; } return _typeof(obj); } var _require = require('../../Error'), INVALID_MATRIX = _require.INVALID_MATRIX, EXPECTED_STRING_NUMBER_AT_POS_1_2 = _require.EXPECTED_STRING_NUMBER_AT_POS_1_2, INVALID_ROW = _require.INVALID_ROW, INVALID_COLUMN = _require.INVALID_COLUMN, OVERFLOW_ROW = _require.OVERFLOW_ROW, INVALID_ROWS_EXPRESSION = _require.INVALID_ROWS_EXPRESSION, INVALID_COLUMNS_EXPRESSION = _require.INVALID_COLUMNS_EXPRESSION, OVERFLOW_COLUMN = _require.OVERFLOW_COLUMN; /** * Generates a submatrix of a matrix. * @memberof Matrix * @static * @param {Matrix} A - Any matrix * @param {string|number} rows - Rows expression * @param {string|number} cols - Columns expression * @returns {Matrix} Submatrix of A */ function submatrix(A, rows, cols) { if (!(A instanceof this)) { throw new Error(INVALID_MATRIX); } var arg1Type = _typeof(rows); var arg2Type = _typeof(cols); if (arg1Type !== 'string' && arg1Type !== 'number' || arg2Type !== 'string' && arg2Type !== 'number') { throw new Error(EXPECTED_STRING_NUMBER_AT_POS_1_2); } var _A$size = A.size(), _A$size2 = _slicedToArray(_A$size, 2), row = _A$size2[0], col = _A$size2[1]; var rowStart; var rowEnd; var colStart; var colEnd; if (arg1Type === 'number') { if (!Number.isInteger(rows) || rows < 0) { throw new Error(INVALID_ROW); } if (rows >= row) { throw new Error(OVERFLOW_ROW); } rowStart = rows; rowEnd = rows; } else { // string var arg = rows.split(':'); if (arg.length !== 2) { throw new Error(INVALID_ROWS_EXPRESSION); } var _arg = _slicedToArray(arg, 2), r1 = _arg[0], r2 = _arg[1]; if (r1 === '') { rowStart = 0; } else { var r = Number(r1); if (!Number.isInteger(r) || r < 0) { throw new Error(INVALID_ROW); } if (r >= row) { throw new Error(OVERFLOW_ROW); } rowStart = r; } if (r2 === '') { rowEnd = row - 1; } else { var _r = Number(r2); if (!Number.isInteger(_r) || _r < 0) { throw new Error(INVALID_ROW); } if (_r >= row) { throw new Error(OVERFLOW_ROW); } rowEnd = _r; } if (rowStart > rowEnd) { throw new Error(INVALID_ROWS_EXPRESSION); } } if (arg2Type === 'number') { if (!Number.isInteger(cols) || cols < 0) { throw new Error(INVALID_COLUMN); } if (cols >= col) { throw new Error(OVERFLOW_COLUMN); } colStart = cols; colEnd = cols; } else { // string var _arg2 = cols.split(':'); if (_arg2.length !== 2) { throw new Error(INVALID_COLUMNS_EXPRESSION); } var _arg3 = _slicedToArray(_arg2, 2), c1 = _arg3[0], c2 = _arg3[1]; if (c1 === '') { colStart = 0; } else { var c = Number(c1); if (!Number.isInteger(c) || c < 0) { throw new Error(INVALID_COLUMN); } if (c >= col) { throw new Error(OVERFLOW_COLUMN); } colStart = c; } if (c2 === '') { colEnd = col - 1; } else { var _c = Number(c2); if (!Number.isInteger(_c) || _c < 0) { throw new Error(INVALID_COLUMN); } if (_c >= col) { throw new Error(OVERFLOW_COLUMN); } colEnd = _c; } if (colStart > colEnd) { throw new Error(INVALID_COLUMNS_EXPRESSION); } } var matrix = A._matrix; var subRow = rowEnd - rowStart + 1; var subCol = colEnd - colStart + 1; var subMatrix = new Array(subRow); for (var i = rowStart; i <= rowEnd; i++) { var newRow = new Array(subCol); for (var j = colStart; j <= colEnd; j++) { newRow[j - colStart] = matrix[i][j]; } subMatrix[i - rowStart] = newRow; } return new this(subMatrix); } ; module.exports = submatrix;