2015-11-04 33 views
3

我正在尋找快速方法來完成點積,BLAS可以是一個選項。但是有沒有辦法做到不同數組值的點積?在C++中使用BLAS的不同數組的值的點積

例如,讓我們有4個不同的一維陣列,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矩陣,因爲每個一維向量(數組)位於不同的類中。 請給我一個建議,更有效地做到這一點。

在此先感謝。

+0

在編譯時你的值是否已知? – user2296177

+0

這些值在運行時不斷變化,並且無法知道。這就是爲什麼我每次迭代都要將每個值複製到1D數組中。但它需要時間和效率下降... – user270700

回答

1

如果存儲的列向量abcd形式

M = (a b c d) 

可以投問題的2D矩陣M到

ans = M k 

其中ans = (ans1 ans2 ans3 ans4)。這是BLAS的dgemv例程適合的單個矩陣向量乘法。

+0

謝謝你的建議。但是,我忘了寫每個一維數組都位於不同的類中。所以很難做出二維矩陣形式。 – user270700

+0

@ user270700如果你不願意修改你的數據結構,那麼你仍然會以相同數量複製到2D矩陣中。但是你只需要爲整個操作調用一個(更專業的)功能,並且更有可能讓BLAS發揮它的魔力。 – downhillFromHere

+0

是的你是對的。我需要考慮你的建議來修改數據結構。 – user270700