2014-09-02 35 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

相关问题