3

ArrayFire で仮想ユニットを作成したいのですが、できません。実数行列から複素数行列を作成できますが、それは純粋な虚数ではありません。af_cplx2おそらく、このページの関数を使用できます。私は次のことを考えました:

af_array *R;
const af_array re = 0.0;
const af_array im = 1.0;
af_cplx2(R,re,im,0);

しかし、Visual Studio 2013 でランタイム エラー (未処理の例外) が発生します。どうすればよいですか? 前もって感謝します。

4

3 に答える 3

5

C および C++ API を使用してそれを行う方法を次に示します。ここで API を見つけることができます: http://www.arrayfire.com/docs/group__data__func__constant.htm

// Using C++ API
cfloat h_unit = {0, 1}  // Host side
af::array unit = af::constant(h_unit, 1, c32); // Creates an array of size 1 containing all {0, 1} on device side.

// Using C API
af_array af_unit = 0;
dim_type dims{} = {1};
dim_type ndims = 1;
af_constant_complex(&af_unit, 0, 1, ndims, dims, c32};

この回答は、Christopher Columbus による回答を拡張したものです。

于 2015-05-26T14:44:49.240 に答える
2

cdouble は、std::complex クラスのオブジェクトを作成します。これを使用しても、実際の ArrayFire オブジェクトは作成されません。データ型「c64」の ArrayFire オブジェクトを作成するには、これを使用します。

cdouble i_cdouble = { 0, 1 }; 
array i = constant(i_cdouble,1,1, c64);/* imaginary unit */
printf("\n Creating an imaginary unit, since there is no ArrayFire inbuilt constant.");
af_print(i); 
于 2015-05-29T19:33:38.013 に答える
1

数時間の懸命な作業の後、ここに解決策があります:

cdouble i = { 0, 1 }; /* imaginary unit */
于 2015-05-26T13:56:31.777 に答える