このブログは、旧・はてなダイアリー「檜山正幸のキマイラ飼育記 メモ編」(http://d.hatena.ne.jp/m-hiyama-memo/)のデータを移行・保存したものであり、今後(2019年1月以降)更新の予定はありません。

今後の更新は、新しいブログ http://m-hiyama-memo.hatenablog.com/ で行います。

とりあえず行列掛け算

計算できればいい。


/* 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] ];