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