- PR -

クラスと配列

1
投稿者投稿内容
初心者のひと
会議室デビュー日: 2006/10/18
投稿数: 3
投稿日時: 2006-10-18 22:10
はじめまして。
研究の都合でJavaプログラムが必要となり最近勉強を始めました。
複素数行列の逆行列を求めるアルゴリズムを作っていて、
複素数の配列が必要になり、そこが一向にうまくいきません。
複素数クラスとしては

import java.text.*;
import java.io.*;
import java.lang.Math;

class Complex1{
double re, im;



void print(){
if (this.im == 0){
System.out.println(this.re);
} else {
System.out.println(this.re + "+j" + this.im);
}
}
Complex1 add(Complex1 a){
Complex1 ans = new Complex1();
ans.re = 0.0;
ans.im = 0.0;
ans.re = this.re + a.re;
ans.im = this.im + a.im;
return(ans);
}
Complex1 mult(Complex1 a){
Complex1 ans = new Complex1();
ans.re = 0.0;
ans.im = 0.0;
ans.re = this.re * a.re - this.im * a.im;
ans.im = this.re * a.im + this.im * a.re;
return(ans);
}
Complex1 sub(Complex1 a){
Complex1 ans = new Complex1();
ans.re = 0.0;
ans.im = 0.0;
ans.re = this.re - a.re + this.im - a.im;
ans.im = this.re - a.re + this.im - a.im;
return(ans);
}
Complex1 div(Complex1 a){
Complex1 ans = new Complex1();
ans.re = 0.0;
ans.im = 0.0;
ans.re = (this.re * a.re + this.im * a.im) / (a.re * a.re + a.im * a.im);
ans.im = (this.im * a.re - this.re * a.im) / (a.re * a.re + a.im * a.im);
return(ans);
}
Complex1 abs(){
Complex1 ans = new Complex1();
ans.re = 0.0;
ans.im = 0.0;
ans.re = Math.sqrt(this.re * this.re + this.im * this.im);
ans.im = 0;
return(ans);
}

}


を作りました。
これを使い、メインプログラムで複素数配列を宣言したいです。
例えば、配列要素 x[i][j] が、2つの成分
(実数成分x[i][j].reと虚数成分x[i][j].im)を持つようにしたいのです。 

ためしに無理やり
public static void main(String args[]){
Complex x[] = new complex[]();

と書いてみたらもれなくエラーが出てしまいました。
あれこれ考えてみましたが、どうしても先に進めません。

まだいろいろと文献なども読み進める予定ですが、何かアイディア的なものはないでしょうか?
アドバイスいただきたく書き込みさせていただきました。
よろしくお願いいたします。
初心者のひと
会議室デビュー日: 2006/10/18
投稿数: 3
投稿日時: 2006-10-19 01:54
今一つ妥協案が浮かびました

配列の列数を行数の2倍にして、実数部分と虚数部分に分けて格納する方法です。
ある複素数があった時、a[i][j]に実数部分を、a[i][N+j]に虚数部分を格納する感じです。

ただ、これだとプログラム上で演算が煩雑になってしまう気がします。
例えば、ある2つの複素数の乗算なら

c[i][j] = a[i][j]*b[i][j] - a[i][N+j]*b[i][N+j]
c[i][N+j] = a[i][j]*b[i][N+j] + a[i][N+j]*b[i][j]

となってしまい、かなり見難いプログラムになってしまうので・・・
やはり複素数クラスも作ったしなんとか複素配列を定義したいです。

解かりづらい質問ですいません。
会議室デビュー日: 2006/10/17
投稿数: 13
投稿日時: 2006-10-19 01:55
まず、Javaでは配列の領域を確保しなければなりません。
それから、配列の要素にオブジェクトをいれます。

それにしても、なぜJava言語なのですか。
計算処理だけなら、R言語十分では?

後、
Pythonは、Complexのライブラリーを標準でもっていますよ。
Lisp系、Haskell等もありますが。
小僧
ぬし
会議室デビュー日: 2002/08/14
投稿数: 526
投稿日時: 2006-10-19 02:00
2次元配列を使用する場合は
コード:
		Complex1[][] x = new Complex1[2][2];

		x[0][1] = new Complex1();

		System.out.println(x[0][1].im);
		System.out.println(x[0][1].re);


こういった形の宣言になります。
ちなみにこういったこともできますよ。
コード:
		Complex1[][] x2 = { 
					{ new Complex1(), new Complex1() },
					{ new Complex1(), new Complex1() } 
				};
		System.out.println(x2[1][1].im);


初心者のひと
会議室デビュー日: 2006/10/18
投稿数: 3
投稿日時: 2006-10-21 21:27
狂さん、小僧さん>
お陰で解決しました!
ご丁寧に有り難うございます。
まだちょっと難航しそうな感はありますが、、、どうにかなりそうです。
有り難う御座いました。
1

スキルアップ/キャリアアップ(JOB@IT)