matlab モジュール

matlab モジュールでは、Matlabアプリケーションを呼び出し、操作とそれを補助するためのクラスをそろえています。
matlab モジュールにあるクラスを呼び出すには、require関数を使います。

例えば
    var {Matlab} = require("matlab");

    #.m{
    %%out A
    A = [1+2*i 3+4*i; 5, 6];
    disp(A);
    }#

    print(Matlab.result());
以下の説明で Matlab, MxVar が現れたら、
  var {Matlab} = require("matlab");
  var {MxVar} = require("matlab");
  または
  var {Matlab, MxVar} = require("matlab");
でセットされた クラスであることに留意してください。

Matlab オブジェクト ...

  数値計算ソフト「Matlab」を操作するためのオブジェクトです。

Matlabと「m」領域
  MatlabをJavaScriptから簡単に扱うために、「m」領域を組み込んでいる。(DSL\m.jsに実装)

例:
  var A = [1,2,3];
  var scalar = 5;

  #.m{
  %%inp A, scalar
  %%out OUT
  OUT = scalar * A;
  }#
  
  print(OUT);      //     5    10    15
  print(OUT(1,1).$); //  5
  print(OUT(1,2).$); // 10
  print(OUT(1,3).$); // 15

  #.m{ ... }# で囲まれた「m」領域に、Matlabで実行されるコードが書かれます。
  この「m」領域は以下の手順で実行されます。

  (1) Matlabオブジェクトがなければ、内部で require('matlab')を実行してMatlabをロードする。

  (2) 先頭の%%inpに宣言してある JavaScript変数をMatlab変数へ変換する。
    この変換は各変数について
      Matalab.setVar("変数",変数);
    を実行する。

  (3) %%宣言の後のコードをMatlabで実行する。

  (4) 先頭の%%outに宣言してある Matlab変数をJavaScript変数へ変換する。
    この変換は各変数について
      変数 = Matalab.getVar("変数");
    を実行する。
 

Matlab : プロパティ・関数・・・リスト
clearVar関数 Matlab変数を消去
createMatrix関数 数値行列を作成
createSparse関数 数値行列を作成
eval関数 文字列内の式の評価
existVar関数 変数の存在判定
getVar関数 変数値のオブジェクトを取得
result関数 Matlabの実行出力文字列を取得
run関数 プログラムMファイルを実行
setVar関数 プログラムMファイルを実行

clearVar 関数 Matlab...

Matlab変数を消去

Matlab.clearVar( var )

引数
var : String or Matlab.MxVar
Matlab変数名 または Matlab.MxVarオブジェクト。複数を渡すことも可能。
var {Matlab} = require("matlab");

#.m{
A = [1,2,3];
disp(A);
}#
print(Matlab.result());
/*
     1     2     3
*/

Matlab.clearVar("A");
#.m{
disp(A);
}#
print(Matlab.result());
/*
??? 'A' は未定義の関数、または変数です
*/

createMatrix 関数 Matlab...

行列作成

Matlab.createMatrix( vname, mx ) : Matlab.MxVar
Matlab.createMatrix( vname, [x1,x2, ...,xn] ) : Matlab.MxVar
Matlab.createMatrix( vname, [x11,x12, ..., x1n], ..., [xm1,xm2, ..., xmn] ) : Matlab.MxVar
Matlab.createMatrix( vname, M ) : Matlab.MxVar
Matlab.createMatrix( vname, M, N ) : Matlab.MxVar

引数
vname : String
Matlab変数名。
mx : Matrix or Matlab.MxVar
行列オブジェクトまたはMatlab.MxVarオブジェクト。
[x1,x2, ...,xn] : (Number or Complex or Boolean or String)の配列
[x11,x12, ..., x1n], ..., [xm1,xm2, ..., xmn] : (Number or Complex or Boolean or String)の配列のリスト
行列の行ベクトル。(原則として各要素の型はすべて同じであること)
M : Integer
行列の行数。
N : Integer
行列の列数。
返値
作成された行列を操れるオブジェクトを返します。作成に失敗したらnullを返します。
参照
createSparse関数
var {Matlab} = require("matlab");

