2014-09-02 62 views
3

我想用隨機數乘以矩陣的每一行,例如,將矩陣的每一行乘以一個隨機數的最佳方法

Y = R*X 

與含有從rand()條目大小TxN的對角矩陣R和尺寸NxM非常大TN矩陣X。目前我使用

r = rand(T) 
Y = scale(r, X) 

但我不知道這是做得更快還是更好。例如,我認爲沒有必要創建矢量r,但我不知道如何高效/並行地調用y[i] = rand()*X[i,:]

+0

就你而言,創建'r'與調用'scale()'相比,需要多長時間? – 2014-09-02 21:22:27

+0

你一定要創建臨時的'r'。原因是:按行來遍歷'X'是非常低效的,按列遍歷的速度要快5-10倍。因此,在這種情況下,分配臨時的'r',並且按列(即按照存儲器存儲順序)遍歷'X'將是一個巨大的勝利。特別是如果'X'和'r'是'Float32',在這種情況下,這應該SIMD矢量化。 – tholy 2014-09-04 01:44:10

回答

5

您可以使用scale!修改X到位:

julia> X = [ 1/(i + j - 1) for i=1:5, j=1:5 ] 
5x5 Array{Float64,2}: 
1.0  0.5  0.333333 0.25  0.2 
0.5  0.333333 0.25  0.2  0.166667 
0.333333 0.25  0.2  0.166667 0.142857 
0.25  0.2  0.166667 0.142857 0.125 
0.2  0.166667 0.142857 0.125  0.111111 

julia> r = rand(5) 
5-element Array{Float64,1}: 
0.98996 
0.88145 
0.808518 
0.632665 
0.00807468 

julia> scale!(r,X); 

julia> X 
5x5 Array{Float64,2}: 
0.98996  0.49498  0.329987 0.24749  0.197992 
0.440725 0.293817 0.220363 0.17629  0.146908 
0.269506 0.20213  0.161704 0.134753 0.115503 
0.158166 0.126533 0.105444 0.0903807 0.0790832 
0.00161494 0.00134578 0.00115353 0.00100933 0.000897187 

這避免了分配一個新的矩陣,這是在內存和時間的節省顯著。

+0

不錯,+1爲'scale!' – 2014-09-02 21:28:34

+0

Thx。將規模!使用多核? – 2014-09-03 06:08:10

+0

目前它不使用多個內核。 – StefanKarpinski 2014-09-03 12:39:35

相關問題