Parallel processing 将矩阵的每一行乘以一个随机数的最佳方法

Parallel processing 将矩阵的每一行乘以一个随机数的最佳方法,parallel-processing,julia,Parallel Processing,Julia,我想用一个随机数乘以矩阵的每一行,例如 Y = R*X 大小为TxN的对角矩阵R包含来自rand()的条目,大小为NxM的矩阵X非常大T和N。目前我使用 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{Flo

我想用一个随机数乘以矩阵的每一行,例如

Y = R*X
大小为TxN的对角矩阵
R
包含来自
rand()
的条目,大小为
NxM
的矩阵
X
非常大
T
N
。目前我使用

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

这避免了分配新矩阵,这在内存和时间上都是一个显著的节约。

在您的情况下,与调用
scale()
相比,创建
r
需要多长时间?您肯定要创建临时
r
。原因是:按行遍历
X
效率极低,按列遍历速度快5-10倍。所以在这种情况下,分配临时
r
,并按列(即内存存储顺序)遍历
X
,将是一个巨大的胜利。特别是如果
X
r
Float32
,在这种情况下,这应该是SIMD vectorize.nice,+1表示
比例Thx。将扩大规模!使用多核?目前不使用多核。