スタートページJavaScriptライブラリ目次

行列関連 JavaScript関数ライブラリ mtx.js の利用解説書

ご利用にあたって

行列(2次元配列)の基本的な操作を掲げます。


行列式の値
  mtxDetTrace(表示場所, a) 
  値 = mtxDet(a) 

正方行列式の値(determinant)を求める。
  3次までは、サラスの式により直接計算する
  4次以上は、余因子展開で低次にし、再帰呼出しにより3次にする。
   (展開要素は a[i][0] に固定している)
  現在5次以上は準備中です。誤った結果になります、

ケース1 3次 サラスの式により直接計算

    var a = [[ 3, 4, -1],
             [ 2, 5, -2],
             [ 1, 6, -4] ];
    var 値 = mtxDet(a);
// -7

ケース2 4次 余因子展開

    var a = [[ 2, 1, 5, 3],
             [ 3, 0, 1, 6],
             [ 1, 4, 3, 3],
             [ 8, 2, 0, 1] ];
    var 値 = mtxDet(a);

ケース3







行列のソート(行を変える)
  mtxSort(a, {fix=xx, key1=xx, ad1=xx, key2=xx. ad2=xx} ) 

最大2個のソートキー列で行列をソートする
   a:ソートする行列 元の行列は保持されない
   fix:ソートしない先頭行数(行番号ではない)たとえば先頭行1行が列名ならば fix=1
   key1:優先順位1のソートキー行番号 必須
   ad1:指定しなければkey1での昇順、指定すれば("disc" でも -1 でもよい)降順
   key2:優先順位2のソートキー行番号 オプション
   ad1:指定しなければkey1での昇順、指定すれば("disc" でも -1 でもよい)降順

ケース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 });

ケース2

a はケース1と同じ
列0の昇順、列1の降順にソート
    mtxSort(a, { key1:0, key2:, ad2:"desc" });

ケース3

    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 });

配列の順序付け
  順位 = mtxOrder(a, {fix=xx, key1=xx, ad1=xx, key2=xx. ad2=xx} ) 

配列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 でもよい)降順

ケース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 ] ];