Main Content

このページの翻訳は最新ではありません。ここをクリックして、英語の最新版を参照してください。

インデックス

添字付け

Ai番目の行、j番目の列の要素をA(i,j)と定義します。たとえば(4,2)は 4 番目の行の 2 番目の列の数字です。この例で使っている魔方陣では(4,2)15です。Aの 4 番目の列の要素の和は、次のように入力することで求まります。

(1、4)+(2、4)+(3、4)+一个(4,4)

これにより、

ans = 34

しかし単一の列の和を計算する方法では、最も洗練されていない方法です。

これは単一の添字をもつ行列要素 (たとえばA(k)) と考えることもできます。単一の添字は、行ベクトルと列ベクトルを参照する通常の方法です。しかし、2 次元の行列にも適用することができます。この場合、もとの行列を列方向に分解して作られる一つの長い列ベクトルとしての配列と考えられます。それを使って、例で使っている魔方陣において、A(8)(4,2)に格納されている値15と考えることもできます。

行列で定義されている要素以外のものを使おうとすると、エラーが生じます。

t = A(4,5)
インデックスが行列の次元を超えています。

一方、行列で定義されている要素以外の要素に値を格納しようとすると、新しい要素を行列に付加えてサイズが大きくなります。

X = A; X(4,5) = 17 X = 16 3 2 13 0 5 10 11 8 0 9 6 7 12 0 4 15 14 1 17

コロン演算子

コロン記号:はMATLAB®の重要な演算子の一つです。これは種々の異なる型で使われます。式

1:10

は、1 から 10 までの整数を含む行ベクトルを作成します。

1 2 3 4 5 6 7 89 10

単位間隔でないものを得るには、間隔を示す量を設定します。たとえば、次の例を考えてみましょう。

100:-7:50

これは次のようになります。

100 93 86 79 72 65 58 51

および

0:pi/4:pi

これは次のようになります。

0 0.7854 1.5708 2.3562 3.1416

コロン記号を含んだ添字表現は、行列のある一部を表現します。

A(1:k,j)

は、Aj番目の列の最初からk番目までの要素に対応します。したがって、次のようになります。

sum(A(1:4,4))

は、4 番目の列の和を計算することになります。しかし、この計算を実行するには、さらに良い方法があります。コロン自身は、行列の行または列の中の"全部" の要素を意味しています。そして、キーワードendは、行または列の"最後" を意味します。したがって、次のようになります。

sum(A(:,end))

は、Aの最後の列の要素の和を計算します。答えは、

ans = 34

なぜ、4 行 4 列の正方形に対して、魔方陣の和は 34 なのですか。1 から 16 までの整数は、和が等しくなるように 4 つのグループに並べ替えられたとすると、その和は、

sum(1:16)/4

にならなければなりません。それでもちろん次のようになります。

ans = 34

連結

"連結" は、小さな行列を合わせてより大きな行列にする作業です。実際に、最初の行列は、個々の要素を連結して作ったものです。一組の大かっこ[]がその連結演算子です。たとえば、4 行 4 列の魔方陣Aを使って、次の形式を作成します。

B = [A A+32; A+48 A+16]

結果は、4 つの小行列を連結した 8 行 8 列の行列になります。

B = 16 3 2 13 48 35 34 45 5 10 11 8 37 42 43 40 9 6 7 12 41 38 39 44 4 15 14 1 36 47 46 33 64 51 50 61 32 19 18 29 53 58 59 56 21 26 27 24 57 54 55 60 25 22 23 28 52 63 62 49 20 31 30 17

この行列は、別の魔方陣を作成する方法の途中結果になっています。この要素は、整数1:64を並べ替えたもので、その列の和は、8 行 8 列の魔方陣行列の各列の和と等しい値になります。

sum(B) ans = 260 260 260 260 260 260 260 260