// var A = Matlab.createMatrix("A",[Math.cos(th),-Math.sin(th)], [-Math.sin(th),Math.cos(th)]);
var A = Matlab.createMatrix("A",2,2);
var th = Math.PI/3;
A(1,1).$ = Math.cos(th); A(1,2).$ = -Math.sin(th);
A(2,1).$ = A(1,2).$;     A(2,2).$ = A(1,1).$;

Matlab.setVar("A",A);
#.m{
disp(A);
}#

print(Matlab.result());
/* 
    0.5000   -0.8660
   -0.8660    0.5000
*/

// var B = Matlab.createMatrix("B",[1,[1,1]], [[1,-1],1]);
var B = Matlab.createMatrix("B",2,2, Matlab.COMPLEX);
B(1,1).$ = 1;      B(1,2).$ = [1,1];
B(2,1).$ = [1,-1]; B(2,2).$ = 1;

print(B);
/*
   1.0000             1.0000 + 1.0000i
   1.0000 - 1.0000i   1.0000          
*/

createSparse 関数 Matlab...

行列を作成

Matlab.createSparse( vname, mx ) : Matlab.MxVar
Matlab.createSparse( vname, [[i1,j1,x1],[i2,j2,x2],...,[in,jn,xn]], [M,N] ) : Matlab.MxVar
Matlab.createSparse( vname, M, N ) : Matlab.MxVar

引数
vname : String
Matlab変数名。
mx : Matrix or Matlab.MxVar
行列オブジェクト または Matlab.MxVarオブジェクト。
[[i1,j1,x1],[i2,j2,x2],...,[in,jn,xn]] : Array of [Integer,Integer,(Number/Complex/Boolean)]
非零要素の行列要素位置とその値を指定。
M : Integer
行列の行数を指定します。
N : Integer
行列の列数を指定します。
返値
作成された疎行列を操れるオブジェクトを返します。作成に失敗したらnullを返します。
参照
createMatrix関数
var {Matlab} = require("matlab");

var A = Matlab.createSparse("A",50,50);
for (var c=1; c<=50; c++) {
  if (c>1) A(c-1,c).$ = c-1;
  A(c,c).$ = c;
  if (c<50) A(c+1,c).$ = c+1;
}
/*
var elms = [];
for (var c=1; c<=50; c++) {
  if (c>1) elms.push([c-1,c, c-1]);
  elms.push([c,c, c]);
  if (c<50) elms.push([c+1,c, c+1]);
}
var A = Matlab.createSparse("A",elms,[50,50]);
*/
print(A);
/*
   (1,1)        1
   (2,1)        2
   (1,2)        1
   (2,2)        2
   (3,2)        3
          ・
          ・
  (49,49)      49
  (50,49)      50
  (49,50)      49
  (50,50)      50
*/

eval 関数 Matlab...

文字列内の式の評価

Matlab.eval( cmdexpr ) : String

引数
cmdexpr : String
Matlabが実行できる式やコマンドを含んだ文字列を与えます。
返値
Matlabが実行されて吐き出される文字列を返します。
参照
run関数
var {Matlab} = require("matlab");

var A = [1,2,3];
var scalar = 5;

Matlab.setVar("A",A);
Matlab.setVar("scalar",scalar);

var ret = Matlab.eval("OUT=scalar * A");

print(ret);
/*
OUT =

     5    10    15
*/

existVar 関数 Matlab...

変数の存在判定

Matlab.existVar(varname) : Boolean

引数
varname : String
変数名。
返値
変数があればtrueを返します。なければfalseを返します。
参照
getVar関数, setVar関数

getVar 関数 Matlab...

変数値のオブジェクトを取得

Matlab.getVar( varname ) : Matlab.MxVar

