行列計算の基礎(I)

本日の授業では、MATLAB言語に使用される行列の基本概念と計算方法を解説します。

Octave v.s. MATLAB

MATLABはアメリカ合衆国のMathWorks社が開発している数値解析ソフトウェアであり、その中で使うプログラミング言語の名称でもある。 OctaveはMATLABとは同じ言語を使っています。Octaveはフリーソフトウェアであり、使用者は自由にMATLABのコードを実行できるように設計されています。 本授業では、Octaveを使って、MATLAB言語のプログラミング演習を行います。

1 基本概念

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

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

補足

出力の結果に対して変数が用意されてない場合、MATLABは自動的に[ans](answerの省略形)という変数を使って、出力の結果を格納します。

1.1 ベクトルの操作・演算

長さが$n$であるベクトルは$n \times 1$の行列又は$1 \times n$の行列と考えられます。

以下のコードでは、配列を作成しています。

行ベクトルの場合、要素をコンマ (,) またはスペースのいずれかで区切ります。 列ベクトル、または、複数の行をもつ行列を作成するには、行をセミコロンで区切ります。

ベクトル生成の命令

ベクトルの生成、演算は特別な命令が用意されています。

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

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

1.2 変数の出力

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

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

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

説明

1.3 行列の作成

区切りの記号[;]を使って、横のベクトルを一行ずつ並んで行列の作成ができます。

区切りの記号「,」を使って、ベクトルまたは行列を横に並べることができます。

演習1 

  • 2つ以上の方法で以下の行列を作ってください。 $$ 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]$の等分割の配列 $x$ を作成しなさい。分割数(分割後の小区間の数)を$20$とする。

  • $\pi$の値を以下の形で出力しなさい。MATLAB言語では、piという変数を使って、$\pi$の近似値を格納しています。

$$ 3.1415,\quad 3.1, \quad 3.1415926, \quad 3.14e+01 $$

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

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

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

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

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

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

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

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

演習 2

1.6 特殊な行列の作成

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

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

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

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

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

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

1.7 ベクトルのノルム

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

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

レポート課題

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

レポートの作成するとき、新しいNotebookでレポート課題の問題文と解答を書いて、提出してください。


コーヒーブレイク

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

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

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

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

授業担当: 劉 雪峰 最新更新 2021年4月15日 16:15