我正在寻找快速做点产品的方法,而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向量(数组)位于不同的类中。 请给我一个更有效率的建议。
提前致谢。
答案 0 :(得分:2)
如果您将列向量a
,b
,c
和d
存储在表单
M = (a b c d)
你可以将问题转化为
ans = M k
其中ans = (ans1 ans2 ans3 ans4)
。这是一个单矩阵向量乘法,BLAS的dgemv
例程是合适的。