引数
varname : String
変数名。
返値
変数の行列オブジェクトを返します。
参照
setVar関数, existVar関数
var {Matlab} = require("matlab");

#.m{
A = [1,2,3];
}#

print(Matlab.existVar("A"));	// true
print(Matlab.existVar("B"));	// false

var A = Matlab.getVar("A");
print(A);	//     1     2     3
print(A(1).$);	// 1
print(A(2).$);	// 2
print(A(3).$);	// 3

result 関数 Matlab...

Matlabの実行出力文字列を取得

Matlab.result() : String

返値
run,eval関数の最後の実行出力文字を返します。
var {Matlab} = require("matlab");

var A = [1,2,3];
var scalar = 5;

Matlab.setVar("A",A);
Matlab.setVar("scalar",scalar);

Matlab.eval("OUT=scalar * A");

print(Matlab.result());
/*
OUT =

     5    10    15
*/

run 関数 Matlab...

プログラムMファイルを実行

Matlab.run( mfile ) : String

引数
mfile : String
プログラムMファイル名。
返値
プログラムMファイルの実行時に吐き出された文字列を返します。
参照
eval関数, result関数
[test.m]
OUT = scalar * A;

[JavaScript]
var {Matlab} = require("matlab");

Matlab.setVar("A",[1,2,3]);
Matlab.setVar("scalar",5);

Matlab.run("d:/work/test.m");

var OUT = Matlab.getVar("OUT");
print(OUT); //     5    10    15

setVar 関数 Matlab...

Matlab変数へ値をセット

Matlab.setVar( vname, value ) : Boolean

引数
vname : String
Matlab変数名。
value
セットする値。
value : Boolean or Number or Complex or Stringなら、その値がセットされる。
value : Matlab.MxVar なら、その行列がセットされる。
value : [x1,x2,...,xN] 各xi:Number なら、1xN 実数行列がセットされる。
value : [x11,x12,...,x1N], [x21,x22,...,x2N], ..., [xM1,xM2,...,xMN]
     各xij:Number なら、MxN 実数行列がセットされる。
value : [[x11,y11],[x12,y12],...,[x1N,y1N]], [[x21,y21],[x22,y22],...,[x2N,y2N]], ..., [[xM1,yM1],[xM2,yM2],...,[xMN,yMN]]
     各xij,yij:Number なら、MxN  複素行列がセットされる。
   
返値
Matlab変数へ値がセットできたらtrueを返します。失敗したらfalseを返します。
参照
getVar関数, eval関数, run関数
var {Matlab} = require("matlab");
var {Complex} = require("mathex");

Matlab.setVar("A",1.23);
Matlab.setVar("B","string");
Matlab.setVar("C",[1,2,3]);
Matlab.setVar("D",[1,2],[3,4]);
Matlab.setVar("E",[[1,2],[2,3]],[[3,4],[4,5]]);
Matlab.setVar("Z",Complex(1,1));

#.m{
A
B
C
D
E
Z
}#

print(Matlab.result());
/*
A =

    1.2300


B =

string


C =

     1     2     3


D =

     1     2
     3     4


E =

   1.0000 + 2.0000i   2.0000 + 3.0000i
   3.0000 + 4.0000i   4.0000 + 5.0000i


Z =

   1.0000 + 1.0000i
*/

MxVar クラス ...

Matlabの行列を扱うクラスです。
基本型である実数値や文字列、そして複素数値は 1x1型の行列として扱っています。

MxVar : プロパティ・関数・・・リスト
().$ 値の設定と取得
get関数 値を取り出す
isComplex関数 複素数タイプかどうかの判定
isDouble関数 倍精度タイプかどうかの判定
isEmpty関数 空かどうかの判定
isIntX関数 整数タイプかどうかの判定
isLogical関数 論理値タイプかどうかの判定
isNumeric関数 数値タイプかどうかの判定
isSingle関数 単精度タイプかどうかの判定
isSparse関数 疎行列かどうかの判定
isString関数 文字列かどうかの判定
isUintX関数 符号なし整数タイプかどうかの判定
set関数 値の設定
sizes関数 行列サイズを取得
toMatrix関数 Matlab行列をOgO行列へ変換
toString関数 文字列化

