2011-02-07 15 views
2

この構造コードは、CUDAの書籍のJulia Setの例で見つかりました。私は初心者のCプログラマであり、何をしているのかについて頭を浮かべることはできません。また、Web上で読むために正しいことを見つけ出すこともできません。ここでは構造があります:この構造は実際に何をしていますか?

struct cuComplex { 
    float r; 
    float i; 
    cuComplex(float a, float b) : r(a), i(b) {} 
    float magnitude2(void) { return r * r + i * i; } 
    cuComplex operator*(const cuComplex& a) { 
     return cuComplex(r*a.r - i*a.i, i*a.r + r*a.i); 
    } 
    cuComplex operator+(const cuComplex& a) { 
     return cuComplex(r+a.r, i+a.i); 
    } 
}; 

、それは非常に簡単にこのように呼ばれています:

cuComplex c(-0.8, 0.156); 
cuComplex a(jx, jy); 

int i = 0; 
for (i=0; i<200; i++) { 
    a = a * a + c; 
    if (a.magnitude2() > 1000) 
     return 0; 
} 

return 1; 

ので、コードが何をしましたか?数の実数部と虚数部を与える構造体型 'cuComplex'のものが定義されています。 (-0.8 & 0.156)何が返されていますか? (または構造に配置されていますか?)実際に何が計算され、そこに保持されているかを理解するために、構造体の演算子のロジックをどのように操作しますか?

私はそれはおそらくバックstucture

float magnitude2 (void) { return return r * r + i * i; } 

への再帰呼び出しをやっている、おそらくR用と再び私のために「*」オペレータを呼び出し、その後、これら二つの操作の結果は「+」を呼び出すと思いますオペレーター?これは正しいのですが、各ステップで何が返されますか?

わかりやすく混乱しています。

ありがとうございます!

+1

これはC++のようですが、まずはC++の初心者の本を読んでください:http://stackoverflow.com/questions/388242/the-definitive-c-book-guide-and-list is良いスタートです。その単純なスニペットには、この質問に対する答えとして説明するC++固有の構文が多すぎます。 – Nim

+0

@Nim:役に立たない。彼は何の初心者トピックがありますか? – TheBlastOne

+0

@TheBlastOne、なぜそれがコメントなのです...とにかく、あなたのコメントと同じ時間にオリジナルのコメントを更新しました.. – Nim

答えて

1

あなたが言ったように、cuComplexは、実数(r)と虚数(i)の2つの値を保持しています。 コンストラクタは単にrとiに値を代入します。

*演算子はcuComplex番号で作業しています。乗算と加算の演算子は、2つのcuComplex定数を一緒に乗算する場合にのみ呼び出されます。

これは単純にコードを単純化するためのものです。私はそれはおそらくstucture

float magnitude2 (void) { return return r * r + i * i; } 
に戻す 再帰呼び出しをやっていると思いコード

cuComplex c(-0.8, 0.156); // Create cuComplex instance called c 
cuComplex a(jx, jy); // Create cuComplex instance called a 

int i = 0; 
for (i=0; i<200; i++) { 
    a = a * a + c; // Use the * and + operator of cuComplex 
    if (a.magnitude2() > 1000) 
     return 0; 
} 

return 1; 

については

cuComplex c(-0.8, 0.156); 
cuComplex a(jx, jy); 

// Add, both operations are equivalent. 
cuComplex result1 = cuComplex(c.r + a.r, c.i + a.i); 
cuComplex result2 = c + a; 

:オペレータがなければ、あなたは追加操作を自分で行う必要があります

rとiは浮動小数点ではありません。 *および+演算子は浮動小数点型のためにオーバーロードされていません

1

rおよびifloatと宣言された構造体のメンバーです。 magnitude2関数の式は、標準の浮動小数点演算を、それらのメンバーに格納された値で単純に行います。

