行列の扱い方, MATLAB

12-28-2014 updated

  1. 行列を作る
  2. 行列から任意の行,列を取り出す
  3. 行列から任意の行を取り除く
  4. 行列の特定の要素を置換する
  5. 複数の行列を合一する


行列を作る


詳細は データの作成 を参照。ここには,簡単な例のみを示しておきます。

 

  • 手打ちで作る。>> x=[1 1 2 2 3 3]
  • rand 関数で乱数行列を作る。>> rand(1 5) で 1 行 5 列の行列ができる。
  • normrnd 関数で,正規分布に従う乱数行列を作る。>> normrnd(mean,sd,row,column)
  • magic 関数で魔方陣の行列を作る。>> magic (n) で,n x n 行の魔方陣ができる。

 

行列から任意の行,列を取り出す


2 次元行列


m x n 行列から,指定した列や行だけを取り出すコマンドは以下の通りである。5 x 5 の魔法陣行列 A を使って試してみる。

 

>> A=magic(5);

>> A

A =

    17    24     1     8    15

    23     5     7    14    16

     4     6    13    20    22

    10    12    19    21     3

    11    18    25     2     9

 

  • >> A(i,:) m x n 行列 A の i 行目を取り出す。
  • >> A(i:j,:) m x n 行列 A の i 行目から j 行目までを取り出す。
  • >> A(i:k:j,:) m x n 行列 A の i 行目から k 行おきに j 行目までを取り出す。
  • >> A(:,i) m x n 行列 A の i 列目を取り出す。
  • >> A(:,i:j) m x n 行列 A の i 列目から j 列目までを取り出す。
  • >> A(:,i:k:j) m x n 行列 A の i 列目から k 列おきに j 列目までを取り出す。
  • >> A(end) 最後の要素を取り出す。この行列の場合は 9 になる。
  • >> A(i,end) i 行目の最後の要素を取り出す。A(2,end) なら 16 になる。

  

>> A(1,:)

ans =

    17    24     1     8    15

 

>> A(:,1)

ans =

    17

    23

     4

    10

    11

 

>> A(1:3,:)

ans =

    17    24     1     8    15

    23     5     7    14    16

     4     6    13    20    22

行列から任意の行を取り除く


MATLAB では,行を取り除く作業は空行列 [ ] の挿入によって行う

 

>> a=magic(5)

a =

    17    24     1     8    15

    23     5     7    14    16

     4     6    13    20    22

    10    12    19    21     3

    11    18    25     2     9


>> a(2,:)=[]

a =


    17    24     1     8    15

     4     6    13    20    22

    10    12    19    21     3

    11    18    25     2     9


行列の特定の要素を置換する

  • NaN を扱いたい場合は,find でなく isnan
  • find の説明

find を使う方法


大きい行列の方が直感的に理解しやすいと思うので,10 x 10 の魔法陣行列での例を載せてみます。

 

>> A=magic(10)

A =

    92    99     1     8    15    67    74    51    58    40

    98    80     7    14    16    73    55    57    64    41

     4    81    88    20    22    54    56    63    70    47

    85    87    19    21     3    60    62    69    71    28

    86    93    25     2     9    61    68    75    52    34

    17    24    76    83    90    42    49    26    33    65

    23     5    82    89    91    48    30    32    39    66

    79     6    13    95    97    29    31    38    45    72

    10    12    94    96    78    35    37    44    46    53

    11    18   100    77    84    36    43    50    27    59

 

この中で,1 行 3 列目にある 1 を 0 に置換したい場合には,以下の手順を踏む。

 

>> C=find(A==1); % 単に find を使うと答えが ans になってしまうので,C に代入する形をとる。

>> C

C =

    21

 

ここで,A=1 だとエラーになる。MATLAB では = は代入を意味する演算子で,等しいことを意味しないためである。

 

find 関数は,() 内の条件にあてはまる位置を与える。ここでは 21 であり,これは A を左上から下に 1, 2, 3... と数えていったときの 21 番目なので,おそらくこのようにして数えているのであろう。しかし,この数え方の意味がわからなくても,

 

>> A(C)=0

A =

    92    99     0     8    15    67    74    51    58    40

    98    80     7    14    16    73    55    57    64    41

     4    81    88    20    22    54    56    63    70    47

    85    87    19    21     3    60    62    69    71    28

    86    93    25     2     9    61    68    75    52    34

    17    24    76    83    90    42    49    26    33    65

    23     5    82    89    91    48    30    32    39    66

    79     6    13    95    97    29    31    38    45    72

    10    12    94    96    78    35    37    44    46    53

    11    18   100    77    84    36    43    50    27    59

 

となり,0 に置換されていることがわかる。

 

>> A(C)=0 は,A の中の position C の要素を 0 に置換せよという意味になる。

 

同じことを find をやらずに行う方法


上の作業は,

 

>> A(A==1)=0;

 

で一発で出来てしまう(2)。


  • 条件は A==1 だけでなく A > 1 などでも OK。

 

複数の行列を合一する

>> A=normrnd(2,1,10,1)

%データの作成で使った normrnd 関数を使います。平均2,標準偏差1の正規分布の 10 x 1 行列。

 

A =
    2.0662
    2.6524
    2.3271
    3.0826
    3.0061
    1.3491
    2.2571
    1.0556
    0.6782
    2.9248

>> B=normrnd(1,1,10,1); %スペース節約のため,B は表示しないように ; を追加。
>> X=[A B] %A と B を X に合一します。
X =
    2.0662    1.0000
    2.6524    0.9451
    2.3271    1.9111
    3.0826    1.5946
    3.0061    1.3502
    1.3491    2.2503
    2.2571    1.9298
    1.0556    1.2398
    0.6782    0.3096
    2.9248    0.3484

  • >> Y=[A;B]>> Z=A+B も試してみましょう。
  • この X を boxplot 関数のページで使っています。
コメント: 0

References

  1. http://moki-mokki.blogspot.com/2011/05/matlab.html
  2. matlab: find いらずの一発参照・代入. Web.