().$ MxVar...

値の設定と取得

設定
mxvar().$ = value
mxvar( i ).$ = value
mxvar( i, j ).$ = value
取得
v = mxvar().$
v = mxvar( i ).$
v = mxvar( i, j ).$

引数
i, j : Integer
引数なしの場合、i=j=1と同じ。
(i,j) の場合、i行j列の要素を指示しています。
(i) の場合、行列の要素を(1,1),(2,1),...,(M,1),(M,2),....とカウントしてi番目の要素を指示しています。ただし、Mは行サイズ。
解説
[設定]
mxarry().$=value : mxarry.set(value)
mxarry(i).$=value : mxarry.set(i,value)
mxarry(i,j).$=value : mxarry.set(i,j,value)
と同じになります。
[取得]
v = mxarry().$ : v = mxarry.get()
v = mxarry(i).$ : v = mxarry.get(i)
v = mxarry(i,j).$ : v = mxarry.get(i,j)
と同じになります。
参照
get, set
// Matalabをロード
var {Matlab} = require("matlab");

//var A = Matlab.createMatrix("A", [1,2],[2,3],[3,4]);
var A = Matlab.createMatrix("A",3,2);
A(1,1).$ = 1; A(1,2).$ = 2;
A(2,1).$ = 2; A(2,2).$ = 3;
A(3,1).$ = 3; A(3,2).$ = 4;

#.m{
%%inp A
%%out B

B = A - 1;
}#

print(B);
/*
     0     1
     1     2
     2     3
*/
print(B(1,1).$, B(1,2).$); // 0 1
print(B(2,1).$, B(2,2).$); // 1 2
print(B(3,1).$, B(3,2).$); // 2 3

get 関数 MxVar...

値を取り出す

mxvar.get() : Value
mxvar.get(i) : Value
mxvar.get(i, j) : Value

引数
i, j : Integer
引数なしの場合、i=j=1と同じ。
(i,j) の場合、i行j列の要素を指示しています。
(i) の場合、行列の要素を(1,1),(2,1),...,(M,1),(M,2),....とカウントしてi番目の要素を指示しています。ただし、Mは行サイズ。
返値
mxvarが数値型行列なら、指定位置の数値(Number型)を返します。
mxvarが複素数型行列なら、指定位置の複素数(Complexオブジェクト)を返します。
mxvarが論理型行列なら、指定位置の論理値(true, false) を返します。
mxvarが文字列型行列なら、指定位置の文字列(String型)を返します。
参照
().$, set
#.m{
%%out A,B,C,D
A = 1.23;
B = 'string';
C = [1,2,3; 4,5,6];
D = [1+2i,3+4i];
}#

//print(A().$);
print(A.get()); // 1.23

//print(B().$);
print(B.get()); // string

//print(C(1,1).$,C(1,2).$,C(1,3).$,'\n',
//        C(2,1).$,C(2,2).$,C(2,3).$);

print(C.get(1,1),C.get(1,2),C.get(1,3),'\n',
        C.get(2,1),C.get(2,2),C.get(2,3));
/*
1 2 3
 4 5 6
*/

//print(D(1,1).$,D(1,2).$);
print(D.get(1,1),D.get(1,2)); // 1 + 2 i   3 + 4 i

isComplex 関数 MxVar...

複素数タイプかどうかの判定

mxvar.isComplex() : Boolean

返値
mxvarが複素数型行列ならtrue, そうでなければfalseを返します。
#.m{
%%out A, B
A = [1 2; 3 4];
B = [1+2i 3+4i; 5, 6];
}#

print(A.isComplex());	// false
print(B.isComplex());	// true

