概要

MATLABの言語に使用される行列の基本概念と計算方法を説明します。

1 基本概念

MATLABの言語では、基本的な計算ユニットは「行列」です。例えば、$x=1.0$という変数$x$は$1\times 1$行列として扱っています。

以下はベクトルや行列の作成方法、成分のアクセス、行列のサイズの取得など基本的な概念を説明します。

In [5]:
x=1.0
size(x)

x=[10,10]
size(x)

size(x,1)
size(x,2)
x =  1
ans =

   1   1

x =

   10   10

ans =

   1   2

ans =  1
ans =  2

1.1 ベクトルの操作・演算

長さが$n$であるベクトルは$n \times 1$の行列又は$1 \times n$の行列と考えられます。 ベクトルの生成、演算は特別な命令が用意されています。

以下の例を試してみてください。 

注意:各行の「%」の後の部分はコメントとなります。

In [9]:
% 1から8までの数列xを作成します。以下のxは横のベクトルとなります。
x=1:8

% xの転置、即ちたてのベクトルを作ります。
x = x'

x=0:3:20; % 0から20まで間隔が3である数列を作成する。
newx=18:-3:0;

x
newx
x =

   1   2   3   4   5   6   7   8

x =

   1
   2
   3
   4
   5
   6
   7
   8

x =

    0    3    6    9   12   15   18

newx =

   18   15   12    9    6    3    0

1.2 変数の出力

各行の最後に「;」で終了する場合、該当行の結果は画面に出力されません。

変数を指定されるフォマットで出力したい場合、printfを使用すること。

以下の命令を実行してみてください。

説明

  • "%10.5f"のようなフォマットによって、指定される形で数の出力ができます。
  • "%10.5f":全部10桁の長さで数を出力して、小数点の後に、5桁を表示します。出力となるの桁の数は10未満の場合、出力の文字列の前に、空白が自動的に補充されます。出力となるの桁の数は10に超える場合、表示の長さの制限が無視されます。
In [25]:
% a, bを指定されるフォマットで出力する。

a=87654321.12345678; b=123.123456789;
printf('a=%.5f, b=%10.5f.\n', a,b)
printf('a=%.5f, b=%.5f.\n\n', a,b)


% ベクトルを出力する
x = 1:8;
printf('Vector x:\n');
printf('%d\n',x);

%displayという命令を利用して、値を出力することができます。
display(x)
a=87654321.12346, b= 123.12346.
a=87654321.12346, b=123.12346.

Vector x:
1
2
3
4
5
6
7
8
   1   2   3   4   5   6   7   8

1.3 行列の作成

In [18]:
% 2行3列の行列を作成する。

x=[1,2,3 ; 4,5,6 ; 7,8,9]
x =

   1   2   3
   4   5   6
   7   8   9

In [16]:
% (縦の)ベクトル y を作成する。
% 「;」の使い方に注意しなさい。
y=[1,2,3,4,5,6]
y=[1;2;3;4;5;6]
Out[16]:
y =

   1   2   3   4   5   6

y =

   1
   2
   3
   4
   5
   6

In [17]:
% 行列Aを作成する。

A = [1,2,3,4; 5,6,7,8; 9,10,11,12]
A = [1 2 3 4; 5 6 7 8; 9 10 11 12]
Out[17]:
A =

    1    2    3    4
    5    6    7    8
    9   10   11   12

A =

    1    2    3    4
    5    6    7    8
    9   10   11   12

In [18]:
% 行列のサイズを調べるために、sizeを使う

size(A)
Out[18]:
ans =

   3   4

演習1 

  • 以下の行列を入力してください。 $$ A=\left( \begin{array}{cccc} 2 & 1 & 0 & 0 \\ -1 & 2 & 1 & 0 \\ 0 & -1 & 2 & 1 \\ 0 & 0 & -1 & 2 \end{array}\right) $$
  • 区間$[0,2\pi]$の等分割を作成する。分割数(分割される小区間の数)を$20$とする。
In [3]:
% 練習の解答をここに書いてください。

1.4 ベクトル・行列成分のアクセス

ベクトルまたは行列の成分をアクセスするために、演算子「()」を使用します。例えば、「x(3)」はベクトルの第3成分を取ります。 演算子「()」を使って、ベクトルの成分の値の修正もできます。

In [26]:
x=1:2:10
x(3) %xの第3成分と取ります。
x(3)=1000 %xの第3成分の値を修正します。
x =

    1    3    5    7    9

ans =  5
x =

      1      3   1000      7      9

行列の成分を取るために、「A(i,j)」という形を使用します。 また、行列の部分行列をアクセスするために、「A(i_list, j_list)」という命令を使用します。ここで、i_listは行の番号のリスト、j_listは列の番号のリストです。

In [32]:
A = [1,2,3,4; 5,6,7,8; 9,10,11,12]

% Aの第(2,3)成分
display('Aの第2行、第3列の成分')
A(2,3) 

% Aの第1,2行、第2,3列が成す部分行列
display('Aの第1,2行、第2,3列が成す部分行列')
A(1:2,2:3)

