せっかくなので今更ながらブログ作りました。
ぼちぼちなんか書いていきます。
とりあえず、先日作ったJava用の行列計算クラスでも置いておきます。
行列型のようなもので、内部に2次元配列と、入出力メソッド、
積和、転置、逆、行列式等、基本的な行列演算メソッドを備えています。
なぜJavaで作ったのかは謎。
こちらにお世話になりました。
http://blogtool.flatlabs.net/source.html
もうちょっとインデント調整できないかな。
ダウンロードはこちらから。↓
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.-------------------------------------------------------------------//