isDouble 関数 MxVar...

倍精度タイプかどうかの判定

mxvar.isDouble() : Boolean

返値
mxvarが倍精度タイプ数値型行列ならtrue, そうでなければfalseを返します。
参照
isSingle関数
#.m{
%%out A, B, C
A = [1 2; 3 4];
B = [1+2i 3+4i; 5, 6];
C = int32(A+B);
}#

print(A.isDouble());	// true
print(B.isDouble());	// true
print(C.isDouble());	// false

isEmpty 関数 MxVar...

空かどうかの判定

mxvar.isEmpty() : Boolean

返値
mxvarが サイズ0x0の行列ならtrue, そうでなければfalseを返します。
#.m{
%%out A, B, C
A = [1 2; 3 4];
B = [];
}#

print(A.isEmpty());	// false
print(B.isEmpty());	// true

isIntX 関数 (X=8,16,32) MxVar...

整数タイプかどうかの判定

mxvar.isInt() : Boolean
mxvar.isInt8() : Boolean
mxvar.isInt16() : Boolean
mxvar.isInt32() : Boolean

返値
mxvarが X(=8,16,32)ビット符号つき整数行列ならtrue, そうでなければfalseを返します。
isInt関数では、mxvar.isInt8() || mxvar.isInt16() || mxvar.isInt32() の結果を返します。
#.m{
%%out A, B, C
A = [1 2; 3 4];
B = [1+2i 3+4i; 5, 6];
C = int32(A+B);
}#

print(A.isInt32());	// false
print(B.isInt32());	// false
print(C.isInt32());	// true

isLogical, isBoolean 関数 MxVar...

論理値タイプかどうかの判定

mxvar.isLogical() : Boolean
mxvar.isBoolean() : Boolean

返値
mxvarが 論理値型行列ならtrue, そうでなければfalseを返します。
#.m{
%%out A, B
A = [1 2; 3 4];
B = A>2;
}#

print(A.isLogical());	// false
print(B.isLogical());	// true

isNumeric 関数 MxVar...

数値タイプかどうかの判定

mxvar.isNumeric() : Boolean

返値
mxvarが 数値行列ならtrue, そうでなければfalseを返します。
参照
isLogical関数, isString関数
#.m{
%%out A, B, C, D, E, F
A = [1 2; 3 4];
B = [1+2i 3+4i; 5, 6];
C = int32(A+B);
D = 'string';
E = [true,false];
}#

print(A.isNumeric());	// true
print(B.isNumeric());	// true
print(C.isNumeric());	// true
print(D.isNumeric());	// false
print(E.isNumeric());	// false

isSingle 関数 MxVar...

単精度タイプかどうかの判定

mxvar.isSingle() : Boolean

返値
mxvarが単精度タイプ数値型行列ならtrue, そうでなければfalseを返します。
参照
isDouble関数
#.m{
%%out A, B, C, D, E, F
A = [1 2; 3 4];
B = [1+2i 3+4i; 5, 6];
C = single(A);
D = single(B);
}#

print(A.isSingle());	// false
print(B.isSingle());	// false
print(C.isSingle());	// true
print(D.isSingle());	// true

isSparse 関数 MxVar...

疎行列かどうかの判定

mxvar.isSparse() : Boolean

返値
mxvarが疎行列ならtrue, そうでなければfalseを返します。
参照
createSparse 関数
#.m{
%%out A, B
A = [1,2];

B = sparse(50,50,150);
B(1,1) = 1;	B(1,2) = 2;
B(2,1) = 1;	B(2,2) = 2;	B(2,3) = 3;
B(3,2) = 2;	B(3,3) = 3;	B(3,4) = 4;
}#

print(A.isSparse());	// false
print(B.isSparse());	// true

isString 関数 MxVar...

文字列かどうかの判定

mxvar.isString() : Boolean

