SHOEISHA iD

※旧SEメンバーシップ会員の方は、同じ登録情報(メールアドレス&パスワード)でログインいただけます

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

PEARライブラリ活用

Math_Vector/Math_Matrixによる
ベクトルと行列の操作方法

PEARライブラリ活用 (9)

  • X ポスト
  • このエントリーをはてなブックマークに追加

 本稿では、簡単な連立一次方程式を解きたいときに役立つようなPEARパッケージであるMath_VectorとMath_Matrixを紹介します。これらは機能も性能もあまり高くはありませんが、PHPの中で手軽に使えるものなので、きっとどこかで役に立つでしょう。

  • X ポスト
  • このエントリーをはてなブックマークに追加

はじめに

 行列やベクトルは、数値計算や三次元CGには欠かせないものです。高性能が求められる数値計算の場合には『PCとスパコンの無理矢理な比較』で紹介しているLAPACKのようなライブラリ、本格的な三次元CGの場合にはDirectXやOpenGLが備えている行列演算機能を利用しますが、そのような場合以外にも、簡単な連立一次方程式を解きたいというのはよくあることです。

 本稿では、簡単な連立一次方程式を解きたいときに役立つようなPEARパッケージであるMath_VectorMath_Matrixを紹介します。これらは機能も性能もあまり高くはありませんが(例えば固有値・固有ベクトルを求めるルーチンが実装されていません)、PHPの中で手軽に使えるものなので、きっとどこかで役に立つでしょう。

必要な環境

 XAMPP for Windows 1.6.4に含まれるPHP 5.2.4で動作を確認しました。利用したPEARのパッケージは以下の通りです。

  • Math_Vector 0.6.2
  • Math_Matrix 0.8.5

準備

 必要なパッケージを次のようにインストールします(コマンドの実行前に、c:\xampp\php\pear.iniの「"\xampp」を「"C:\xampp」に修正)。β版なので、-betaを付けています(ディレクトリはインストール先に応じて適宜読み替えてください)。Math_Matrixが依存しているMath_Vectorも一緒にインストールされます。

c:
cd \xampp\php
pear install --alldeps Math_Matrix-beta

 Math_MatrixはまだPHP 5に対応していないのですが、サポートの終了しているPHP 4を使いたくはないので、簡便な修正を施します。PEAR/Math/Matrix.phpをエディタ等で開いて、「clone()」となっているところをすべて「clone2()」に置き換えてください。これはPHP 5で「clone」がキーワードになったことへの対応です(あまりよい対応方法ではありませんが、Math_Matrixがどのように形でPHP 5に対応してくるかが分からないのでこうしました)。

Math_VectorとMath_VectorOp

 ベクタに関する処理は、Math_VectorMath_Vector2, Math_Vector3, Math_VectorOpで実装されています(主要なものを表にまとめました)。Math_Vectorはベクタを表現するためのクラス、Math_Vector2Math_Vector3Math_Vectorを継承し2次元と3次元に特化したクラス、Math_VectorOpはベクタの演算を静的メソッドで提供するクラスです。

Math_Vectorのメンバ
メンバ名 概要
Math_Vector() コンストラクタ。引数はオプション(配列やMath_Vector等)
cartesianDistance(Math_Vector) デカルト距離を返す
get($i) 第$i成分を返す
getDate() 配列を返す
length() ベクタの長さを返す
normalize() 長さを1にする
scale($f) 要素を$f倍する
set($i, $val) 第$i成分の値を$valにする
size() 要素数を返す
toString() 文字列にする
Math_Vector2のメンバ
メンバ名 概要
getX() X成分を返す
getY() Y成分を返す
setX($val) X成分の値を$valにする
setY($val) Y成分の値を$valにする
Math_Vector3のメンバ
メンバ名 概要
getX() X成分を返す
getY() Y成分を返す
getZ() Z成分を返す
setX($val) X成分の値を$valにする
setY($val) Y成分の値を$valにする
setZ($val) Z成分の値を$valにする
Math_VectorOpのメンバ
メンバ名 概要
add(Math_Vector, Math_Vector) ベクタの加算
angleBetween(Math_Vector2[3], Math_Vector2[3]) 2つのベクタのなす角を返す(Math_Vector2, Math_Vector3のみ)
createBasis($size, $index) 要素数は$size、第$index成分が1、それ以外は0のベクタを返す
createOne($size) 要素数は$size、すべての成分が1のベクタを返す
createZero($size) 要素数は$size、すべての成分が0のベクタを返す
crossProduct(Math_Vector3, Math_Vector3) 外積を返す(Math_Vector3のみ)
dotProduct(Math_Vector, Math_Vector) 内積を返す
scale($f, Math_Vector) $f倍した新しいベクタを返す

 次のようにパッケージをロードして利用します。

