matrix コマンドに加え、Originは行列オブジェクトデータの特定の操作を実行するXファンクションを提供します。このセクションでは、行列オブジェクトデータを操作するのに使用される利用可能なXファンクションのサンプルを紹介します。
行列のセルの値は、matrix -v コマンドまたは msetvalue Xファンクションのどちらかを使ってセットできます。matrix -v コマンドはアクティブな行列オブジェクトのみを操作しますが、Xファンクションはどの行列シートの値でも設定できます。
このサンプルは行列の値をセットして、行列ウィンドウにイメージサムネールを表示する方法を示します。
// 行列ブックを作成 mat:=1; int nmats = 10; range msheet=1!; // 行列オブジェクトの値をセット msheet.Nmats = nmats; // 最初の行列オブジェクトに値をセット matrix -v x+y; range mm=1; mm.label$="x+y"; double ff=0; // 他のオブジェクトをループ loop(i, 2, nmats-1) { msheet.active = i; ff = (i-1)/(nmats-2); // 値をセット matrix -v (5/ff)*sin(x) + ff*20*cos(y); // ロングネームをセット ange aa=$(i); aa.label$="$(5/ff,*3)*sin(x) + $(ff*20)*cos(y)"; } // 乱数の値で最後の1つを入力 msheet.active = nmats; matrix -v rnd(); range mm=$(nmats); mm.label$="random"; // ウィンドウにサムネールを表示 matrix -it;
mcopy Xファンクションは行列データを コピー する時に使用します。
// mbook1から別の行列 mbook2にデータをコピー mcopy im:=mbook1 om:=mbook2; // このコマンドはコピー先の次数を自動設定
2つのXファンクション、 m2v と v2mは、それぞれ行列データをベクターに、ベクターデータを行列に変換する時に利用できます。Originは、行列を保存するために行を主とした順番を使いますが、どちらの関数も列を主とした順番を指定することができます。
// 行列全体を列ごとにワークシート列にコピー m2v method:=m2v direction:=col; // col(1) からデータを指定した行列オブジェクトにコピー v2m ix:=col(1) method:=v2row om:=[Mbook1]1!1;
Originでは、行列はイメージデータ(RGBなど)または数値データ(整数値など)を含むことができます。次の関数は2つのフォーマット間を変換する際に利用できます。
// グレースケール画像を数値データに変換 img2m img:=mat(1) om:=mat(2) type:=byte; // 数値行列をグレースケール画像に変換 m2img bits:=16;
複素数値を持つ行列を操作するXファンクションには map2c, mc2ap, mri2c, mc2riがあります。これらのXファンクションは、2つの行列(振幅と位相や実数と虚数)を1つの複素行列に統合したり、1つの複素行列を振幅/位相や実数/虚数成分に分けます。
// 振幅と位相を複素データに組合せる map2c am:=mat(1) pm:=mat(2) cm:=mat(3); // 異なる行列の実数と虚数を新しい行列の複素データに組合せる mri2c rm:=[MBook1]MSheet1!mat(1) im:=[MBook2]MSheet1!mat(1) cm:=<new>; // 複素数を振幅と位相を持つ2つの新しい行列に変換 mc2ap cm:=mat(1) am:=<new> pm:=<new>; // 複素数を実数部と虚数部の2つの行列オブジェクトに変換 mc2ri cm:=[MBook1]MSheet1!Complex rm:=[Split]Real im:=[Split]Imaginary;
次のXファンクションを使って、物理的に行列の次数または内容を変更します。以下の変換では、行列オブジェクトの反転を除き、行列シートの次数が変更し、同一行列ブック内の他のマトリックスオブジェクトにも変更が加えられます。
行列が行列内にイメージを含む場合、Xファンクション mcrop は、行列の矩形領域を抽出またはコピーするのに使うことができます。
// 左から10ピクセル、上から20ピクセルの位置から開始し // 50×25のイメージ行列をコピー mcrop x:=10 y:=20 w:=50 h:=25 im:=<active> om:=<input>; // <input> はコピー // 行列の中央部を新しい行列に抽出 // 行列ウィンドウがアクティブであること matrix -pg DIM px py; dx = nint(px/3); dy = nint(py/3); mcrop x:=dx y:=dy h:=dy w:=dx om:=<new>; // <new> は抽出
Xファンクション mexpand は、指定した列と行の係数を使って、データ行列を拡張できます。複二次補間を使って、新しいセルの値を計算します。
// アクティブ行列を係数2で拡張 mexpand cols:=2 rows:=2;
Xファンクション mflip は行列を水平方向または垂直方向に反転し、その行列の対称な行列を作成します。
// 行列を垂直に反転 mflip flip:=vertical; // "matrix" コマンドも使用可能 matrix -c h; // 水平に matrix -c v; // 垂直に
Xファンクション mrotate90を使って、行列を90/180度時計回りまたは反時計回りに回転できます。
// 行列を 90 度時計回りに回転 mrotate90 degree:=cw90; // "matrix" コマンドでも90度回転可能 matrix -c r;
Xファンクション mshrink は、指定した列と行の係数を使って、データ行列を縮小できます。
// アクティブな行列を列の係数2、行の係数1で縮小 mshrink cols:=2 rows:=1;
Xファンクション mtranspose は行列を転置するのに使用することができます。
// [MBook1]MSheet1!の2番目の行列オブジェクトを転置 mtranspose im:=[MBook1]MSheet1!2; // "matrix" コマンドを使って行列転置も可能 matrix -t;
imgRGBsplit Xファンクションはカラー画像を別々のR, G, B チャンネルに分割します。例えば:
// チャンネルを分割して、赤、緑、青の別々の行列を作成 imgRGBsplit img:=mat(1) r:=mat(2) g:=mat(3) b:=mat(4) colorize:=0; // チャンネルを分割して、赤、緑、青のパレットを結果行列に適用 imgRGBsplit img:=mat(1) r:=mat(2) g:=mat(3) b:=mat(4) colorize:=1;
イメージの取扱いについての詳細は、イメージ処理のXファンクション をご覧ください。
行列の中間解析操作を実行するたびに、Xファンクションの出力のために新しい行列ブックを作成したくない場合があります。中間出力のために非表示の行列ブックに一時的な行列を作成し、不要になったときは次の操作で行列ブックを削除できます。
この例では、画像の中間操作の結果を一時的な行列ブックに保存し、削除する方法を示します。
//画像を行列ブックにインポート string fn$=system.path.program$ + "Samples\Image Processing and Analysis\white camellia.jpg"; impImage fname:=fn$; //非表示行列ブックを作製 newbook hidden:=1 mat:=1; %A = bkname$; //自動レベル操作を実行し、非表示の行列ブックに出力を保存 imgAutoLevel oimg:=[%A]1! cl:=<optional>; //自動レベル操作の画像に中央値フィルタを適用 imgMedian d:=3 img:=[%A]1! oimg:=<new>; //中間行列を削除 win -cd %A;
この例では、メディアンフィルタが行列に適用され、最小値が差し引かれた後に体積が計算されます。すべての中間行列の結果は非表示の一時的な行列ブックに保存され、行列ブックが不要になった時点で削除されます。
//サンプルの行列ブックを開く string fn$=system.path.program$ + "Samples\Matrix Conversion and Gridding\2D Gaussian.ogm"; doc -o %(fn$); //一時的な非表示の行列ブックを作製 newbook hidden:=1 mat:=1; %A = bkname$; range rm = [%A]1!; //2つの中間行列結果を受け取るために2つの行列オブジェクトを追加 rm.nmats = 2; //行列にメディアンフィルタを適用 medianflt2 n:=3 po:=RepeatPadding om:=[%A]1!mat(1); //最小値を減算 msetvalue im:=[%A]1!mat(2) formula:="mat(1)-z0" script:="double z0; mstats im:=mat(1) min:=z0;"; //行列を積分 double dv; integ2 im:=[%A]1!mat(2) integral:=dv; win -cd %A;