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.-------------------------------------------------------------------//