1

ベクトル コンポーネントを配列で乗算しようとするとエラーが発生します (要素単位の乗算またはブロードキャスト)。ドキュメントは、このオーバーロードされた * のケースが問題ないことを示しています。

AFAPI 配列 演算子* (const float &lhs, const array &rhs)
2 つの配列、または配列と値を乗算します。(定数配列&、定数配列&)

しかし、以下のエラー メッセージによるとvect(0)、サイズが一定になるように、さらに平坦化または縮小する必要があるのではないでしょうか?

エラーステートメントは明らかです:

引数 1 の次元が無効です予期された: ldims == 乗り物


以下はコードです:

#include <arrayfire.h>

int main(int argc, char *argv[])
{
    int device = argc > 1 ? atoi(argv[1]) : 0;
    af::setDevice(device);
    af::info();

    int n = 3;
    int N = 5;

    // Create the arrays:
    af::array matrix = af::constant(0,n,n,f32); // 3 x 3 float array of zeros
    af::array vect = af::seq(1,N); // A col vector of floats: {1.0, ... ,5.0}

    // Show the arrays:
    af_print(matrix);
    af_print(vect);

    // Print a single component of the vector:
    af_print(vect(0));

    // This line produces the error (see below):
    af_print(vect(0) * matrix); // Why doesn't this work?

    // But somthing like this is fine:
    af_print(1.0 * matrix);

    return 0;
}

出力の生成:

ArrayFire v3.3.2
ATI Radeon HD 6750M

行列
[3 3 1 1]
0.0000 0.0000 0.0000
0.0000 0.0000 0.0000
0.0000 0.0000 0.0000

ベクトル
[5 1 1 1]
1.0000
2.0000
3.0000
4.0000
5.0000

vect(0)
[1 1 1 1]
1.0000

マトリックス = [3 3 1 1]、および vect(0) = [1 1 1 1] に対する af_print() の dims() 出力は疑わしいですが、さらに平坦化する方法がわかりません。この例は、ArrayFire API を使用する一般的な方法であると考える人もいるでしょう。

スローされるエラー例外は次のとおりです。

libc++abi.dylib: タイプ af::exception のキャッチされない例外で終了します: ArrayFire 例外 (無効な入力サイズ: 203): 関数 getOutDims 内 ファイル src/backend/ArrayInfo.cpp:173
引数 1 の無効な次元 予期される: ldims == 乗り物
関数内 af::array af::operator*(const af::array &, const af::array &)


明確にするためにユース ケースを追加します 。実際には、coeff(k) * (3 次元配列 Z の 2 次元スライス) の合計によって最終的な配列を構築しています。

for (int j = 0; j<indx.dims(0); ++j)
  final += coeff(indx(j)) * Z(af::span,af::span,indx(j));

の使用を検討しますgforが、最初は正しい数値出力を得たいだけでした。ベクトル: は事前定義されていることにも注意してくださいindex。たとえば、index = {1, 2, 4, 7, ...}要素は必ずしも連続しているとは限りません。これにより、特定の用語を選択できます。

4

2 に答える 2