使用C ++中的BLAS来计算来自不同数组的值的乘积

时间:2015-11-04 02:44:56

标签: c++ pointers blas

我正在寻找快速做点产品的方法,而BLAS可以作为一种选择。但有没有办法快速做出不同数组值的点积?

例如,让4个不同的1D数组,a,b,c,d

a = {1, 2, 3, 4}
b = {5, 6, 7, 8}
c = {9, 10, 11, 12}
d = {13, 14, 15, 16}

还有另一个数组

k = {1, 2, 3, 4}

我想做的是计算

ans1 = a[0]*k[0] + b[0]*k[1] + c[0]*k[2] + d[0]*k[3];
ans2 = a[1]*k[0] + b[1]*k[1] + c[1]*k[2] + d[1]*k[3];

依旧......

大量时间执行相同的计算,但由于每次迭代都可以更改所有数组中的值。 我试图在BLAS中使用ddot并以某种方式使用指针但是没有做到。 有没有办法使用ddot而不分配另一个数组并将值复制到它,如

e[0]=a[0];    e[1]=b[0];    e[2]=c[0];    e[3]=d[0];

然后,

ans = ddot(4, e, 1, k, 1); 

另外很难将其作为2D矩阵,因为每个1D向量(数组)位于不同的类中。 请给我一个更有效率的建议。

提前致谢。

1 个答案:

答案 0 :(得分:2)

如果您将列向量abcd存储在表单

的二维矩阵M中
M = (a  b  c  d)

你可以将问题转化为

ans = M k

其中ans = (ans1 ans2 ans3 ans4)。这是一个单矩阵向量乘法,BLAS的dgemv例程是合适的。