白旗製作所

MATLABからjavaクラス、jarファイルを扱う

ちょっと便利そうだな-と思い、MATLABからjavaクラスを呼び出してみたので方法をメモしておきます。

参考:http://www.mathworks.co.jp/jp/help/matlab/matlab_external/creating-and-using-java-objects.html
MATLAB-高度なソフトウェア開発-外部プログラミング言語インターフェイス-Java ライブラリ-javaオブジェクトの作成と使用
http://lunran.sakura.ne.jp/wordpress/category/matlab/
Matlab - Lunran Studio


①javaクラスをmatlabが対応しているバージョンでビルドしておきます。
以下のコマンドでmatlabが対応しているjavaバージョンを調べます。
version -java

その後、eclipseのプロジェクト→プロパティ→Java Build Path→ライブラリー→JREシステム・ライブラリー
の実行環境を、上記バージョンに変更してビルドしておきます。

②コンストラクタを初期化メソッドにしておきます。
javaクラスにコンストラクタがあると、うちの環境では以下の様なエラーを吐いて使えなかったので、
No constructor ClassName with matching signature found

コンストラクタは初期化メソッドに代替しておきます。
private void ClassName()
{
  ...
}


③.classファイルのあるパスをダイナミッククラスパスに追加します。(jarファイルも同様)
javaclasspath('C:\workspace\ClassTest\bin\');

以下のコマンドでダイナミッククラスパスに追加されたかを確認しておきます。
javaclasspath

④使用例1:クラスをインスタンス化してみます。
instanceName = javaObject('ClassName');
以下の方法でもOKです。
instanceName = ClassName;

④使用例2:クラスのメソッドを使用してみます。
return_value = javaMethod('methodName', instanceName, arg1, arg2, arg3);
以下の方法でもOKです。
return_value = instanceName.methodName(arg1, arg2, arg3);


これでjavaクラスもMATLABで使いまわせるようになりました。
  1. 2014/08/29(金) 11:44:46|
  2. Java
  3. | トラックバック:0
  4. | コメント:0

eclipseのエディタ設定

eclipseのエディタの設定を自分好みに少し設定変更したのでメモしておきます。
#eclipseのバージョンはKepler Service Release 2です。

変更点は
①行番号表示をさせる。
②フォントを等幅フォントにする。
の2点です。

eclipseはデフォルトでconsolasというフォントになっていましたが、
日本語(全角)が英数字(半角)2文字と等幅にならず、ずれてしまうため、
ずれないようにMeiryoKe_Consoleという別のフォントを利用します。
また、太文字も等幅で表示させるため、JStyleというプラグインも入れます。



①エディタの行番号表示
メニューバー→ウインドウ→設定→一般→エディター→テキスト・エディター
→『行番号の表示』のチェックを入れる。

②等幅フォントの導入
全角・半角にかかわらず等幅なフォントとして、MeiryoKe_Consoleを導入します。

1.
JStyleをインストール。
http://mergedoc.sourceforge.jp/index.html#/jstyle.html

2.
メニューバー→ウインドウ→設定→一般→JStyle
→『太字を通常文字と同じ幅で表示する』にチェックを入れる。
+ついでに、『改行』『タブ』『全角スペース』にチェックを入れ、『タブ』のマークを『^』に変更。

3.
以下HPを参考に、MeiryoKe_Consoleフォントを作成してインストール。
http://pc-zero.jp/technic/meiryoke_console.html


4.
メニューバー→ウインドウ→設定→一般→外観→色とフォント
→『Java Editor Text Font』と『Javadoc display font』を
 MeiryoKe_Consoleの10ポイントに設定。


以上を設定すると下図のような感じの表示になり、
日本語コメントだろうが、キーワードの太文字だろうが等幅で行番号とともに表示されるようになります。

新しいビットマップ イメージ

  1. 2014/04/30(水) 20:26:10|
  2. Java
  3. | トラックバック:0
  4. | コメント:0

Javaで行列演算

せっかくなので今更ながらブログ作りました。
ぼちぼちなんか書いていきます。

とりあえず、先日作ったJava用の行列計算クラスでも置いておきます。
行列型のようなもので、内部に2次元配列と、入出力メソッド、
積和、転置、逆、行列式等、基本的な行列演算メソッドを備えています。
なぜJavaで作ったのかは謎。

こちらにお世話になりました。
http://blogtool.flatlabs.net/source.html
もうちょっとインデント調整できないかな。


ダウンロードはこちらから。↓
Matrix.java_jpn
Matrix.java_eng



public class Matrix{

//内部で扱われる2次元配列
private double[][] matrix;

//コンストラクタ(行列サイズの初期化)
public Matrix(int rowSize, int columnSize)
{
matrix = new double[rowSize][columnSize];
}

//------------------------------------------------------------------------//
// メッセージ関数 //
//------------------------------------------------------------------------//
//行サイズを取得
public int getRowSize()
{
return matrix.length;
}

//列サイズを取得
public int getColumnSize()
{
return matrix[0].length;
}

//行列のサイズを取得
public int[] getSize()
{
int[] size = {matrix[0].length, matrix.length};
return size;
}

//行列の要素を取得
public double get(int row, int column)
{
return matrix[row][column];
}
//行列の値を設定
public double[][] get()
{
return matrix;
}

//行列の要素に値を設定
public void set(int row, int column, double value)
{
matrix[row][column] = value;
}
//行列の値を設定
public void set(double[][] value)
{
matrix = value;
}

//行列のある行の値を取得
public double[] getRow(int row)
{
return matrix[row];
}

//行列のある行に値を設定
public void setRow(int row, double[] value)
{
matrix[row] = value;
}

//行列のある列の値を取得
public double[] getColumn(int column)
{
return matrix[column];
}

//行列のある列に値を設定
public void setColumn(int column, double[] value)
{
matrix[column] = value;
}

//行列の値を表示
public void print( String name )
{
int i,j,row, column;
row = getRowSize();
column = getColumnSize();

System.out.println( name + "= " ) ;

for( i=0; i<row; i++ ){
System.out.print( " " ) ;
for( j=0; j<column; j++ ){
System.out.print( matrix[i][j] + " " ) ;
}
System.out.println("");
}
}

//------------------------------------------------------------------------//
// 行列の演算関数群 //
//------------------------------------------------------------------------//
//行列の和
public Matrix plus(Matrix target)
{
int i,j,row, column;
row = getRowSize();
column = getColumnSize();
Matrix result = new Matrix(row,column);

for( i=0; i<row; i++ ){
for( j=0; j<column; j++ ){
result.set(i, j, (matrix[i][j]+target.get(i,j)) );
}
}
return result;
}
public Matrix plus(double value)
{
int i,j,row, column;
row = getRowSize();
column = getColumnSize();
Matrix result = new Matrix(row,column);

for( i=0; i<row; i++ ){
for( j=0; j<column; j++ ){
result.set(i, j, (matrix[i][j]+value) );
}
}
return result;
}

//行列の差
public Matrix minus(Matrix target)
{
int i, j, row, column;
row = getRowSize();
column = getColumnSize();
Matrix result = new Matrix(row,column);

for( i=0; i<row; i++ ){
for( j=0; j<column; j++ ){
result.set(i, j, (matrix[i][j]-target.get(i,j)) );
}
}
return result;
}
public Matrix minus(double value)
{
int i, j, row, column;
row = getRowSize();
column = getColumnSize();
Matrix result = new Matrix(row,column);

for( i=0; i<row; i++ ){
for( j=0; j<column; j++ ){
result.set(i, j, (matrix[i][j]-value) );
}
}
return result;
}

//行列の積
public Matrix multiply(Matrix target)
{
int i, j, k, row, column;
double temp;

row = getRowSize();
column = getColumnSize();
Matrix result = new Matrix(row,row);

for( i=0; i<row; i++ ){
for( j=0; j<row; j++ ){
temp = 0;
for ( k=0; k<column; k++ ){
temp += matrix[i][k] * target.get(k,j);
}
result.set(i, j, temp);
}
}
return result;
}
public Matrix multiply(double value)
{
int i, j, row, column;
row = getRowSize();
column = getColumnSize();
Matrix result = new Matrix(row,column);

for( i=0; i<row; i++ ){
for( j=0; j<column; j++ ){
result.set(i, j, (matrix[i][j]*value) );
}
}
return result;
}

//各々の配列要素の積
public Matrix multiplyEach(Matrix target)
{
int i, j, row, column;
row = getRowSize();
column = getColumnSize();
Matrix result = new Matrix(row,column);

for( i=0; i<row; i++ ){
for( j=0; j<column; j++ ){
result.set(i, j, (matrix[i][j]*target.get(i, j)) );
}
}
return result;
}

//割り算
public Matrix division(double value)
{
int i, j, row, column;
row = getRowSize();
column = getColumnSize();
Matrix result = new Matrix(row,column);

for( i=0; i<row; i++ ){
for( j=0; j<column; j++ ){
result.set(i, j, (matrix[i][j]/value) );
}
}
return result;
}

//転置行列
public Matrix transpose()
{
int i, j, row, column;
row = getRowSize();
column = getColumnSize();
Matrix result = new Matrix(row,column);

for( i=0; i<row; i++ ){
for( j=0; j<column; j++ ){
result.set(i, j, matrix[j][i]);
}
}
return result;
}

//行列式
public double determinant()
{
int row, column;
row = getRowSize();
column = getColumnSize();

//正方行列でない
if(row != column){ return 0.0; }
//行列が1*1
else if(row == 1){ return matrix[0][0]; }
//行列が2*2
else if(row == 2){ return (matrix[0][0]*matrix[1][1]-matrix[0][1]*matrix[1][0]); }
//行列が3*3以上
else{
int i;
double det=0;
Matrix cofactorMatrix = new Matrix(row-1,column-1);

for( i=0; i<row; i++ ){
cofactorMatrix = spritMatrix(i,0);
if( i%2 == 0) det += matrix[i][0]*cofactorMatrix.determinant();
else det -= matrix[i][0]*cofactorMatrix.determinant();
}
return det;
}
}

//逆行列
public Matrix inverse()
{
int i, j, row, column;
row = getRowSize();
column = getColumnSize();
Matrix result = new Matrix(row,column);

for( i=0; i<row; i++ ){
for( j=0; j<column; j++ ){
if( (i+j)%2 == 0) result.set(i, j, spritMatrix(i,j).determinant() );
else result.set(i, j, (-1)*spritMatrix(i,j).determinant() );
}
}
return result.transpose().division(determinant());
}

//行列の要素を指定すると、その行・列を排除した行列を返す
private Matrix spritMatrix(int row, int column)
{
int i, j, m=0, n=0;
int rowSize = getRowSize();
int columnSize = getColumnSize();
Matrix result = new Matrix(rowSize-1,columnSize-1);

m=0;
for( i=0; i<rowSize; i++ ){
if(i!=row){
n=0;
for( j=0; j<columnSize; j++ ){
if(j!=column){
result.set(m, n, matrix[i][j]);
n++;
}
}
m++;
}
}
return result;
}
}
//file end.-------------------------------------------------------------------//

  1. 2012/12/10(月) 23:31:40|
  2. Java
  3. | トラックバック:0
  4. | コメント:0
前のページ