ご利用にあたって
行列(2次元配列)の基本的な操作を掲げます。
正方行列式の値(determinant)を求める。 3次までは、サラスの式により直接計算する 4次以上は、余因子展開で低次にし、再帰呼出しにより3次にする。 (展開要素は a[i][0] に固定している) 現在5次以上は準備中です。誤った結果になります、
var a = [[ 3, 4, -1], [ 2, 5, -2], [ 1, 6, -4] ]; var 値 = mtxDet(a); // -7
var a = [[ 2, 1, 5, 3], [ 3, 0, 1, 6], [ 1, 4, 3, 3], [ 8, 2, 0, 1] ]; var 値 = mtxDet(a);
最大2個のソートキー列で行列をソートする a:ソートする行列 元の行列は保持されない fix:ソートしない先頭行数(行番号ではない)たとえば先頭行1行が列名ならば fix=1 key1:優先順位1のソートキー行番号 必須 ad1:指定しなければkey1での昇順、指定すれば("disc" でも -1 でもよい)降順 key2:優先順位2のソートキー行番号 オプション ad1:指定しなければkey1での昇順、指定すれば("disc" でも -1 でもよい)降順
var a = [ [ 1, 10, "A"], [ 3, 10, "B"], [ 2, 10, "C"], [ 2, 20, "D"], [ 1, 20, "E"], [ 2, 20, "F"] ]; mtxSort(a, { key1:0 });
a はケース1と同じ 列0の昇順、列1の降順にソート mtxSort(a, { key1:0, key2:, ad2:"desc" });
var a = [ ["x", "Y", "Z"], // 固定行 fix=1 [ 1, 10, "A"], [ 3, 10, "B"], [ 2, 20, "C"], [ 2, 10, "D"], [ 1, 20, "E"], [ 2, 20, "F"] ]; └ この列の昇順にソート mtxSort(a, { key1:1 });
配列aについて、指定列key1, key2の値により昇順または降順にソートしたときの各行の順位を戻します。行列そのものはソートされません。
順位[k] = i とは、ソートしたとき、k番目になる行が i であることを示します。
すなわち、行列[[順位[k]][j] がk番目の行になります。
a:ソートする行列 元の行列は保持されない fix:ソートしない先頭行数(行番号ではない)たとえば先頭行1行が列名ならば fix=1 key1:優先順位1のソートキー行番号 必須 ad1:指定しなければkey1での昇順、指定すれば("disc" でも -1 でもよい)降順 key2:優先順位2のソートキー行番号 オプション ad1:指定しなければkey1での昇順、指定すれば("disc" でも -1 でもよい)降順
var a = [ [ 1, 10, "A"], // 順位[1] 順位[0] = 4 [ 1, 20, "E"] [ 3, 10, "B"], // 順位[5] 順位[1] = 0 [ 1, 10, "A"] [ 2, 20, "C"], // 順位[2] 順位[2] = 2 [ 2, 20, "C"] [ 2, 10, "D"], // 順位[4] 順位[3] = 5 [ 2, 20, "F"] [ 1, 20, "E"], // 順位[0] 順位[4] = 3 [ 2, 10, "D"] [ 2, 20, "F"] ]; // 順位[3] 順位[5] = 1 [ 3, 10, "B"] var 順位 = mtxOrder(a, { key1:0, key2:1, ad2:"desc" }); // mtxSort のケース2と同じ指定
多変量解析での入力データは、データフレーム形式にするのが通常です。 それに対して、実務でのデータでは、表計算スプレッドシートやリレーショナルデータベースのように Df = [ [ 行名 特性y 特性x1 特性x2 ], [ 標本A, 200, 10, 50 ], [ 標本B, 101, 31, 61 ], 形式1 [ 標本C, 402, 22, 82 ], [ 標本D, 303, 43, 73 ] ]; あるいは Df = [[ 200, 10, 50 ], [ 101, 31, 61 ], 形式2 [ 402, 22, 82 ], [ 303, 43, 73 ] ]; colname = [ 特性y, 特性x1, 特性x2 ]; rowname = [ 標本A, 標本B, 標本C, 標本D ]; 行名、列名が不要なときは Df = [[ 200, 10, 50 ], [ 101, 31, 61 ], 形式3 [ 402, 22, 82 ], [ 303, 43, 73 ] ]; のように、標本をレコードとして(行側にして)特性を属性(列側にして)与えるのが自然ですし管理も容易です。 ところが、多くの統計処理のプログラムでは(ここでの関数もそうですが)、 標本A 標本B 標本C 標本D 特性 y = [ 200, 101, 402, 303 ]; 特性 x1 = [ 10, 31, 22, 43 ]; 形式4 特性 x2 = [ 50, 61, 82, 73 ]; あるいは x = [[ 200, 101, 402, 303 ], [ 10, 31, 22, 43 ], 形式5 [ 50, 61, 82, 73 ] ]; のように、特性値を主として(行側にして)与えるのが通常です。 そのため、データフレーム形式1~3の転置行列を生成することになります。ここでは形式5を生成することにします。 簡単な処理なので、あえて関数にする必要はないでしょうが・・・。
ケース1:形式2・3→形式5 単に Df の転置行列 x を作るだけ var Df = [[ 200, 10, 50 ], [ 101, 31, 61 ], [ 402, 22, 82 ], [ 303, 43, 73 ] ]; |
ケース2:形式1→形式5 行名は存在しない。あるいは、行名も xT に入れる var Df = [ ["特性y","特性x1","特性x2" ], [ 200, 10, 50 ], [ 201, 31, 61 ], [ 402, 22, 82 ], [ 303, 43, 73 ] ]; |
ケース3:形式1→形式5 行名が存在し、取り出して rowname に入れる var Df = [ [ "行名", "特性y", "特性x1", "特性x2" ], [ "標本A", 200, 10, 50 ], [ "標本B", 101, 31, 61 ], [ "標本C", 402, 22, 82 ], [ "標本D", 303, 43, 73 ] ]; |