## 2016年7月26日火曜日

### JavaScript - 数学 - 線型代数 - 線型写像 - 行列の積(行と列)

コード(Emacs)

 <div id="answer0"> </div> <script src="matrix.js"></script> <script src="test.js"></script>   // matrix.js var Matrix; Matrix = function (m, n, fill) { var fill = fill || 0, matrix = [], i, j, row; for (i = 0; i < m; i += 1) { row = []; for (j = 0; j < n; j += 1) { row.push(fill); } matrix.push(row); } this.rowLength = m; this.colomnLength = n; this.getElement = function (i, j) { this.isValidIndex(m, n, i, j); return matrix[i-1][j-1]; }; this.setElement = function (i, j, elem) { this.isValidIndex(m, n, i, j); matrix[i-1][j-1] = elem; }; }; Matrix.prototype.isValidIndex = function (m, n, i, j) { if (i < 1 || m < i || j < 1 || n < j) { throw { type: 'Index error', message: m + ' x ' + n + ': ' + '(' + i + ', ' + j + ')' }; } }; Matrix.prototype.toArray = function () { var matrix = [], i, j, m = this.rowLength, n = this.colomnLength, row; for (i = 1; i <= m; i += 1) { row = []; for (j = 1; j <= n; j += 1) { row.push(this.getElement(i, j)) } matrix.push(row); } return matrix; }; Matrix.prototype.toString = function () { var m = this.rowLength, n = this.colomnLength, i, j, result = '<mfenced><mtable>'; // result = '<table style="display: inline-block; text-align:center;' + // 'border-style:none solid; border-radius:0.5em;">'; if (typeof window !== 'undefined') { for (i = 1; i <= m; i += 1) { result += '<mtr>'; for (j = 1; j <= n; j += 1) { result += '<mtd><mn>' + this.getElement(i, j) + '</mn></mtd>'; } result += '</mtr>'; } result += '</mtable>'; return result; } return this.toArray(); }; Matrix.prototype.getRow = function (i) { var j, n = this.colomnLength, row = new Matrix(1, n); for (j = 1; j <= n; j += 1) { row.setElement(1, j, this.getElement(i, j)); } return row; }; Matrix.prototype.getColomn = function (j) { var m = this.rowLength, i, col = new Matrix(m, 1); for (i = 1; i <= m; i += 1) { col.setElement(i, 1, this.getElement(i, j)); } return col; }; Matrix.prototype.setRow = function (i, row) { var n = this.colomnLength, j; for (j = 1; j <= n; j += 1) { this.setElement(i, j, row.getElement(1, j)); } }; Matrix.prototype.setColomn = function (j, colomn) { var m = this.rowLength, i; for (i = 1; i <= m; i += 1) { this.setElement(i, j, colomn.getElement(i, 1)); } }; Matrix.prototype.add = function (mat) { var m = this.rowLength, n = this.colomnLength, matrix = new Matrix(m, n), i, j; for (i = 1; i <= m; i += 1) { for (j = 1; j <= n; j += 1) { matrix.setElement(i, j, this.getElement(i, j) + mat.getElement(i, j)); } } return matrix; }; Matrix.prototype.mulMatrix = function (mat) { var m = this.rowLength, n = this.colomnLength, m0 = mat.rowLength, n0 = mat.colomnLength, i, j, matrix = new Matrix(m, n0), elem, j0; if (n !== m0) { throw { type: "mulMatrix error", message: '(' + m + ', ' + n + ') x (' + m0 + ', ' + n0 + ')', }; } for (i = 1; i <= m; i += 1) { for (j = 1; j <= n0; j += 1) { elem = 0; for (j0 = 1; j0 <= n; j0 += 1) { elem += this.getElement(i, j0) * mat.getElement(j0, j); } matrix.setElement(i, j, elem); } } return matrix; }; Matrix.prototype.mulScalar = function (scalar) { var m = this.rowLength, n = this.colomnLength, i, j, matrix = new Matrix(m, n); for (i = 1; i <= m; i += 1) { for (j = 1; j <= n; j += 1) { matrix.setElement(i, j, this.getElement(i, j) * scalar); } } return matrix; }; Array.prototype.toRow = function () { var len = this.length, matrix = new Matrix(1, len), j; for (j = 1; j <= len; j += 1) { matrix.setElement(1, j, this[j - 1]); } return matrix; }; Array.prototype.toColomn = function () { var len = this.length, matrix = new Matrix(len, 1), i; for (i = 1; i <= len; i += 1) { matrix.setElement(i, 1, this[i - 1]); } return matrix; }; Array.prototype.toMatrix = function () { var m = this.length, n = this[0].length, matrix = new Matrix(m, n), i, j; for (i = 1; i <= m; i += 1) { for (j = 1; j <= n; j += 1) { matrix.setElement(i, j, this[i-1][j-1]); } } return matrix; }; // test.js var m11 = [[2,3,-1], [4,5,6]].toMatrix(), m12 = [-1, 0, 1].toColomn(), m21 = [[5, 3], [2, 1]].toMatrix(), m22 = [[-1, 3], [2, -5]].toMatrix(), m31 = [[2, 4, -1], [0, 3, -2]].toMatrix(), m32 = [[1, -5, 0], [2, -2, 4], [0, 3, 1]].toMatrix(), m41 = [[5, 0], [-10, 2], [3, -1]].toMatrix(), m42 = [[1, 2, 3], [4, 5, 6]].toMatrix(), m51 = [5, 6, -3].toRow(), m52 = [6, -3, 4].toColomn(), m61 = [10, -1, 5].toColomn(), m62 = [-2, 3, 1].toRow(), answer0 = document.querySelector('#answer0'); [[m11, m12], [m21, m22], [m31, m32], [m41, m42], [m51, m52], [m61, m62]]. forEach(function (x) { var a = x[0], b = x[1]; answer0.innerHTML += a + ' ' + b + ' = ' + a.mulMatrix(b) + '<br><br>'; });