% Aの第1,3行、第1,4列が成す部分行列
display('Aの第1,3行、第1,4列が成す部分行列')
A([1,3],[1,4])
A =

    1    2    3    4
    5    6    7    8
    9   10   11   12

Aの第2行、第3列の成分

ans =  7
Aの第1,2行、第2,3列が成す部分行列

ans =

   2   3
   6   7

Aの第1,3行、第1,4列が成す部分行列

ans =

    1    4
    9   12

In [24]:
% Aの第1,2行、第2,3列の値を修正する。
A(1:2,2:3)=100
Out[24]:
A =

     1   100   100     4
     5   100   100     8
     9    10    11    12

In [20]:
%行列の対角成分
A = [1,2,3,4; 5,6,7,8; 9,10,11,12; 13,14,15,16]
diag(A)
A =

    1    2    3    4
    5    6    7    8
    9   10   11   12
   13   14   15   16

ans =

    1
    6
   11
   16

ベクトルまたは行列のすべての成分をとるために、「:」を使います。特に、以下の行列のすべての成分を取るとき、出力の結果の並び順番を確認してください。

In [45]:
x=1:5
display('ベクトルxのすべての成分')
x(:)

A=[1,3;2,4]
display('行列Aのすべての成分')
A(:)
x =

   1   2   3   4   5

ベクトルxのすべての成分

ans =

   1
   2
   3
   4
   5

A =

   1   3
   2   4

行列Aのすべての成分

ans =

   1
   2
   3
   4

1.5 ベクトルの成分を1つづつアクセスする方法

for文を使って、ベクトルの成分を1つづつアクセスすることができます。

for文の使用:以下の例では、ベクトルの各成分を取って、xに格納して、表示します。

for x = vec
   display(x)
end
以下の例では、vecの各成分の2乗の和を計算しています。

In [36]:
vec = 1:5;
mysum = 0;
for x = vec
  mysum = mysum + x*x;
end
mysum
mysum =  55

演習 2

ベクトルxの各成分の並びを逆にしなさい。つまり、xの第1成分を最後に移動し、xの第2成分を後から2番に移動し、...という作業です。

In [38]:
x=[1,2,3,4,5,6,7,8,9,10]
x =

    1    2    3    4    5    6    7    8    9   10

1.6 特殊な行列の作成

以下は幾つかの特殊な行列を作成するための命令を紹介する。

  • 単位行列
  • すべての要素が0である行列
  • すべての要素が1である行列
  • 乱数行列

$5\times 5$単位行列の作成

In [12]:
A = eye(5)
A =

Diagonal Matrix

   1   0   0   0   0
   0   1   0   0   0
   0   0   1   0   0
   0   0   0   1   0
   0   0   0   0   1

すべての要素が0である行列の作成

In [13]:
A = zeros(5,5)
A =

   0   0   0   0   0
   0   0   0   0   0
   0   0   0   0   0
   0   0   0   0   0
   0   0   0   0   0

すべての要素が1である行列の作成

In [14]:
A = ones(5,5)
A =

   1   1   1   1   1
   1   1   1   1   1
   1   1   1   1   1
   1   1   1   1   1
   1   1   1   1   1

ベクトルによる対角行列を作成する。

In [21]:
% ベクトルを作成する。
x = 1:5
% 対角は x である行列を作成する。
A = diag(x)
diag(A)
x =

   1   2   3   4   5

A =

Diagonal Matrix

   1   0   0   0   0
   0   2   0   0   0
   0   0   3   0   0
   0   0   0   4   0
   0   0   0   0   5

ans =

   1
   2
   3
   4
   5

0から1までの一様乱数がなす乱数行列の作成

In [11]:
A = rand(3,4)
A =

   0.378133   0.712852   0.457009   0.579505
   0.847781   0.244921   0.015816   0.245461
   0.012926   0.689325   0.804227   0.694227

1.7 ベクトルのノルム

長さが$n$であるベクトル$x$のユークリッドノーム($\|x\|_2$と書く)は $$\|x\|_2 =\sqrt{\sum_{i=1}^n x(i)^2}$$ である。

$x$の最大値ノルム($\|x\|_\infty$)は $$ \|x\|_\infty =\max (|x(i)|) $$ である。

In [37]:
% ベクトルのノルム
x = [1,2,3,4]

x_norm1 = norm(x)
x_norm2 = norm(x,'inf')
x =

   1   2   3   4

x_norm1 =  5.4772
x_norm2 =  4

レポート課題 1 

以下の条件を満たす行列をMATLABの言語で作成しなさい。

  • 行列のサイズ:$20 \times 20$
  • 対角は$1$である
  • 第1列、第20列、第1行、第20行の成分は全部$1$である
  • 第9列から第11列までの第9行から第11行までは全部$1$である。
  • その以外の成分は$0$である。

コーヒーブレイク

以下のコードによってどのような行列がつくれますか?

x=zeros(10,10)
x(:)=1:100

また、以下の命令は上記のコードと同じ行列を作っています。その理由を考えてください。

reshape(1:100,[10,10])
In [ ]: