基本的な行列操作(工事中)

行列の表現

  • ベクトルの表現:[要素1,要素2,...,]

    例:[1,2,3]

  • 行列の表現:ベクトルの入れ子構造.
    例1: |1,2,3|  → [[1,2,3],[4,5,6]]
           |4,5,6| 
    
    例2: 2x2x3 の3次元行列 → [[[a(1,1,1),a(2,1,1)],[a(1,2,1),a(2,2,1)]],
                                  [[a(1,1,2),a(1,2,2)],[a(1,2,2),a(2,2,2)]],
                                  [[a(1,1,2),a(1,2,3)],[a(1,2,2),a(2,2,3)]]]
    
    [注意]C言語と行列(配列)要素の指定の順番が逆です.(例えば2次元行列bのb[3][1]は,b(1,3)です.)
  • これらを変数として格納する場合には,a=[1,2,3]などとします.型宣言は 必要なく,要素の型が自動認識されて変数aの型が決まるようです.

    行列の生成

  • array(初期値,次元)
    > a=array(0.1,2,2)
    > a
    [[0.1,0.1],[0.1,0.1]]
    
  • 自然数列(indgen),等差数列(span(始め,終わり,区切り数)),等比数列(spanl(始め,終わり,区切り数))
    > indgen(10)
    [1,2,3,4,5,6,7,8,9,10]
    > span(0,1,11)
    [0,0.1,0.2,0.3,0.4,0.5,0.6,0.7,0.8,0.9,1]
    > spanl(1,10,8)
    [1,1.3895,1.9307,2.6827,3.72759,5.17947,7.19686,10]
    

    四則演算

  • +,-,*,/などの演算は,同じ次元の行列同士では対応する2個の要素間で行われ ます.*,/は通常の行列演算とは異なるので注意が必要です.
    > a=[1,10,100]
    > b=[1,2,3]
    > a+b
    [2,12,103]
    > a-b
    [0,8,97]
    > a*b
    [1,20,300]
    > a/b
    [1,5,33]
    
  • 同じ次元の行列同士では,次元の低い方が引き伸ばされて演算が行われます.
    > [[1,2,3],[2,4,6]]*[2,2,2]
    [[2,4,6],[4,8,12]]
    
  • 内積,外積(参照→Marking an index for matrix multiplication)
    内積:
    > a=[1,2,3]
    > b=[1,10,100]
    > a(+)*b(+)
    321
    外積:
    > a(-,)*b(,-)
    [[1,10,100],[2,20,200],[3,30,300]]
    
    行列の積:
    > a=[[2,1],[0,2]]
    > b=[[1,2],[3,4]]
    > a(,+)*b(+,)
    [[2,5],[6,11]]
    > c=[1,10]
    > b(+,)*c(+)
    [21,43]
    

    要素の指定

  • a(始め:終わり:間隔)
    > a=[1,2,3,4,5,6]
    > a(1:5)
    [1,2,3,4,5]
    > a(1:5:2)
    [1,3,5]
    > a(::-1)
    [6,5,4,3,2,1]
    
    > b=[[1,2,3],[4,5,6]]
    > b(1:2,)
    [[1,2],[4,5]]
    
  • 多次元行列は通し番号もあります:
    > b(4)
    4
    
  • 行列によって要素を指定し,指定された要素による行列も作れます.
    > a=[1,100,10]
    > a([[1,2],[2,3]])
    [[1,100],[100,10]]
    
    
    

    要素の抽出,並び換え

  • 小さい順の並び換え(sort)
    > a=[1,100,10]
    > list=sort(a)
    > list
    [1,3,2]
    > a(list)
    [1,10,100]
    
  • 要素の抽出(where)
    > a=[1,100,10]
    > list=where(a>4)
    > list
    [2,3]
    > a(list)
    [100,10]
    

    行列の次元を変える操作

  • 次元の引き伸ばし(-).
    > a=[1,2,3,4,5,6]
    > a(,-:1:2)
    [[1,2,3,4,5,6],[1,2,3,4,5,6]]
    > a(-:1:2,)
    [[1,1],[2,2],[3,3],[4,4],[5,5],[6,6]]
    
  • 次元をつぶす(*).
    > b=[[1,2,3],[4,5,6]]
    > b(*)
    [1,2,3,4,5,6]
    
  • 平均(avg),最大(max),最小(min),差分(dif)
    > b=[[1,2,3],[4,5,6]]
    > avg(b)
    3.5
    > max(b)
    6
    > min(b)
    1
    > b(avg,)
    [2,5]
    > b(max,)
    [3,6]
    > b(min,)
    [1,4]
    > b(dif,)
    [[1,1],[1,1]]
    
  • 行列のサイズ(numberof),次元(dimsof)
    > b=[[1,2,3],[4,5,6]]
    > numberof(b)
    6
    > dimsof(b)
    [2,3,2] (2次元配列で具体的には3X2という意味)