開発環境
- OS X El Capitan - Apple (OS)
- Emacs (Text Editor)
- JavaScript (プログラミング言語)
- kjs-math-matrix (JavaScript Library)
- Safari(Web browser)
線型代数入門 (松坂 和夫(著)、岩波書店)の第3章(線型写像)、7(行列の積)、問1.、行列演算の確認のために JavaScript で取り組んでみる。
問1.
コード(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 = '<math><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></math>';
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>';
});
0 コメント:
コメントを投稿