3

次元 N および m のインデックス (p,i) を持つ device_vector に保存された 2 次元配列 $a,$ があります。

計算したい

$$s_{ij} = \sum \limits_{p=1}^{N} a_{p,i} a_{p,j}$$

for $i,j=1,...,m.$ 

スラストを使用してこれを行う簡単な方法はありますか?

上記のコードはラテックスです。C++では、次のようになります

Matrix A(N,m); // filled with data

Matrix S(m,m);

for (int i=0; i <m;++i)
  for (int j=0; j <m;++j) 
   { 
     S(i,j)=0;
     for (int p=0; p < N; ++p)
        S(i,j) += A(p,i)*A(p,j);

   }
4

1 に答える 1

2

私が何かを見逃していなければ、それはそうです

$$s_{ij} = \sum_{p=1}^{N} a_{p,i} a_{p,j} = \sum_{p=1}^{N} a^T_{i,p} a_{p,j}$$

したがって

$$S = A^T A$$

通常のマトリックス製品。また、推力でこれを行うことはできないと思います。しかし、CUBLAS または Arrayfire を使用して行列の乗算を簡単に行うことができます (実際、arrayfire は内部で cublas を使用していると思います)。ただし、これらのライブラリは行列を列優先順で格納することに注意してください (fortran のように)。

于 2012-11-30T21:22:58.817 に答える