我有一个二维数组,$ a,$存储在device_vector中,索引(p,i)的维数为N和m
我想要计算
$$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);
}
答案 0 :(得分: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中)