返値
mxvarが文字列型行列ならtrue, そうでなければfalseを返します。
参照
isNumeric関数, isLogical関数
#.m{
%%out A, B
A = 'string';
B = [1, 2];
}#

print(A.isString());	// true
print(B.isString());	// false

isUintX 関数 (X=8,16,32) MxVar...

符号なし整数タイプかどうかの判定

mxvar.isUint() : Boolean
mxvar.isUint8() : Boolean
mxvar.isUint16() : Boolean
mxvar.isUint32() : Boolean

返値
mxvarが X(=8,16,32)ビット符号なし整数行列ならtrue, そうでなければfalseを返します。
isUint関数では、mxvar.isUint8() || mxvar.isUint16() || mxvar.isUint32() の結果を返します。
#.m{
%%out A, B, C
A = [1 2; 3 4];
B = [1+2i 3+4i; 5, 6];
C = uint32(A+B);
}#

print(A.isUint32());	// false
print(B.isUint32());	// false
print(C.isUint32());	// true

set 関数 MxVar...

値の設定

mxvar.set( value )
mxvar.set( i, value )
mxvar.set( i1, i2, value )

引数
i, j : Integer
引数なしの場合、i=j=1と同じ。
(i,j) の場合、i行j列の要素を指示しています。
(i) の場合、行列の要素を(1,1),(2,1),...,(M,1),(M,2),....とカウントしてi番目の要素を指示しています。ただし、Mは行サイズ。
value : Boolean or Number or Complex(Array) or String
設定する値。
配列 [re,im] は、複素数 Complex(re,im)に変換されてます。
解説
行列の指定位置の要素をvalueにセットします。ただし、mxvarは型をもっているので、valueをその型に変更してセットされます。
参照
().$, get
var {Matlab} = require("matlab");

// var A = Matrix([1,2],[2,3],[3,4]);
var A = Matlab.createMatrix("A",3,2);
A.set(1,1,1); A.set(1,2,2);
A.set(2,1,2); A.set(2,2,3);
A.set(3,1,3); A.set(3,2,4);

#.m{
%%inp A
%%out B

B = A - 1;
}#

print(B);
/*
     0     1
     1     2
     2     3
*/

sizes 関数 MxVar...

行列サイズを取得

mxvar.sizes() : Array

返値
行列のサイズを 配列[行サイズ, 列サイズ]形式で返す。
#.m{
%%out A
A = [1 2 3
     4 5 6 ];
}#

var [M,N] = A.sizes();
print("rownum of A = " + M);
print("colnum of A = " + N);
/*
rownum of A = 2
colnum of A = 3
*/

toMatrix 関数 MxVar...

Matlab行列をOgO行列へ変換

mxvar.toMatrix() : Matrix

返値
mxvarの値を OgOの行列へ変換し そのMatrixオブジェクトを返します。
ただし、Matlabの文字列型など変換できないものは, nullを返します。
また、作成された行列のベースindexは 1となっているので、行列要素のindex指定は同じです。。
var {Matrix} = require('mathex');

#.m{
%%out A, B
A = [1, 2.4; 3,4];
}#

var AA = A.toMatrix();

print( AA instanceof Matrix ); // true

print(AA);
/*
[2,2]
       1     2.4
       3       4
*/

print(AA.base); // 1
print(AA(1,1).$, AA(1,2).$); // 1  2.4
print(AA(2,1).$, AA(2,2).$); // 3  4

toString 関数 MxVar...

文字列化

mxvar.toString() : String

返値
mxvarを値にもつ変数で disp(変数)をMatlabで実行したとき表示される文字列を返します。
var {Matlab} = require("matlab");

#.m{
%%out A
A = [1+2i 3+4i; 5, 6];
disp(A);
}#

print(Matlab.result());
/*
   1.0000 + 2.0000i   3.0000 + 4.0000i
   5.0000             6.0000          
*/
print(A.toString());
/*
   1.0000 + 2.0000i   3.0000 + 4.0000i
   5.0000             6.0000          
*/