限定しりとり

processingで
下のプログラムのクラスの中に、引数を実数値の配列としてベクトルをあたえ、インスタンス変数としてベクトルを配列としては管理するsetVector()というメゾットをつくりたいのですが、どのような形のプログラムにす
ればよいか分かりません。教えてください。

void setup()
{
Vectors ve=new Vectors();
float[] vector={2,9,0,1};
ve=setVector(vector);
}

class Vectors
{
}

A 回答 (3件)

> すみません。

自分でも頭の中が混乱してしまった

うん、まぁ混乱してるのは分かります。
例えば、

> println("内積",ve.naiseki());
> println("コサイン類似度",ve.kosain());
> println("面積",ve.menseki());

この計算はもう一つベクトルが必要なのに、全く無視してる辺りに混乱が伺えますね(笑)。

とは言っても、僕も別にProcessing Expertってワケじゃないし、「他の言語だとこう書くだろうからこういうカンジでしょ」って何となく書いてるだけです。
と言うわけで、お互い「Processing初心者」なんで(笑)、気楽に行きましょう。

// ここから

void setup() {
 Vectors ve1 = new Vectors(2, 9, 0, 1);
 Vectors ve2 = new Vectors(4, 1, 1, 8);
 println("1の大きさ", ve1.vectorsize());
 println("2の大きさ", ve2.vectorsize());
 println("内積", ve1.naiseki(ve2));
 println("コサイン類似度", ve1.cosine(ve2));
 println("面積", ve1.menseki(ve2));
}

class Vectors{
 float[] v;

 Vectors (float... s) {
  v = s;
 }

 float[] foo() {
  return v;
 }

 float vectorsize() {
  int i, n = 0;
  for (i = 0; i < v.length; i++) {
   n += pow(v[i], 2);
  }
  return sqrt(n);
 }

 float naiseki(Vectors u) {
  int i, n = 0;
  for (i = 0; i < v.length; i++) {
   n += v[i] * u.foo()[i];
  }
  return n;
 }

 float cosine(Vectors u){
  return naiseki(u) / (vectorsize() * u.vectorsize());
 }

 float menseki(Vectors u) {
  return 1/2.0 * sqrt(pow(vectorsize(), 2) * pow(u.vectorsize(), 2) - pow(naiseki(u), 2));
 }
}
    • good
    • 0
この回答へのお礼

丁寧に回答して頂きありがとうございました。

お礼日時:2020/10/10 18:30

> ベクトルを配列として管理する



いやいや。
だからクラスを作っちゃえばベクトルはベクトルとして管理されますよ。
「配列として管理する」なら、配列のままでおいておくのがベストです。
それとも、ベクトルを「配列を使って実装してくれ」ってのかしらん。あるいは「配列をベクトルに変換しろ」なんでしょうか。
意味がそれぞれ違うんで、その辺がハッキリせんと何とも言えないでしょう。

> {2,9,0,1}のベクトルの大きさをもとめたくて

このままじゃ配列の大きさは4ですよね。そのまんまです。
ただし。
「ベクトルの大きさ」って何でしょうか。
数学的に言うと、例えばこの場合(4次元のベクトルですよね)、

√(x^2+y^2+z^2+w^2)

です。
配列をそのまんまベクトルに見立てて、って言うのなら、別にベクトル作らんでも要素引っこ抜いて公式にぶち込んで計算すれば済む話ですよね。
    • good
    • 0
この回答へのお礼

すみません。自分でも頭の中が混乱してしまったのですが、最終的に下のように2つの4次元ベクトルのそれぞれの大きさ(√x^2+y^2+z^2+w^2)や内積などを求めたいのですが、このvoid setup に対応するclassの中身はどのようなプログラムにすれば1番良いのか教えて頂きたいです。

void setup()
{
Vectors ve=new Vectors();
float[] vector1={2,9,0,1};
float[] vector2={4,1,1,8};
ve.setVector1(vector1);
ve.setVector2(vector2);
println("1の大きさ",ve.vectorsize1());
println("2の大きさ",ve.vectorsize2());
println("内積",ve.naiseki());
println("コサイン類似度",ve.kosain());
println("面積",ve.menseki());
}

class Vectors
{
}

お礼日時:2020/10/09 17:57

☓メゾット


○メソッド (method)

洋風おじやじゃねぇんだから(笑)。

> ベクトルを配列としては管理する

これちょっと意味が分かりません。
「ベクトルクラスを作る」ってのは「ベクトルをベクトルとして管理できる」から作るわけですよ。
例えばねぇ・・・。
数学で言うとベクトルは成分毎に加算出来たり、内積出来たり外積出来たりする。これは配列そのまんまじゃ「出来ない」事ですよね。でもベクトルを定義する、って事はそこまで面倒無く持っていける、って事なのです。
つまりベクトルを作っても「配列として管理する」ってのはちと意味不明なんですよね。
「何をさせたいか」がもっと明確になってないといけません。
    • good
    • 0
この回答へのお礼

回答ありがとうございます。正しくは「ベクトルを配列として管理する」です。誤字ってしまいました。すみません。{2,9,0,1}のベクトルの大きさをもとめたくてとても大まかにすると下のようにすればいいのかなと思ったのですが、それに付け足してsetVector()メゾット を書かなくてはいけないとおもうのですが、どのようにすればよいのか分かりません……教えていただけませんか。

void setup()
{
Vectors ve=new Vectors();
float[] vector={2,9,0,1};
ve=setVector(vector);
println("大きさ",vectorsize());
}

class Vectors
{
int vectorsize()
{
return ;
}
}

お礼日時:2020/10/09 11:26

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!