しかし、その行の和sum(B')'は、すべて同じものにはなりません。正しい 8 行 8 列の魔方陣を作成するには、さらに操作が必要です。

行と列の削除

大かっこ [ ] を使って、行列から行や列を削除することができます。次のように指定します。

X = A;

そして、Xの 2 番目の列を削除するため、次のように行います。

X(:,2) = []

Xは次のようになります。

X = 16 2 13 5 11 8 9 7 12 4 14 1

行列から単一要素を削除する場合、結果はもはや行列になりません。すなわち、次のような表現

X(1,2) = []

は、エラーになります。しかし、単一の添字を使って、単一要素または連続している要素群を削除して、残りの要素を行ベクトルとして表現することはできます。したがって

X(2:2:10) = []

結果は次のようになります。

X = 16 9 2 7 13 12 1

スカラー拡張

行列とスカラーは、種々の方法で組み合わされます。たとえば、スカラーは行列との減算では、行列の各要素から自分自身を差し引きます。例の魔方陣の要素の平均値は 8.5 です。

B = A - 8.5

は、列の和がゼロになる行列を作成します。

B = 7.5 -5.5 -6.5 4.5 -3.5 1.5 2.5 -0.5 0.5 -2.5 -1.5 3.5 -4.5 6.5 5.5 -7.5 sum(B) ans = 0 0 0 0

スカラーの拡張と共に、MATLAB は範囲内のすべてのインデックスに指定したスカラー値を与えることができます。たとえば、次の例を考えてみましょう。

B(1:2,2:3) = 0

これによってBの一部分がゼロに設定されます。

B = 7.5 0 0 4.5 -3.5 0 0 -0.5 0.5 -2.5 -1.5 3.5 -4.5 6.5 5.5 -7.5

論理添字

論理演算や比較演算から作成される論理ベクトルが、サブ配列を参照するのに使われます。Xを通常の行列で、Lをある論理演算の結果求まった同じサイズの行列とします。そして、X(左)は、Lの要素がゼロでない部分のXの要素を指定します。

この種の添字機能は、添字表現と同じように論理演算を指定することにより 1 手順の中で処理されます。次のデータを考えましょう。

x = [2.1 1.7 1.6 1.5 NaN 1.9 1.8 1.5 5.1 1.8 1.4 2.2 1.6 1.8];

NaNは、アンケート質問表での無回答に対応する項目のような、データの欠測部分です。論理インデックス付けによって欠測データを取り除くためにisfinite(x)を使うと、有限の数値は真、NaNInfは偽となります。

x = x(isfinite(x)) x = 2.1 1.7 1.6 1.5 1.9 1.8 1.5 5.1 1.8 1.4 2.2 1.6 1.8

ある観測値5.1は、他のものと比べ非常に異なって見えます。これを"外れ値" と言います。ここでの例では、平均値から標準偏差の 3 倍を超える部分を外れ値として取り除きます。

x = x(abs(x-mean(x)) <= 3*std(x)) x = 2.1 1.7 1.6 1.5 1.9 1.8 1.5 1.8 1.4 2.2 1.6 1.8

他の例として、デューラーの魔方陣の中で、論理インデックス付けとスカラー拡張法を使って素数でないものに 0 を設定して素数の位置を強調します (関数 magicを参照)。

A(~isprime(A)) = 0 A = 0 3 2 13 5 0 11 0 0 0 7 0 0 0 0 0

関数 find

関数findは、任意の論理条件を満たす配列要素のインデックスを判別します。この最も簡単な型では、関数findがインデックスの列ベクトルを出力します。インデックスの行ベクトルを得るためには、そのベクトルを転置します。たとえば、デューラーの魔方陣で再び始めます。関数 magicを参照してください。

k = find(isprime(A))'

は、1 次元のインデックス法を使って、魔方陣の中の素数の位置を出力します。

k = 2 5 9 10 11 13

これらの素数を表示するのに、kにより決められた順番に行ベクトルとして配列します。

A(k) ans = 5 3 2 11 7 13

代入ステートメントで左辺のインデックスとしてkを使用すると、行列構造は保持されます。

A(k) = NaN A = 16 NaN NaN NaN NaN 10 NaN 8 9 6 NaN 12 4 15 14 1