@rayyamhk/matrix
Version:
A professional, comprehensive and high-performance library for you to manipulate matrices.
199 lines (150 loc) • 5.82 kB
JavaScript
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;
;