白旗製作所

スポンサーサイト

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。
  1. --/--/--(--) --:--:--|
  2. スポンサー広告

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
<<真空管とトランジスタのハイブリッドアンプ | ホーム |

コメント

コメントの投稿


管理者にだけ表示を許可する

トラックバック

トラックバック URL
http://dededemio.blog.fc2.com/tb.php/1-ee41c311
この記事にトラックバックする(FC2ブログユーザー)

twitter

プロフィール

dededemio

Author:dededemio
某電機メーカーエンジニア。
真空管からプログラミングまでゆるゆると。

最新記事

最新コメント

最新トラックバック

月別アーカイブ

カテゴリ

Java (8)
未分類 (1)
真空管 (2)
キー配列 (2)
電子回路 (1)
マイコン (1)
PC部品 (2)
VPN (1)
Android (2)
opera (3)
C# (0)
プログラミング (1)
FTP (1)
メール (1)
tex (1)
音源 (2)
Ubuntu (1)
Python (5)
ブログパーツ (1)
GitHub (0)
Gist (1)
Vivaldi (1)
WICED Sense (2)
害虫駆除 (1)
自炊 (0)

検索フォーム

RSSリンクの表示

リンク

このブログをリンクに追加する

QRコード

QR

上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。