ドキュメンテーション センター

  • 評価版
  • 製品アップデート

最新のリリースでは、このページがまだ翻訳されていません。 このページの最新版は英語でご覧になれます。

行列の作成と連結

概要

最も基本的な MATLAB® データ構造は、行列です。行列は 2 次元の矩形データ構造で、複数のデータ要素を簡単にアクセスできるような形態で保存できます。保存するデータ要素は数字、文字、true または false の論理状態、またはその他の MATLAB 構造タイプのいずれでもかまいません。MATLAB は、これらの 2 次元の行列を使用して、1 つの数や数の線形列も保存します。このような場合、次元は 1 行 1 列、または 1 行 n 列の対応で、ここで n は一連の数字の長さを表します。MATLAB は 2 次元よりも大きいデータ構造もサポートしています。これらのデータ構造は、MATLAB ドキュメンテーションでは配列と呼びます。

MATLAB は、行列ベースの計算環境です。MATLAB に入力するデータはすべて、行列または多次元配列の形式で保存されます。100 のような 1 つの数値でも行列 (この場合、1 行 1 列次元をもつ行列) として保存されます。

A = 100;

whos A
  Name      Size                   Bytes  Class

  A         1x1                        8  double array

数字、文字、true または false の論理データなど、使用するクラスに関係なく、MATLAB はこのデータを行列 (または配列) 形式で保存します。たとえば 'Hello World' という文字列は、MATLAB では 1 行 11 列の個々の文字から成る行列です。MATLAB では、クラスを複合した行列である、構造体やセル配列も作成できます。

数字や文字などの基本データ要素の行列を作成するには、次を参照してください。

他の行列から構成された行列を作成するには、次を参照してください。

単純な行列の作成

MATLAB で行列を最もシンプルに作成する方法は、行列を作成する演算子 [] を使用することです。要素を大かっこ内に入力して (以下の E のように) 行列内に列を作成します。各要素をコンマまたはスペースで区切ります。

row = [E1, E2, ..., Em]          row = [E1 E2 ... Em]

たとえば、5 つの要素から構成される 1 行を作成するには、次のように入力します。

A = [12 62 93 -8 22];

新しい行を開始するには、セミコロンを使って現在の行を終了します。

A = [row1; row2; ...; rown]

この例では 3 行 5 列 (すなわち 3 行 5 列の) の数値行列を作成します。すべての行が同数の要素をもたなければならないことに注意してください。

A = [12 62 93 -8 22; 16 2 87 43 91; -4 17 -72 95 6]
A =
    12    62    93    -8    22
    16     2    87    43    91
    -4    17   -72    95     6

大かっこ演算子は 2 次元の行列だけを作成します (0 行 0 列、1 行 1 列、1 行 n 列の行列を含む)。2 次元よりも大きい配列を作成する場合は、「多次元配列の作成」を参照してください。

行列要素の読み取りや上書き方法については、「行列のインデックス」を参照してください。

符号付き数値の入力

符号付き数値を行列に入力する場合、符号を数値の直前に置いてください。次の 2 式は等価ですが、

   7 -2 +5                                 7 - 2 + 5
   ans =                                     ans =
       10                                        10

次の 2 式は等価ではないことに注意してください。

   [7 -2 +5]                              [7 - 2 + 5]
   ans =                                     ans =
        7    -2     5                            10

特殊な行列関数

MATLAB には多数の関数があり、さまざまな種類の行列を作成できます。ハンケル行列やヴァンデルモンド行列のような特殊な行列を作成する関数もあります。次の表に示す関数は、より一般的な使用のための行列を作成します。

関数

説明

ones

すべて 1 の行列または配列を作成します。

zeros

すべて 0 の行列または配列を作成します。

eye

対角要素が 1 でその他の要素が 0 の行列を作成します。

accumarray

入力した行列を、出力行列内の特定の位置に分布させ、累積を可能にします。

diag

ベクトルから対角行列を作成します。

magic

合計値が同一になるような行、列、対角要素を使って正方行列を作成します。

rand

一様分布する乱数から成る行列または配列を作成します。

randn

正規分布した乱数と配列から成る、行列または配列を作成します。

randperm

特定の整数をランダムに置き換えたベクトル (1 行 n 列の行列) を作成します。

これらの関数の大部分は、double 型 (倍精度浮動小数点) の行列を返します。ただし、関数 ones、関数 zeros、関数 eye を使用して数値型の基本的な配列を容易に作成できます。

これを行うには、最後の引数として MATLAB クラス名を指定します。

A = zeros(4, 6, 'uint32')
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

ここでは関数の使用法を示します。

魔方陣行列の作成-  魔方陣は各列内、各行内、または各対角の要素の合計が同一の行列です。5 行 5 列の魔方陣行列を作成するには、次のような関数 magic を使用します。

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

各行、各列、各対角要素の合計が次の同じ値になる点に注意してください: 65.

対角行列の作成-  関数 diag を使って、ベクトルを基にした対角行列を作成します。次のように、行列の主対角線上にベクトルを配置したり、主対角線より上か下の対角線上にベクトルを配置することができます。-1 と入力すると、主対角線より 1 つ下の行にベクトルを配置します。

A = [12 62 93 -8 22];

B = diag(A, -1)
B =
     0     0     0     0     0     0
    12     0     0     0     0     0
     0    62     0     0     0     0
     0     0    93     0     0     0
     0     0     0    -8     0     0
     0     0     0     0    22     0

行列の連結

行列の連結は、1 つ以上の行列を結合して、新しい行列を作る操作です。前述の大かっこ演算子 [] をここで使用すると、行列コンストラクターとしてだけではなく、MATLAB 連結演算子としても機能します。式 C = [A B] は、行列 AB を水平に連結します。式 C = [A; B] は、垂直に連結します。

