BMatrix 0.1

JavaScript で作成した2進行列の演算をテストした結果です。ベクトルと同様結果を $\TeX$ で整形しました。

実行結果

ソース

"expand source" を押すと展開されます。元に戻すには、このページを再ロードしてください。

bmatrix01.html

前回 JavaScript のソースファイルにあった テストに関する部分を抜き出して、HTML に埋め込みました。
<h2>実行結果</h2>
<div class="result">
<script type="text/javascript">
<!--
/**
 * 結果表示用の関数です。HTMLとして展開します。
 * @since 0.1
 */
function writeln(str) {
	document.writeln(str + "
"); } /** * テストの実行と表示を行う関数です。 * @since 0.1 */ function test(caption, exp, tex) { writeln(""); writeln(caption + " " + exp); writeln(""); var ans = eval(exp); if (isNaN(ans)) { writeln("$$" + tex + "=" + ans.toTeX() + "$$"); } else { writeln("$$" + tex + "=" + ans + "$$"); } } // テストのメインです。 test("コンストラクタ", "A = new BMatrix(4,4,[1,4],[2,4],[3,4],[4,4])", "A"); test("コンストラクタ", "B = new BMatrix(4,4,[1,4],[2,3],[3,2],[4,1])", "B"); test("要素", "A.getValue(4,3)", "(A)_{4,3}"); test("論理和", "A.or(B)", "A \\vee B"); test("論理積", "A.and(B)", "A \\wedge B"); test("絶対値", "A.abs()", "\\left| A \\right|"); test("反転", "A.inv()", "\\overline{A}"); test("転置", "A.tran()", "^tA"); test("論理差", "A.diff(B)", "A - B"); test("排他的論理和", "A.xor(B)", "A \\oplus B"); test("積", "A.mul(B)", "A B"); test("コンストラクタ", "c = new BVector(0,0,1,1)", "\\boldsymbol{c}"); test("ベクトルとの積", "A.mul(c)", "A \\boldsymbol{c}"); --> </script> </div>

bmatrix01.js

2進行列を定義します。
/**
 * BMatrix - 2進行列オブジェクトの定義
 * @version 0.1
 * @author たかはしのんき
 * 
 */

/**
 * 2進行列オブジェクトを定義します。
 * @since 0.1
 */
BMatrix = function() {
	this.init = arguments.length - 2;
	if (this.init < 0)
		return null;
	this.n = arguments[0];
	this.m = arguments[1];
	this.colv = new Array(this.m);
	this.clear();
	for (var k = 1; k <= this.init; k++) {
		var i = arguments[k + 1][0];
		var j = arguments[k + 1][1];
		this.setValue(i, j, 1);
	}
};

2進行列をゼロクリアするメソッド BMatrix.clear() を定義します。今回はメソッドをまとめて定義しているため、BVector のときと記法が違います。
BMatrix.prototype = {
	/**
	 * 2進行列をゼロクリアします。
	 * @since 0.1
	 */
	clear : function() {
		for (var j = 0; j < this.m; j++) {
			if (this.colv[j] == undefined)
				this.colv[j] = new BVector(this.n);
			this.colv[j].clear();
		}
	},

2進行列に値を設定するメソッド BMatrix.setValue(i, j, value) を定義します。
	/**
	 * 2進行列のある要素i,jに値(0か1)を設定します。
	 * @param i 設定する要素の行番号(1 origin)
	 * @param j 設定する要素の列番号(1 origin)
	 * @param value 設定する値0か1
	 * @since 0.1
	 */
	setValue : function(i, j, value) {
		var j0 = j - 1;		// 0 originに変換
		this.colv[j0].setValue(i, value);
	},

2進行列の値を返すメソッド BMatrix.getValue(i, j) を定義します。
	/**
	 * 2進行列のある要素i,jの値(0か1)を返します。
	 * @param i 設定する要素の行番号(1 origin)
	 * @param j 設定する要素の列番号(1 origin)
	 * @return 要素iの値(0か1)を返します。
	 * @since 0.1
	 */
	getValue : function(i, j) {
		var j0 = j - 1;		// 0 originに変換
		return this.colv[j0].getValue(i);
	},

2進行列をコピーするメソッド BMatrix.clone() を定義します。
	/**
	 * 2進行列をコピーします。
	 * @return 行列のコピーを返します。
	 * @since 0.1
	 */
	clone : function() {
		var bm = new BMatrix(this.n, this.m);
		for (var j = 0; j < this.m; j++)
			bm.colv[j] = this.colv[j].clone();
		return bm;
	},

2進行列の値が1の要素を数えるメソッド BMatrix.abs() を定義します。
	/**
	 * 2進行列の値が1の要素を数え上げます。
	 * @return 値が1の要素を数え上げた数を返します。
	 * @since 0.1
	 */
	abs : function() {
		var n = 0;
		for (var j = 0; j < this.m; j++)
			n += this.colv[j].abs();
		return n;
	},

2進行列の反転を返すメソッド BMatrix.inv() を定義します。
	/**
	 * 2進行列を反転して(invert)返します。
	 * @return 行列の反転を返します。
	 * @since 0.1
	 */
	inv : function() {
		var bm = new BMatrix(this.n, this.m);
		for (var j = 0; j < this.m; j++)
			bm.colv[j] = this.colv[j].inv();
		return bm;
	},

2進行列の転置を返すメソッド BMatrix.tran() を定義します。
	/**
	 * 2進行列の転置して(transpose)返します。
	 * @return 行列の転置を返します。
	 * @since 0.1
	 */
	tran : function() {
		var bm = new BMatrix(this.m, this.n);
		for (var i = 1; i <= this.n; i++)
			for (var j = 1; j <= this.m; j++)
				bm.setValue(j, i, this.getValue(i, j));
		return bm;
	},

2進行列が等しいかどうかを返すメソッド BMatrix.equals(bm2) を定義します。
	/**
	 * 2つの2進行列が等しければtrueを返します。同じでないかエラーの場合はfalseを返します。
	 * @param bm2 比較対象の行列
	 * @return 2つの行列が等しければtrueを返します。
	 * @since 0.1
	 */
	equals : function(bm2) {
		if (this.n != bm2.n || this.m != bm2.m)
			return false;				// 次元が異なる
		for (var j = 0; j < this.m; j++)
			if (!((this.colv[j]).equals(bm2.colv[j])))
				return false;			// 値が異なる
		return true;
	},

論理和を返すメソッド BMatrix.or(bm2) を定義します。
	/**
	 * 2進行列同士の論理和を返します。エラーの場合はnullを返します。
	 * @param bm2 論理和の第2オペランド
	 * @return 2つの行列の論理和を返します。
	 * @since 0.1
	 */
	or : function(bm2) {
		if (this.n != bm2.n || this.m != bm2.m)
			return null;				// 次元が異なる
		var bm = new BMatrix(this.n, this.m);
		for (var j = 0; j < this.m; j++)
			bm.colv[j] = this.colv[j].or(bm2.colv[j]);
		return bm;
	},	

論理積を返すメソッド BMatrix.and(bm2) を定義します。
	/**
	 * 2進行列同士の論理積を返します。エラーの場合はnullを返します。
	 * @param bm2 論理積の第2オペランド
	 * @return 2つの行列の論理積を返します。
	 * @since 0.1
	 */
	and : function(bm2) {
		if (this.n != bm2.n || this.m != bm2.m)
			return null;				// 次元が異なる
		var bm = new BMatrix(this.n, this.m);
		for (var j = 0; j < this.m; j++)
			bm.colv[j] = this.colv[j].and(bm2.colv[j]);
		return bm;
	},	

論理差を返すメソッド BMatrix.diff(bm2) を定義します。
	/**
	 * 2進行列同士の論理差を返します。エラーの場合はnullを返します。
	 * @param bm2 論理差の第2オペランド
	 * @return 2つの行列の論理差を返します。
	 * @since 0.1
	 */
	diff : function(bm2) {
		if (this.n != bm2.n || this.m != bm2.m)
			return null;				// 次元が異なる
		var bm = new BMatrix(this.n, this.m);
		for (var j = 0; j < this.m; j++)
			bm.colv[j] = this.colv[j].diff(bm2.colv[j]);
		return bm;
	},

排他的論理和を返すメソッド BMatrix.xor(bm2) を定義します。
	/**
	 * 2進行列同士の排他的論理和を返します。エラーの場合はnullを返します。
	 * @param bv2 排他的論理和の第2オペランド
	 * @return 2つの行列の排他的論理和を返します。
	 * @since 0.1
	 */
	xor : function(bm2) {
		if (this.n != bm2.n || this.m != bm2.m)
			return null;				// 次元が異なる
		var bm = new BMatrix(this.n, this.m);
		for (var j = 0; j < this.m; j++)
			bm.colv[j] = this.colv[j].xor(bm2.colv[j]);
		return bm;
	},

2進行列と2進行列(または2進ベクトル)の積を返すメソッド BMatrix.mul(bx2) を定義します。
	/**
	 * 2進行列と2進行列(または2進ベクトル)の積を返します。エラーの場合はnullを返します。
	 * @param bx2 積の第2オペランド
	 * @return 行列と行列(またはベクトル)の積を返します。
	 * @since 0.1
	 */
	mul : function(bx2) {
		if (bx2.n == undefined) {
			// bx2 はベクトル
			if (this.m != bx2.order)
				return null;
			var bv = new BVector(bx2.order);
			for (var i = 1; i <= this.n; i++) {
				var b = 0;
				for (var k = 1; k <= this.m; k++)
					b |= (this.getValue(i, k) & bx2.getValue(k));
				bv.setValue(i, b);
			}
			return bv;
		} else {
			// bx2 は行列
			if (this.m != bx2.n)
				return null;
			var bm = new BMatrix(bx2.n, bx2.m);
			for (var i = 1; i <= this.n; i++)
				for (var j = 1; j <= bx2.m; j++) {
					var b = 0;
					for (var k = 1; k <= this.m; k++)
						b |= (this.getValue(i, k) & bx2.getValue(k, j));
					bm.setValue(i, j, b);
				}
			return bm;
		}
	},

2進行列を文字列に変換するメソッド BMatrix.toString() を定義します。
	/**
	 * 2進行列を文字列に変換します。
	 * @return 文字列を返します。
	 * @since 0.1
	 */
	toString : function() {
		var str = "";
		for (var j = 1; j <= this.m; j++) {
			for (var i = 1; i <= this.n; i++) {
				str = str + this.getValue(i, j);
				if (i < this.n)
					str = str + " ";
			}
			str = str + "\n";
		}
		return str;
	},

2進行列を $\TeX$ 文字列に変換するメソッド BMatrix.toTeX() を定義します。
	/**
	 * 2進行列を TeX 文字列に変換します。
	 * @return TeX 文字列を返します。
	 * @since 0.1
	 */
	toTeX : function() {
		var str = "\\begin{pmatrix}";
		for (var i = 1; i <= this.n; i++) {
			for (var j = 1; j <= this.m; j++) {
				str = str + this.getValue(i, j);
				if (j < this.m)
					str = str + " & ";
			}
			if (i < this.n)
				str = str + "\\\\";
		}
		str = str + "\\end{pmatrix}";
		return str;
	}
};

Powered by
SyntaxHighlighter MathJax W3C HTML5