我想用隨機數乘以矩陣的每一行,例如,將矩陣的每一行乘以一個隨機數的最佳方法
Y = R*X
與含有從rand()
條目大小TxN
的對角矩陣R
和尺寸NxM
與非常大T
和N
矩陣X
。目前我使用
r = rand(T)
Y = scale(r, X)
但我不知道這是做得更快還是更好。例如,我認爲沒有必要創建矢量r
,但我不知道如何高效/並行地調用y[i] = rand()*X[i,:]
。
我想用隨機數乘以矩陣的每一行,例如,將矩陣的每一行乘以一個隨機數的最佳方法
Y = R*X
與含有從rand()
條目大小TxN
的對角矩陣R
和尺寸NxM
與非常大T
和N
矩陣X
。目前我使用
r = rand(T)
Y = scale(r, X)
但我不知道這是做得更快還是更好。例如,我認爲沒有必要創建矢量r
,但我不知道如何高效/並行地調用y[i] = rand()*X[i,:]
。
您可以使用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
這避免了分配一個新的矩陣,這是在內存和時間的節省顯著。
不錯,+1爲'scale!' – 2014-09-02 21:28:34
Thx。將規模!使用多核? – 2014-09-03 06:08:10
目前它不使用多個內核。 – StefanKarpinski 2014-09-03 12:39:35
就你而言,創建'r'與調用'scale()'相比,需要多長時間? – 2014-09-02 21:22:27
你一定要創建臨時的'r'。原因是:按行來遍歷'X'是非常低效的,按列遍歷的速度要快5-10倍。因此,在這種情況下,分配臨時的'r',並且按列(即按照存儲器存儲順序)遍歷'X'將是一個巨大的勝利。特別是如果'X'和'r'是'Float32',在這種情況下,這應該SIMD矢量化。 – tholy 2014-09-04 01:44:10