次の例は、行列 AB を垂直方向に連結して新規の行列 C を作成します。

A = ones(2, 5) * 6;        % 2-by-5 matrix of 6's
B = rand(3, 5);            % 3-by-5 matrix of random values

C = [A; B]                 % Vertically concatenate A and B
C =
    6.0000    6.0000    6.0000    6.0000    6.0000
    6.0000    6.0000    6.0000    6.0000    6.0000
    0.9501    0.4860    0.4565    0.4447    0.9218
    0.2311    0.8913    0.0185    0.6154    0.7382
    0.6068    0.7621    0.8214    0.7919    0.1763

矩形行列の維持

最終的に生成される行列が (以下で 2 番目に示しているような) 無効な形状にならない限り、連結によって行列、または複数次元の配列も作成できます。水平方向の行列を作成している場合、構成要素となる各行列の行数は同じでなければなりません。垂直方向に作成する場合、各構成要素の列数は同じでなければなりません。

次のダイアグラムは、高さが同じ (つまり、同じ行数) 2 つの行列が水平に連結して新たな行列になることを表しています。

次のダイアグラムでは高さの異なる 2 つの行列を水平に結合しようとしています。しかし、MATLAB ではこれを行うことができません。

行列連結関数

次の関数を使うと既存の行列を連結して、新しい行列を作成することができます。

関数

説明

cat

特定の次元で行列を連結します。

horzcat

行列を水平に連結します。

vertcat

行列を垂直に連結します。

repmat

既存の行列をコピーおよびタイリングして、新しい行列を作成します。

blkdiag

既存の行列を基に、ブロック対角行列を作成します。

ここでは関数の使用法を示します。

行列と配列の連結-  連結用に演算子 [] を使用する代わりに、関数 cat、関数 horzcat、関数 vertcat という 3 つの関数を使用することができます。これらの関数を使用して、特定の次元で行列 (または多次元配列) を作成できます。次のいずれかのコマンドを使うことで、「行列の連結」で使用したコマンドC = [A; B] と同じ結果が得られます。

C = cat(1, A, B);       % Concatenate along the first dimension
C = vertcat(A, B);      % Concatenate vertically

行列のコピー-  関数 repmat を使って、既存の行列のコピーで構成される行列を作成できます。次のように入力した場合、

repmat(M, v, h)

MATLAB は入力された行列 Mv 回垂直にコピーし、h 回水平にコピーします。たとえば、既存の行列 A をコピーして、新たな行列 B にするには、以下を使用します。

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

B = repmat(A, 2, 4)
B =
   8   1   6   8   1   6   8   1   6   8   1   6
   3   5   7   3   5   7   3   5   7   3   5   7
   4   9   2   4   9   2   4   9   2   4   9   2
   8   1   6   8   1   6   8   1   6   8   1   6
   3   5   7   3   5   7   3   5   7   3   5   7
   4   9   2   4   9   2   4   9   2   4   9   2

ブロック対角行列の作成-  関数 blkdiag を使用すると、行列を対角方向に連結して、ブロック対角行列を作成することができます。新しく作成された行列の他の要素はすべて 0 に設定されます。

A = magic(3);
B = [-5 -6 -9; -4 -4 -2];
C = eye(2) * 8;

D = blkdiag(A, B, C)
D =
   8   1   6   0   0   0   0   0
   3   5   7   0   0   0   0   0
   4   9   2   0   0   0   0   0
   0   0   0  -5  -6  -9   0   0
   0   0   0  -4  -4  -2   0   0
   0   0   0   0   0   0   8   0
   0   0   0   0   0   0   0   8

数列の生成

行列や配列の作成およびインデックス付けでは数列を使用すると便利なことが多いため、MATLAB では数列を作成するための特殊な演算子を提供しています。

この節では、次のことを説明します。

コロン演算子

コロン演算子 (first:last) は、値 first から last までの、1 行 n 列 (すなわちベクトル) を作成します。既定の数列は、1 ずつインクリメントする値で構成されます。

A = 10:15
A =
    10    11    12    13    14    15

数列は必ずしも正の整数である必要はありません。負の数や分数を含むこともできます。

A = -2.5:2.5
A =
   -2.5000   -1.5000   -0.5000    0.5000    1.5000    2.5000

既定では、MATLAB は数列を作成時、たとえ終了値が開始値から整数量の間隔ではない場合でも、常に 1 ずつインクリメントします。

A = 1:6.3
A =
     1     2     3     4     5     6

さらに、コロン演算子で作成される既定の数列は、デクリメントではなく必ずインクリメントします。この例の演算では、9 から 1 までインクリメントさせようと試みるので、MATLAB は空行列を返します。

A = 9:1
A =
   Empty matrix: 1-by-0

次の節では、既定以外の数列の生成方法を説明します。

ステップ値でのコロン演算子の使用

1 ずつインクリメントする既定設定を使用しない数列を生成するには、コロン演算子を使って追加の値を指定します (first:step:last)。開始と終了値の間に、ステップ値を設定し、生成する値と値の間でいくつインクリメント (ステップ値が負の値の場合はデクリメント) するのかを MATLAB に指示します。

10 から 50 に 5 ずつインクリメントする数列を生成するには、次を使用します。

A = 10:5:50
A =
    10    15    20    25    30    35    40    45    50

整数値以外を使用してインクリメントさせることができます。この例では 0.2 ずつインクリメントします。

A = 3:0.2:3.8
A =
    3.0000    3.2000    3.4000    3.6000    3.8000

徐々にデクリメントする数列を作成するには、負のステップ値を指定します。

A = 9:-1:1
A =
    9    8    7    6    5    4    3    2    1
この情報は役に立ちましたか?