require_once 'Math/Vector/Vector.php';
require_once 'Math/Vector/Vector2.php';
require_once 'Math/Vector/Vector3.php';
require_once "Math/Vector/VectorOp.php";

 ベクタオブジェクトは、配列を使って生成します。

$a = new Math_Vector(array(1,2,3));
$b = new Math_Vector(range(1,10));
$c = new Math_Vector3(array(1,2,3));

echo $a->toString()."\n";
echo $b->toString()."\n";
echo $c->toString()."\n";

 実行すると、生成したベクトルが文字列になって表示されます。

Vector: < 1, 2, 3 >
Vector: < 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 >
Vector: < 1, 2, 3 >

 Vectorオブジェクトのメソッドの一部は、次のように自分自身を変更することに注意してください。

$a->scale(2);
echo $a->toString()."\n";////Vector: < 2, 4, 6 >($aが変わる)

 これに対して、Math_VectorOpの静的メソッドは、もとのベクタは変更せずに、新しいベクタを生成します。

$d=Math_VectorOp::scale(2,$c);
echo $c->toString()."\n";//Vector: < 1, 2, 3 >($cは変わらない)
echo $d->toString()."\n";//Vector: < 2, 4, 6 >

 2つのベクタのなす角を返すangleBetweenや外積を返すcrossProductは、Math_Vectorを引数に取ることはできません。

$a = new Math_Vector3(array(1,2,3));
$b = new Math_Vector3(array(4,5,6));
$c = Math_VectorOp::crossProduct($a,$b);
echo $c->toString()."\n";//Vector: < -3, 6, -3 >

 Math_Vector3を使うべき所でMath_Vectorを使うと、たとえ要素数が3であってもエラーになります。

$a = new Math_Vector(array(1,2,3));
$b = new Math_Vector(array(4,5,6));
$c = Math_VectorOp::crossProduct($a,$b);//エラー
echo $c->toString()."\n";

会員登録無料すると、続きをお読みいただけます

新規会員登録無料のご案内

  • ・全ての過去記事が閲覧できます
  • ・会員限定メルマガを受信できます

メールバックナンバー

次のページ
Math_Matrix

この記事は参考になりましたか?

  • X ポスト
  • このエントリーをはてなブックマークに追加
PEARライブラリ活用連載記事一覧

もっと読む

この記事の著者

山田 祥寛(ヤマダ ヨシヒロ)

静岡県榛原町生まれ。一橋大学経済学部卒業後、NECにてシステム企画業務に携わるが、2003年4月に念願かなってフリーライターに転身。Microsoft MVP for Visual Studio and Development Technologies。執筆コミュニティ「WINGSプロジェクト」代表。主な著書に「独習シリーズ(Java・C#・Python・PHP・Ruby・JSP&サーブレットなど)」「速習シリーズ(ASP.NET Core・Vue.js・React・TypeScript・ECMAScript、Laravelなど)」「改訂3版JavaScript本格入門」「これからはじめるReact実践入門」「はじめてのAndroidアプリ開発 Kotlin編 」他、著書多数

※プロフィールは、執筆時点、または直近の記事の寄稿時点での内容です

WINGSプロジェクト 矢吹 太朗(ヤブキ タロウ)

WINGSプロジェクトについて>有限会社 WINGSプロジェクトが運営する、テクニカル執筆コミュニティ(代表 山田祥寛)。主にWeb開発分野の書籍/記事執筆、翻訳、講演等を幅広く手がける。2018年11月時点での登録メンバは55名で、現在も執筆メンバを募集中。興味のある方は、どしどし応募頂きたい。著書記事多数。 RSS X: @WingsPro_info(公式)、@WingsPro_info/wings(メンバーリスト) Facebook

※プロフィールは、執筆時点、または直近の記事の寄稿時点での内容です

この記事は参考になりましたか?

この記事をシェア

  • X ポスト
  • このエントリーをはてなブックマークに追加
CodeZine(コードジン)
https://codezine.jp/article/detail/3162 2008/11/12 14:00

おすすめ

アクセスランキング

アクセスランキング

イベント

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

新規会員登録無料のご案内

  • ・全ての過去記事が閲覧できます
  • ・会員限定メルマガを受信できます

メールバックナンバー

アクセスランキング

アクセスランキング