構造体に定義されている演算子関数は、*+がstruct型の変数に適用される場合に使用されます(たとえば、a = a * a + c行)。

1

これは、複素数のC++実装であり、加算と乗算のための大きさと演算子のオーバーロードを返すメソッドを提供します。実際の部品(r)と架空の部品(i)は別々に保管されています。あなたもCの構文はほとんど把握(return r * r + i * i;戻りrrプラスii)を持って表示されますので、私はあなたがC/Cへの初心者向けの入門を読むことをお勧め(a.operator*(a)).operator+(c)

++:

a * a + cは、オーバーロードされたメソッドを呼び出します続いて複素数を導入し、次にC++で演算子のオーバーロードを読み込みます。

0

あなたは(あなたがstructを持っている場合でも、この1つは、コンストラクタを持っており、一般的なオブジェクト指向の概念である演算子を再定義)ないCC++としてこの質問にタグを付ける必要があります。

この構造は複素数を定義し、(operator*を介して)乗算し、それらを(operator+を介して)追加し、それらのモジュールを(magnitude2を介して)得る。

ビニング;ある一定の複素数、c、およびa、もう1つの複素数は、という定数ではなく、おそらく座標jxおよびjyによってユーザから与えられます。ループの各反復では、aはそれ自身で多重化され、cがこの結果に追加されます。

ある時点で、aのモジュールが1000より大きい場合、ループは終了します。私はこれがユーザーによって与えられた初期条件に従ってaのモジュールがどのように成長するかを見るためのテストプログラムだと思います。

1

これは単純な構造体ではなく、クラス(基本的には関数を持つ構造体)であり、C++です。

cuComplex c(-0.8, 0.156); 

ここで、彼はこのクラスのインスタンスを作成し、コンストラクタ(クラスのインスタンスフィールドを初期化する特別な関数)を呼び出して2つの値を設定します。

これはおそらく十分ではないので、私はあなたにC++の本を勉強することをお勧めします。あなたがすでにいくつかのプログラミングを知っているなら、Accelerated C++は良い選択です。

1

乗算演算子は、引数aの実数部と虚数部を取り、演算子が呼び出されたオブジェクトの実数部と虚数部を加算し、結果の新しい複素数オブジェクトを返します。

cuComplex operator*(const cuComplex& a) { 
    // first constructor argument is the real part, second is the imaginary part 
    return cuComplex(this->r*a.r - this->i*a.i, this->i*a.r + this->r*a.i); 
} 

同じ加算演算子のために行く:私は明確にするこのポインタを追加しました。再度、タイプcuComplexの新しいオブジェクトのコピーが作成され、返されます。今回は、オブジェクトと引数のそれぞれのフィールドの和の実数部と虚数部です。

cuComplex演算子+(CONST cuComplex & A){ リターンcuComplex(this-> R + a.r、this-> iがa.i + 1)。ループについて }

、虚数が再IM-平面内での回転を生じさせる(それ自体と乗算され、そして一定の虚数Cが大きさまで、各反復で添加されると思われます(lenght)が一定のしきい値を超えています。

演算子*と演算子+は、関数magnitude2()も構造体cuComplexのメンバーであるため、このポインタが利用可能であることに注意してください。

希望に役立ちます。

0

クラスの概念に精通している場合は、「struct」という単語を「class」に置き換えてください。理解しやすくなります。

"class"には2つの変数rとiがあり、2つのfloat args、乗算する演算子、加算する演算子、および大きさを計算する関数を取ります。

0

C++では、単にstd::complex<float>を使用します。

+2

@downvoter:古い回答のdownvoteを説明してください。他人があなたの(不足している)洞察から学ぶことができます –

+1

私はdownvoterではありませんでしたが、もし私が推測する危険があるならば、 NVIDIA CUDAの質問ではなくC++であり、CUDAにはC++標準ライブラリのサポートがありません。 CUDAには 'std :: complex'はありません。 – talonmies

関連する問題