ここから本文です

javaのプログラミング問題で質問です。助けてください!

tal********さん

2014/2/919:30:45

javaのプログラミング問題で質問です。助けてください!

以下の問いの答えがよくわかりません。



以下のようなmatrixクラスとvectorクラスがある。Vectorクラスの以下の3つのmethodを完成させよ。

vector型オブジェクトをパラメータとして、自分自身とそのパラメータとの内積を計算し、戻り値とするメソッド

double型オブジェクトをパラメータとして、自分自身とその値との積を計算し、自分自身の値とするメソッド

matrix型オブジェクトmをパラメータとして、自分自身vとその値との積(m・v)を計算し、自分自身の値とするメソッド

public class matrix {

private double a[][]=new double[3][3];

public matrix(double p1, double p2, double p3, double q1, double q2, double q3, double r1,

double r2, double r3) {

a[0][0]=p1; a[0][1]=p2, a[0][2]=p3;

a[1][0]=q1; a[1][1]=q2; a[1][2]=q3;

a[2][0]=r1; a[2][1]=r2; a[2][2]=r3;

}

public double get(int x, int y) { return a[x][y];}

}

public class vector {

private double a, b, c;

public vector(double p1, double p2, double p3) {

a=p1; b=p2; c=p3;

}

public double InProd(vector v){ ① }

public void mul(double a) { ② }

public void mul(matrix m) { ③ }

}

自分自身と計算するというのはどういった意味なのでしょうか?

また、matrixクラスは3次元ベクトル?を表していると思うのですがvectorオブジェクトの3つの値とそれぞれ3ベクトルの内積で合計3つの内積を求めればいいのでしょうか?

内積のきれいな求め方を教えてください。



今日中にわからないといけなく非常に困っております。
初歩的な問題かもしれませんがどうぞよろしくお願いします。

補足追加で申し訳ないのですが三つの値を返す方法も判りません

閲覧数:
713
回答数:
3
お礼:
500枚

違反報告

ベストアンサーに選ばれた回答

e00********さん

2014/2/1015:28:50

できそうな学生に聞きまくるか
教授に質問攻めにするでどうでしょう。

この回答は投票によってベストアンサーに選ばれました!

ベストアンサー以外の回答

1〜2件/2件中

並び替え:回答日時の
新しい順
|古い順

har********さん

2014/2/1111:50:36

「今日中にわからないといけなく」ってことなので手遅れかもしれませんが念のため。

まず[補足]について。
2と3のmul()メソッドはvoidと指定してあるので、値を返す必要はありません(値を返さない指定です)。
で、なぜ計算した結果を返さなくて良いかというのが、「自分自身と計算する」というところに関係します。

mul()メソッドはvectorクラスのオブジェクトに定義されています。
ですので引数、つまり()内に指定されたものとの計算結果を、そのvectorオブジェクトのメソッド実行後の値にする(メソッドの実行によって、オブジェクトの値を変更する)ことを、「自分自身と計算する」という妙な日本語で表現されたのでしょう。

ちなみに、クラス名にvector(Java標準にVectorクラスがあるのに…)を使用したり、メソッドの実行によりオブジェクト自身が変更される(こういうのを「副作用」と呼びます)作りにしたりは、Javaの現場で嫌われる、良くないスタイルの典型です。また変数の名前の付け方も最悪級ですが、クラスの1文字目を大文字、メソッド名を小文字にするのはJavaの基本です(こういうのを無視できる方がJavaを教えているって・・・Orz)。

閑話休題。
「matrixクラスは3次元ベクトル」ではなく、3×3の2次元ベクトル(行列)ですね。行列とベクトル(1次元ベクトル)との計算方法は数学の世界できっちり定義されていますから、「内積のきれいな求め方」という特別なものはなく、
数学での定義にしたがって計算しなければなりません。

で、Vectorクラスは以下のようになります。
class Vector {
private double a, b, c;

public Vector(double p1, double p2, double p3) {
a = p1;
b = p2;
c = p3;
}

public double getA(){return this.a;}
public double getB(){return this.b;}
public double getC(){return this.c;}

public double inProd(Vector v) {
return this.a*v.getA()+this.b*v.getB()+this.c*v.getC();
}

public void mul(double a) {
this.a *= a;
this.b *= a;
this.c *= a;
}

public void mul(Matrix m) {
double ta, tb, tc;
ta = this.a*m.get(0,0)+this.b*m.get(0,1)+this.c*m.get(0, 2);
tb = this.a*m.get(1,0)+this.b*m.get(1,1)+this.c*m.get(1, 2);
tc = this.a*m.get(2,0)+this.b*m.get(2,1)+this.c*m.get(2, 2);
this.a = ta;
this.b = tb;
this.c = tc;
}
}

なお、Vectorクラスの各値はprivate宣言されているため、他のオブジェクトから値を参照するためのメソッドが必要になります。
ここではそれらのメソッドをgetA()、getB()、getC()としています。

また行列との計算では、計算中に自分自身の値を変更することになるため、計算した各データをいったん別の変数に保存しておき、それを全ての計算が終わったあとでそれぞれ代入する必要があります。

kon********さん

編集あり2014/2/1120:58:36

③でvectorは縦ベクトルで、マトリクスを
左からかけるものとしてます。

① return a*v.a+b*v.b+c*v.c;
② this.a*=a,this.b*=a,this.c*=a;

double t_a,t_b,t_c
t_a=a*m.get(0,0)+b*m.get(0,1)+c*m.get(0,2),
t_b=a*m.get(1,0)+b*m.get(1,1)+c*m.get(1,2),
t_c=a*m.get(2,0)+b*m.get(2,1)+c*m.get(2,2);
a=t_a,b=t_b,c=t_c;

追記
>自分自身と計算するというのはどういった意味なのでしょうか?
数学的に定義された計算方法を使って計算するわけです。
自分自身と計算し、結果を自分自身の値と(して再設定)する
と問題文にほぼ書いてます。

>また、matrixクラスは3次元ベクトル?を表していると思うのですが
>vectorオブジェクトの3つの値とそれぞれ3ベクトルの内積で合計3つの
内積を求めればいいのでしょうか?

その通りです。
③ をその方針で書き直してみましょう
vector v0,v1,v2;
double t_a,t_b,t_c;
v0=new vector( m.get(0,0),m.get(0,1),m.get(0,2) );
v1=new vector( m.get(1,0),m.get(1,1),m.get(1,2) );
v2=new vector( m.get(2,0),m.get(2,1),m.get(2,2) ):
t_a= v0.InProd(this),t_b=v1.InProd(this),t_c=v2.InProd(this);
a=t_a,b=t_b,c=t_c;

(vectorクラスのメソッドを定義するエンクロージャ({}内)で
vectorのインスタンス変数やメソッドを使っていますが文法違反でも
なんでもなく正当な方法です)

あわせて知りたい

みんなで作る知恵袋 悩みや疑問、なんでも気軽にきいちゃおう!

Q&Aをキーワードで検索:

Yahoo! JAPANは、回答に記載された内容の信ぴょう性、正確性を保証しておりません。
お客様自身の責任と判断で、ご利用ください。
本文はここまでです このページの先頭へ

「追加する」ボタンを押してください。

閉じる

※知恵コレクションに追加された質問は選択されたID/ニックネームのMy知恵袋で確認できます。

不適切な投稿でないことを報告しました。

閉じる