MATLABの言語に使用される行列の基本概念と計算方法を説明します。
MATLABの言語では、基本的な計算ユニットは「行列」です。例えば、$x=1.0$という変数$x$は$1\times 1$行列として扱っています。
以下はベクトルや行列の作成方法、成分のアクセス、行列のサイズの取得など基本的な概念を説明します。
x=1.0
size(x)
x=[10,10]
size(x)
size(x,1)
size(x,2)
長さが$n$であるベクトルは$n \times 1$の行列又は$1 \times n$の行列と考えられます。 ベクトルの生成、演算は特別な命令が用意されています。
以下の例を試してみてください。
注意:各行の「%」の後の部分はコメントとなります。
% 1から8までの数列xを作成します。以下のxは横のベクトルとなります。
x=1:8
% xの転置、即ちたてのベクトルを作ります。
x = x'
x=0:3:20; % 0から20まで間隔が3である数列を作成する。
newx=18:-3:0;
x
newx
% 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)
% 2行3列の行列を作成する。
x=[1,2,3 ; 4,5,6 ; 7,8,9]
% (縦の)ベクトル y を作成する。
% 「;」の使い方に注意しなさい。
y=[1,2,3,4,5,6]
y=[1;2;3;4;5;6]
% 行列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]
% 行列のサイズを調べるために、sizeを使う
size(A)
- 以下の行列を入力してください。 $$ 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$とする。
% 練習の解答をここに書いてください。
ベクトルまたは行列の成分をアクセスするために、演算子「()」を使用します。例えば、「x(3)」はベクトルの第3成分を取ります。 演算子「()」を使って、ベクトルの成分の値の修正もできます。
x=1:2:10
x(3) %xの第3成分と取ります。
x(3)=1000 %xの第3成分の値を修正します。
行列の成分を取るために、「A(i,j)」という形を使用します。 また、行列の部分行列をアクセスするために、「A(i_list, j_list)」という命令を使用します。ここで、i_listは行の番号のリスト、j_listは列の番号のリストです。
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行、第2,3列の値を修正する。
A(1:2,2:3)=100
%行列の対角成分
A = [1,2,3,4; 5,6,7,8; 9,10,11,12; 13,14,15,16]
diag(A)
ベクトルまたは行列のすべての成分をとるために、「:」を使います。特に、以下の行列のすべての成分を取るとき、出力の結果の並び順番を確認してください。
x=1:5
display('ベクトルxのすべての成分')
x(:)
A=[1,3;2,4]
display('行列Aのすべての成分')
A(:)
for文を使って、ベクトルの成分を1つづつアクセスすることができます。
for文の使用:以下の例では、ベクトルの各成分を取って、xに格納して、表示します。
for x = vec display(x) end以下の例では、vecの各成分の2乗の和を計算しています。
vec = 1:5;
mysum = 0;
for x = vec
mysum = mysum + x*x;
end
mysum
ベクトルxの各成分の並びを逆にしなさい。つまり、xの第1成分を最後に移動し、xの第2成分を後から2番に移動し、...という作業です。
x=[1,2,3,4,5,6,7,8,9,10]
$5\times 5$単位行列の作成
A = eye(5)
すべての要素が0である行列の作成
A = zeros(5,5)
すべての要素が1である行列の作成
A = ones(5,5)
ベクトルによる対角行列を作成する。
% ベクトルを作成する。
x = 1:5
% 対角は x である行列を作成する。
A = diag(x)
diag(A)
0から1までの一様乱数がなす乱数行列の作成
A = rand(3,4)
長さが$n$であるベクトル$x$のユークリッドノーム($\|x\|_2$と書く)は $$\|x\|_2 =\sqrt{\sum_{i=1}^n x(i)^2}$$ である。
$x$の最大値ノルム($\|x\|_\infty$)は $$ \|x\|_\infty =\max (|x(i)|) $$ である。
% ベクトルのノルム
x = [1,2,3,4]
x_norm1 = norm(x)
x_norm2 = norm(x,'inf')
以下の条件を満たす行列をMATLABの言語で作成しなさい。
以下のコードによってどのような行列がつくれますか?
x=zeros(10,10) x(:)=1:100
また、以下の命令は上記のコードと同じ行列を作っています。その理由を考えてください。
reshape(1:100,[10,10])