とりあえず行列掛け算
計算できればいい。
/* mat.js *//*
* 簡易行列計算(掛け算のみ)
*
* 行列は入れ子の配列で表す。
* 例:[ [2, 0, 1], [0, 3, -1] ] これは2行3列の行列
* - matMult -- 掛け算
* - matEq -- 等値判定
* - matPrint -- 表示
* それぞれ、m, e, p という短縮名がある。
*/
// 行列mの列の数
function cols(m) {
return m[0].length;
}// 行列mの行の数
function rows(m) {
return m.length;
}// 行列mのi列目を取り出す
function getCol(m, i) {
var M = rows(m);
var c = new Array();
for (var j = 0; j < M; j++) {
c[j] = m[j][i];
}
return c;
}// ベクトルxとベクトルyの積和
function vecProd(x, y) {
var K = x.length;
var p = 0;
for (var i = 0; i < K; i++) {
p += x[i]*y[i];
}
return p;
}// 行列aとbの行列積
function matMult(a, b) {
var M = rows(a);
var N = cols(a);
var m = new Array();
for (var j = 0; j < M; j++) {
m[j] = new Array();
for (var i = 0; i < N; i++) {
m[j][i] = vecProd(a[j], getCol(b, i));
}
}
return m;
}// 行列の等しさの判定
function matEq(a, b) {
var M = rows(a);
var N = cols(a);
for (var j = 0; j < M; j++) {
for (var i = 0; i < N; i++) {
if (a[j][i] != b[j][i]) {
return false;
}
}
}
return true;
}// 行列の表示
function matPrint(m) {
var N = rows(m);
for (var i = 0; i < N; i++) {
print(m[i]); // for Rhino!
}
}// 短い名前
var m = matMult;
var e = matEq;
var p = matPrint;// データ
var A = [ [0, 0, 0], [1, 0, 0], [1, 1, 0] ];
var B = [ [0, 0, 1], [1, 0, 0], [0, 1, 0] ];
var C = [ [0, 0, 0], [1, 0, 0], [1, 1, 1] ];
var D = [ [0, 0, 0], [1, 1, 0], [1, 1, 0] ] ;
var E = [ [0, 0, 0, 0], [1, 0, 0, 0], [0, 1, 0, 1], [1, 1, 1, 0] ];