HOWTO · MATLAB

MATLAB の meshgrid()関数

MATLAB の meshgrid() が座標ベクトルを行列に変換する仕組みを学び、2 次元グリッド全体で関数を評価し、結果を surf() で可視化します。

このページの内容

MATLAB の meshgrid() は座標ベクトルを座標行列に変換します。これにより、2 次元グリッドのすべての点で関数を評価し、その結果の値をプロットできます。以下の例では、行列の向きが分かりやすいように、x 座標と y 座標の個数を変えています。

meshgrid() が座標を割り当てる仕組み

小文字の入力ベクトルで meshgrid(x, y) を呼び出します。戻り値は大文字の行列 X と Y です。X の各行は x 座標を繰り返し、Y の各列は 1 つの y 座標を繰り返します。行は y の値に対応し、列は x の値に対応します。

たとえば、x = 1:4 は 4 つの値を持ち、y = 1:6 は 6 つの値を持ちます。結果の X と Y はそれぞれ 6 行 4 列になります。グリッドを確認したり、関数の値の行列と対応付けたりする際には、この向きを覚えておくと便利です。

2 次元座標グリッドを作成する

この自己完結型で Octave 互換の例では、正方形でないグリッドを作成し、すべての座標ペアで関数を評価し、結果の曲面を描画します。座標パターンのコンパクトな表示と行列サイズを出力します。

warning('off', 'Octave:gnuplot-graphics');
set(0, 'defaultfigurevisible', 'off');
x = 1:4;
y = 1:6;
[X, Y] = meshgrid(x, y);
Z = X.^2 + Y.^2;

fprintf('X(1,:) =');
fprintf(' %g', X(1,:));
fprintf('\nY(:,1) =');
fprintf(' %g', Y(:,1));
fprintf('\nsize(Z) = %d %d\n', size(Z));
surf(X, Y, Z);

出力の最初の行は、X が各行で 1 2 3 4 を繰り返すことを示しています。Y の最初の列は 1 から 6 までの y 座標を示し、各値がその行全体に繰り返されます。したがって、X(i,j) と Y(i,j) の各ペアが 1 つの座標ペアとなり、Z(i,j) がその点での関数の値を保持します。.^ 演算子は行列の各要素を二乗します。通常の行列の累乗では、この要素ごとの計算は表せません。

X(1,:) = 1 2 3 4
Y(:,1) = 1 2 3 4 5 6
size(Z) = 6 4

グリッド上で関数を評価してプロットする

この例では、座標行列から Z = X.^2 + Y.^2 を計算し、X、Y、Z を surf() に渡します。このワークフローでは、プロットされる各高さが座標ペアに対応するように、Z は X および Y と同じ行数と列数でなければなりません。入力ベクトルのどちらかを変更すると、meshgrid() がグリッドの寸法を変更し、要素ごとの式が対応する値を計算します。

関数のレベルの上面ビューには、surf() の代わりに MATLAB の contour(X, Y, Z) で同じ行列を使用できます。これは等値曲線を可視化するものであり、ここでの追加の実行例ではなく、代替のプロット呼び出しです。

3 次元座標グリッドを作成する

3 次元座標グリッドは、体積全体で評価される量のように、関数が 3 つの空間座標に依存する場合に便利です。この記事では 2 つのベクトルによる meshgrid(x, y) のワークフローを扱い、3 次元の呼び出し構文や出力の寸法は規定していません。このアプローチを 3 つ目の座標に適用する前に、使用する MATLAB リリースのドキュメントを確認してください。